Ошибка компиляции при попытке доступа к StructuredBuffer

Я хочу получить доступ к StructuredBuffer<int>в вычислительном шейдере, но я получаю ошибку:

Ошибка шейдера в Particle.compute: массив, матрица, вектор или индексируемый тип объекта, ожидаемый в выражении индекса в Particle.compute(28) (на d3d11)

Код:

#pragma kernel CSMain
#include "Assets/Uplus/ZCommon/Resources/ImageProcessing/UplusDirectCompute.cginc"

struct Particle
{
    float3 Position;
    float Mass;
};

Texture2D<float2> _terTx;

ConsumeStructuredBuffer<Particle> currentBuffer;
AppendStructuredBuffer<Particle> nextBuffer;
StructuredBuffer<int> particleCount;

float3 _terPos;
float _terSize, _terPhysicalScale, _resolution;

SamplerState _LinearClamp;
SamplerState _LinearRepeat;

#define _gpSize 512

[numthreads(_gpSize, 1, 1)]
void CSMain(uint3 dispatchID : SV_DispatchThreadID)
{
    int flatID = dispatchID.x;
    int particleCount = particleCount[0];

    if (flatID >= particleCount) return;

    Particle particle = currentBuffer.Consume();

    //Commented the rest of code

    nextBuffer.Append(particle);
}

Ошибка указывает на линию int particleCount = particleCount[0];, Это почему?

Вся идея шейдера в том, что у нас есть два буфера. Мы заполняем один с некоторыми данными (мы называем каждый из них Particle) из процессора, а затем в шейдере потребляют данные из буфера, обрабатывают их и затем добавляют в другой буфер. затем мы меняем буферы и делаем еще одну итерацию. particleCount буфер содержит текущий счетчик Particles, что буфер содержит и if пункт не позволяет потреблять больше частиц, чем доступно.

1 ответ

Это старый вопрос, поэтому я предполагаю, что вы его решили, но все равно вот ответ:

Вы объявляете ParticleCount как int, когда он уже является буфером.

Либо измените имя на int currentParticleCount = particleCount[0]; или просто не используйте временную переменную:

      if (flatID >= particleCount[0]) return;
Другие вопросы по тегам