纹理数组可以作为 hlsl 根签名中的根描述符吗

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

因此,我在着色器中声明我的根描述符,并且遇到了一种情况,我想将纹理数组作为根描述符,但 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 级间接。

directx hlsl directx-12
1个回答
0
投票

是的

这些是根签名中支持的唯一描述符类型。

  • 不需要格式转换的缓冲区资源的着色器资源视图 (SRV)/无序访问视图 (UAV)(无类型缓冲区)。可以与根描述符绑定的无类型缓冲区的一些示例包括
    StructuredBuffer<type>
    RWStructuredBuffer<type>
    ByteAddressBuffer
    RWByteAddressBuffer
    Buffer<uint>
    Buffer<float2>
    等类型化缓冲区不能。

https://learn.microsoft.com/en-us/windows/win32/direct3d12/using-descriptors-directly-in-the-root-signature

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