我有一个ID3D11Texture2D
和ID3D11UnorderedAccessView
,格式为DXGI_FORMAT_R8G8B8A8_UNORM
和着色器
RWTexture2d<float4> tex: register(u0);
[numthreads(32, 32, 1)]
void main(uint3 dtid : sv_dispatchthreadid)
{
float r;
...
tex[dtid.xy] = float4(r, 0.0f, 0.0f, 0.0f);
}
我假设我们必须编写8位unorm浮点数。
这是否意味着从32位浮点数到8位unorms的类型转换?
我最初尝试着色器
RWTexture2D<uint> tex: register(u0);
[numthreads(32, 32, 1)]
void main(uint3 DTid : SV_DispatchThreadID)
{
tex[DTid.xy] = 0xFF0000FF;// I actually tried and got white with 0xFF << 24 + 0xFF but I realized they are not the same.
}
但是当我意识到出现错误时:
着色器代码(UINT)中声明的组件0的资源返回类型与绑定到Compute Shader单元(UNORM)的Unordered Access View插槽0的资源类型不兼容。
尽管unorm与uint不兼容,并改变了我的问题。但是查克的回答使我意识到我这样做是错误的。
如何编写无需设置任何类型转换的着色器即可设置内存中的位?
由于您指定了_UNORM
的格式,所以结果浮点值0.0到1.0将映射到0到255。
如果使用_SNORM
,_UINT
与_SINT
,则精确的映射会有所不同。