首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >( dx12)着色常量出错

( dx12)着色常量出错
EN

Stack Overflow用户
提问于 2022-01-19 03:20:52
回答 1查看 88关注 0票数 0

正如您可以看到的,在PIX中,管道说GPU上有正确的值,但是当我调试Pixels时,它使用错误的值而不使用gZSplits。

然后我像这样将值上传到GPU,mZSplits是std::vector:

代码语言:javascript
复制
for (int i = 1; i < mMapCount + 1; ++i)
{
    cmdList->SetGraphicsRoot32BitConstants(7, 1, &mZSplits[i], i - 1);
}

这是我的暗号。

代码语言:javascript
复制
cbuffer ShadowCB : register(b5)
{
    float gZSplits[3] : packoffset(c0);
}

float4 PS(DsOut din) : SV_Target
{
    float4 result = 0.0f;
    
    if(gKeyInput)
    {
        if (din.Tessellation.w <= 5.0f) 
            result = float4(1.0f, 0.0f, 0.0f, 1.0f);
        else if (din.Tessellation.w <= 10.0f) 
            result = float4(0.0f, 1.0f, 0.0f, 1.0f);
        else if (din.Tessellation.w <= 20.0f)
            result = float4(0.0f, 0.0f, 1.0f, 1.0f);
        else if (din.Tessellation.w <= 30.0f)
            result = float4(1.0f, 1.0f, 0.0f, 1.0f);
        else if (din.Tessellation.w <= 40.0f)
            result = float4(1.0f, 0.0f, 1.0f, 1.0f);
        else if (din.Tessellation.w <= 50.0f)
            result = float4(0.0f, 1.0f, 1.0f, 1.0f);
        else if (din.Tessellation.w <= 60.0f)
            result = float4(1.0f, 1.0f, 1.0f, 1.0f);
        else
            result = float4(1.0f, 0.5f, 0.5f, 1.0f);
    }
    else
    {
        int idx = -1;
        float4 PosV = mul(float4(din.PosW, 1.0f), gView);

        for (int j = 2; j >= 0; j--)
        {
            float zSplits = gZSplits[j];
            if (PosV.z < zSplits)
            {
                idx = j;
            }
        }
        float4 PosS = mul(float4(din.PosW, 1.0f), gShadowTransform[idx]);

        float4 diffuse = 0.0f;
        
        float4 baseTexDiffuse = gBaseTexture.Sample(gAnisotropicWrap, din.TexCoord0) * gMat.Diffuse;
        float4 detailedTexDiffuse = gDetailedTexture.Sample(gAnisotropicWrap, din.TexCoord1) * gMat.Diffuse;
        float4 roadTexDiffuse = gRoadTexture.Sample(gAnisotropicWrap, din.TexCoord0) * gMat.Diffuse;
    
        if (roadTexDiffuse.a < 0.4f)
        {
            diffuse = saturate(baseTexDiffuse * 0.6f + detailedTexDiffuse * 0.4f);
        }
        else
        {
            diffuse = roadTexDiffuse;
        }
        
        float3 view = normalize(gCameraPos - din.PosW);
        float4 ambient = gAmbient * float4(gMat.Ambient, 1.0f) * diffuse;

        float shadowFactor[3] = { 1.0f, 1.0f, 1.0f };
        for (int i = 0; i < 3; i++)
            shadowFactor[i] = CalcShadowFactor(PosS, idx);
        
        float4 directLight;
        float shadowFactorOut[3] = { 1.0f, 1.0f, 1.0f };
        if (PosS.x < 0.0f || PosS.x > 1.0f || PosS.z < 0.0f || PosS.z > 1.0f || PosS.y < 0.0f || PosS.y > 1.0f)
            directLight = ComputeLighting(gLights, gMat, normalize(din.NormalW), view, shadowFactorOut);
        else
        {
            directLight = ComputeLighting(gLights, gMat, normalize(din.NormalW), view, shadowFactor);
        }

        result = ambient + directLight;
        result.a = gMat.Diffuse.a;

        float4 debugColor = { 1.0f, 1.0f, 1.0f, 1.0f };
        //for (int k = 2; k >= 0; --k)
        //{
        //    float4 pos = mul(float4(din.PosW, 1.0f), gShadowViewProj[k]);
        //    if (pos.x > 0.0f && pos.x < 1.0f && pos.z > 0.0f && pos.z < 1.0f && pos.y > 0.0f && pos.y < 1.0f)
        //    {
        //        if (k == 2)
        //        {
        //            debugColor = float4(1.0f, 0.0f, 0.0f, 1.0f);
        //        }
        //        if (k == 1)
        //        {
        //            debugColor = float4(0.0f, 1.0f, 0.0f, 1.0f);
        //        }
        //        if (k == 0)
        //        {
        //            debugColor = float4(0.0f, 0.0f, 1.0f, 1.0f);
        //        }
        //    }
        //}
        //result *= debugColor;

        if (idx == 2)
        {
            debugColor = float4(1.0f, 0.0f, 0.0f, 1.0f);
        }
        else if (idx == 1)
        {
            debugColor = float4(0.0f, 1.0f, 0.0f, 1.0f);
        }
        else if (idx == 0)
        {
            debugColor = float4(0.0f, 0.0f, 1.0f, 1.0f);
        }
        result *= debugColor;
    }

    return result;
}

我检查过根签名或其他选项,但什么都找不到。也许着色器偏移是关键?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-20 13:55:59

根据常数缓冲区中数组的包装规则:

代码语言:javascript
复制
cbuffer ShadowCB : register(b5)
{
    float gZSplits[3] : packoffset(c0);
}

不是3个浮点数(大小为12字节),因此表示形式不是。

代码语言:javascript
复制
cbuffer ShadowCB : register(b5)
{
    float gZSplits0;
    float gZSplits1;
    float gZSplits2;
};

它实际上已扩大到:

代码语言:javascript
复制
cbuffer ShadowCB : register(b5)
{
    float gZSplits0;
    float3 pad0;
    float gZSplits1;
    float3 pad0;
    float gZSplits2;
};

因此,您需要确保您的cpu端缓冲区实际上是匹配的布局。

通过检查反汇编,您可以再次检查ShadowCB大小是否确实是36个字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70764955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档