Войти
UnityФорумОбщее

Не понятная ошибка в Compute Shader

#0
17:01, 18 апр 2016

Здравствуйте! Помогите пожалуйста исправить ошибку в простейшем шейдере. Сам текст ошибки в комментарии в шейдере.
Вот код:

#pragma kernel CSMain

RWTexture2D<float4> Result;
uniform RWStructuredBuffer <float3> buffer;
[numthreads(8,8,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{       
        //buffer[0]=float3(2.0,22.0,44.0); // если эта строка работает, то все нормально, данные помещаются в буффер
        buffer[0]=float3(id.x,22.0,44.0);       // а вот в этой строке выдает такую ошибку: race condition writing to shared resource detected, consider making this write conditional
}
 

и часть скрипта:

editor.cs = Resources.Load("test1") as ComputeShader;
        editor.cs.SetBuffer(0, "buffer", editor.buffer);
        editor.cs.Dispatch(0, 8, 8, 1);
        float[] args = new float[] { 0, 0, 0, 0 };
        editor.buffer.GetData(args); 
#1
17:28, 18 апр 2016

В первом случае все нормально потому, что независимо от количества потоков в индексе 0 будет одно и тоже значение.
Во втором - много потоков пишут уникальные данные и определить какое в итоге будет записано - нереально.
Поэтому тебе нужно переделать систему так, чтобы в один индекс писал только один поток.

Для теста можно сделать так:

#pragma kernel CSMain

RWTexture2D<float4> Result;
uniform RWStructuredBuffer <float3> buffer;
[numthreads(8,8,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{       
uint index = id.x+8*id.y;

if(index==0)
buffer[0]=float3(id.x,22.0,44.0); 
// или
buffer[index]=float3(id.x,22.0,44.0); 
}
#2
17:56, 18 апр 2016

Ошибки не выдало в id.x был 0, хотя может быть так и должно быть.
Я просто один шейдер для тайлинга текстуры пытаюсь переделать в Compute shader, вот и разбираюсь с этим. Буффер был просто для отладки. Посмотреть как выглядят id.x, id.y
там вот такие строки есть:

  float w, h;
  texCopy.GetDimensions(w, h); //  texCopy это RenderTexture 
  float2 uv = float2(id.x/w, id.y/h);
float2 tileScaledTex = uv * _TileMappingScale * (1.0/_TileScale); // у _TileMappingScale  и _TileScale значения тайлинга и масштаба
float dy=ddy(tileScaledTex); //а вот здесь выдается ошибка:'ddx': no matching 2 parameter intrinsic function

Получается чтобы получить правильное значение tileScaledTex тоже нужно применять что-то подобное: uint index = id.x+8*id.y;  ?

UnityФорумОбщее

Тема в архиве.