来自纹理的 HLSL ComputeShader 样本表现异常
HLSL ComputeShader Sample from a texture behave strange
嗨!
我有一个计算着色器:
[numthreads(128, 1, 1)]
void csAdvect(uint2 dtid : SV_DispatchThreadID)
{
uint4 dtl = uint4(dtid, 0, 0);
float2 inverseSize = float2(1.0f / gridSize.x, 1.0f / gridSize.y);
float2 coord = float2(dtid.x*inverseSize.x, dtid.y*inverseSize.y);
float statict = statictemp.Load(dtl).x;
if (statict < 0)statict = 0;
float t = temperature.SampleLevel(zeroBoundarySampler, coord, 0).x;
outputTemperature[dtid] = statict + t;
}
它是从静态纹理单元中读取的,对另一个进行采样并将其写入输出纹理。裸样。
纹理和 gridSize 是 512x512,我用 Dispatch(4, 512, 1) 调用它,在每个渲染步骤中我交换温度和输出温度纹理。
我认为它会做一些类似从静态点开始的圆形增长,但它只是从右向下增长。
左上角的 blackish/redish 是静态的 'heat',红色较浅的是来自着色器的温度。
知道我做错了什么吗?
所以所有关于坐标系变换...
如果你有一个 512x512 的纹理,纹理可以作为一个从 0,0 到 511,511 的数组采样,所以如果你想让它缩放到 0,0 到 1,1,你需要用 511 而不是 512 进行除法!愚蠢的错误,但很难找到...
嗨!
我有一个计算着色器:
[numthreads(128, 1, 1)]
void csAdvect(uint2 dtid : SV_DispatchThreadID)
{
uint4 dtl = uint4(dtid, 0, 0);
float2 inverseSize = float2(1.0f / gridSize.x, 1.0f / gridSize.y);
float2 coord = float2(dtid.x*inverseSize.x, dtid.y*inverseSize.y);
float statict = statictemp.Load(dtl).x;
if (statict < 0)statict = 0;
float t = temperature.SampleLevel(zeroBoundarySampler, coord, 0).x;
outputTemperature[dtid] = statict + t;
}
它是从静态纹理单元中读取的,对另一个进行采样并将其写入输出纹理。裸样。 纹理和 gridSize 是 512x512,我用 Dispatch(4, 512, 1) 调用它,在每个渲染步骤中我交换温度和输出温度纹理。
我认为它会做一些类似从静态点开始的圆形增长,但它只是从右向下增长。 左上角的 blackish/redish 是静态的 'heat',红色较浅的是来自着色器的温度。
知道我做错了什么吗?
所以所有关于坐标系变换...
如果你有一个 512x512 的纹理,纹理可以作为一个从 0,0 到 511,511 的数组采样,所以如果你想让它缩放到 0,0 到 1,1,你需要用 511 而不是 512 进行除法!愚蠢的错误,但很难找到...