计算着色器:为什么 return float4?

Compute Shaders: Why return float4?

已编辑问题:

我有一个 ID3D11Texture2DID3D11UnorderedAccessView 格式 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 位非范数的类型转换?

原问题:

我最初尝试了着色器

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 的资源 return 类型与绑定到计算着色器单元 (UNORM) 的无序访问视图插槽 0 的资源类型不兼容).

虽然 unorm 与 uint 不兼容,但改变了我的问题。但是查克的回答让我意识到我这样做是错误的。

如何编写着色器来设置内存中的位而不进行任何类型转换?

由于您指定了 _UNORM 的格式,因此 0.0 到 1.0 的结果浮点值将映射到 0 到 255。

如果您使用 _SNORM_UINT_SINT.

,则确切的映射会有所不同

一个 DXGI_FORMAT_R8G8B8A8_UNORM 着色器应该 return 一个 float4.

我真的没想到会这样。但是,如果您认为 GPU 是为 32 位计算而设计的,而显示器只有 32 位支持每个像素,则需要一个从 float4DXGI_FORMAT_R8G8B8A8 的内置转换器。

这也绊倒了其他人: