因此,我在着色器中声明我的根描述符,并且遇到了一种情况,我想将纹理数组作为根描述符,但 HLSL 给了我这个错误:
error X4614: RootSignature verification failed: A Shader is declaring a resource object as a texture using a register mapped to a root descriptor SRV (ShaderRegister=0, RegisterSpace=0). SRV or UAV root descriptors can only be Raw or Structured buffers.
纹理数组是否不允许作为根描述符根描述符,或者如果我想这样做,我必须有一个我自己绘制的纹理?下面是我正在处理这个问题的着色器:
#define PI_F 3.14159265358979323846264338327950288419716939f
Texture2DArray screenTexArrays : register(t0);
SamplerState screenTexSampler : register(s0);
struct PixelInput
{
float4 pos : SV_Position;
float4 uvds : TEXCOORD0;
};
cbuffer uniformsCB : register(b1)
{
uint4 dwNumPlayers;
};
[RootSignature(
"RootFlags( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |"\
" DENY_HULL_SHADER_ROOT_ACCESS |"\
" DENY_DOMAIN_SHADER_ROOT_ACCESS |"\
" DENY_GEOMETRY_SHADER_ROOT_ACCESS ),"\
" SRV( t0, space = 0, visibility=SHADER_VISIBILITY_PIXEL ),"\
" RootConstants( num32BitConstants=4,"\
" b1,"\
" space = 0,"\
" visibility=SHADER_VISIBILITY_PIXEL ),"\
" StaticSampler( s0,"\
" filter=FILTER_MIN_MAG_MIP_POINT,"\
" addressU = TEXTURE_ADDRESS_CLAMP,"\
" addressV = TEXTURE_ADDRESS_CLAMP,"\
" addressW = TEXTURE_ADDRESS_CLAMP,"\
" visibility = SHADER_VISIBILITY_PIXEL )"
)]
float4 main( PixelInput inPixel ) : SV_Target
{
float fPlayerPerTheta = dwNumPlayers.x/(2.0f*PI_F);
float2 vPixVecFromMiddle = normalize(inPixel.uvds.xy - float2(0.5f, 0.5f));
float fCosThetaFromXAxis = dot(float2(1.f,0.f),vPixVecFromMiddle);
float fPlayer = floor(acos(fCosThetaFromXAxis) * fPlayerPerTheta);
return screenTexArrays.Sample(screenTexSampler,float3(inPixel.uvds.xy,fPlayer));
}
使用此脚本制作头文件
@echo off
if not defined DevEnvDir (
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
)
if not defined DevEnvDir (
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
)
if "%Platform%" neq "x64" (
echo ERROR: Platform is not "x64" - previous bat call failed.
exit /b 1
)
set SHADERFLAGS=/WX /D__SHADER_TARGET_MAJOR=5 /D__SHADER_TARGET_MINOR=0
set POSTPROCESSPIXELSHADER=PostProcessAndCompositePixelShader.hlsl
fxc /nologo /T ps_5_0 /O3 %SHADERFLAGS% /Qstrip_reflect /Qstrip_debug /Qstrip_priv %POSTPROCESSPIXELSHADER% /Fh postProcessCompositeShader.h /Vn postProcessCompositeShaderBlob
我使用根描述符是为了避免描述符表添加的 1 级间接。
是的
这些是根签名中支持的唯一描述符类型。
- 不需要格式转换的缓冲区资源的着色器资源视图 (SRV)/无序访问视图 (UAV)(无类型缓冲区)。可以与根描述符绑定的无类型缓冲区的一些示例包括
、StructuredBuffer<type>
、RWStructuredBuffer<type>
和ByteAddressBuffer
。RWByteAddressBuffer
和Buffer<uint>
等类型化缓冲区不能。Buffer<float2>