计算着色器。为什么是RWTexture2d<float4>?

问题描述 投票: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位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?

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

由于你指定了一个格式为 _UNORM 产生的浮点数0.0到1.0将被映射到0到255。

如果您使用的是 _SNORM, _UINT 与。_SINT.

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