我有一个 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位unorm有一个类型转换?
我最初试过用着色器
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.
}
但当我意识到是得到了错误。
在着色器代码中声明的0号组件的资源返回类型(UINT)与计算着色器单元(UNORM)的Unordered Access View槽0的资源类型不兼容.
虽然unorm与uint不兼容,并改变了我的问题。但是Chuck的回答让我意识到我这样做是错误的。
我如何写一个不需要任何类型转换就能在内存中设置位的shader?
由于你指定了一个格式为 _UNORM
产生的浮点数0.0到1.0将被映射到0到255。
如果您使用的是 _SNORM
, _UINT
与。_SINT
.