Compute Shaders:为什么使用RWTexture2d ?

问题描述 投票:0回答:1

编辑后的问题:

我有一个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位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不兼容,并改变了我的问题。但是查克的回答使我意识到我这样做是错误的。

如何编写无需设置任何类型转换的着色器即可设置内存中的位?

directx gpgpu hlsl gpu-programming compute-shader
1个回答
0
投票

由于您指定了_UNORM的格式,所以结果浮点值0.0到1.0将映射到0到25​​5。

如果使用_SNORM_UINT_SINT,则精确的映射会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.