如何在directx11着色器中使用swizzle .rrrg

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

我必须在directx9到directx11中创建一个等效格式为D3DFMT_A8L8的纹理。但是文档中的说明对我来说并不清楚。有人会解释应该做什么吗?在创建输入布局时,我面临无效参数错误。

D3DFMT_A8L8 => DXGI_FORMAT_R8G8_UNORM注意:在着色器中使用swizzle .rrrg复制红色并将绿色移动到alpha组件以获得Direct3D 9行为。

c++ directx-11 directx-9 texture2d dxgi
1个回答
0
投票

在Direct3D 9中,“亮度”格式将自动在着色器中作为RGB值(复制)读取,因为它们是灰度格式。在Direct3D 10+中,没有“Luminance”格式。有一种和两种频道格式,它们没有“特殊行为”。

因此,在着色器中,DXGI_FORMAT_R8G8_UNORM纹理将具有“r”通道中的第一个通道和“g”通道中的第二个通道。 DXGI_FORMAT_R8G8_UNORM具有与D3DFMT_A8L8相同的内存足迹,即两个无符号正常整数数据的8位通道,但如果您希望现代着色器中的行为与旧的着色器匹配,则必须使用着色器swizzles明确地执行此操作:

Texture2D<float4> Texture : register(t0);
sampler Sampler : register(s0);

float4 color = Texture.Sample(Sampler, pin.TexCoord);

// Special-case for DXGI_FORMAT_R8G8_UNORM treated as D3DFMT_A8L8
color = color.rrrg;

这与输入布局没有任何关系。这就是纹理采样器的工作方式。

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