计算着色器:为什么 return float4?
Compute Shaders: Why return float4?
已编辑问题:
我有一个 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 位非范数的类型转换?
原问题:
我最初尝试了着色器
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 位支持每个像素,则需要一个从 float4
到 DXGI_FORMAT_R8G8B8A8
的内置转换器。
这也绊倒了其他人:
已编辑问题:
我有一个 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 位非范数的类型转换?
原问题:
我最初尝试了着色器
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 位支持每个像素,则需要一个从 float4
到 DXGI_FORMAT_R8G8B8A8
的内置转换器。
这也绊倒了其他人: