在不同的着色器中使用相同的常数缓冲液

Use the same constant buffer in distinct shaders

本文关键字:常数 缓冲      更新时间:2023-10-16

我有两个不同的着色器(PS和VS作为单独的文件),在它们中,我需要使用完全相同的常数缓冲区。他们是共享此常数缓冲区还是要加倍的代码?

我不使用效果,因此,如果我想在构建时间而不是运行时编译着着色器,则必须在不同的文件中分别编译PS和VS着色器(因此对我而言并非如此)。p>这是我现在的方法,显然给我带来了错误的错误:

vertexshader:

cbuffer cbPerObject : register(b0)
{
    float4x4 gWorld;
    float4x4 gWorldInvTranspose;
    float4x4 gWorldViewProj;
    Material gMaterial;
};

PixelShader:

cbuffer cbPerObject : register(b0)
{
    float4x4 gWorld;
    float4x4 gWorldInvTranspose;
    float4x4 gWorldViewProj;
    Material gMaterial;
};
cbuffer cbPerFrame : register(b1)
{
    DirectionalLight gDirLight;
    PointLight gPointLight;
    SpotLight gSpotLight;
    float3 gEyePosW;
};

我在render()方法中设置常量缓冲区的方式(我现在有一个对象,因此以相同的方式设置了PeroBJ和Persprame Buffer):

m_d3dContext->VSSetConstantBuffers(0, 1, m_cBuffer_perObject.GetAddressOf());
m_d3dContext->PSSetConstantBuffers(0, 1, m_cBuffer_perObject.GetAddressOf());
m_d3dContext->PSSetConstantBuffers(1, 1, m_cBuffer_perFrame.GetAddressOf());

那么什么不起作用?我有一个简单的立方网格。我成功地为Vertexpos VertexColour输入布局渲染了立方体,这一次我尝试添加一些照明公式,因此我使用vertexpos pertexnormal

amde新输入布局
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "NORMAL", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }

因此,我的渲染极为巨大(尺度不是问题,所以我再次使用相同的比例尺和相机,用于颜色混合和照明配方,从书本和照明配方中,不会导致错误)。

使它起作用:我只是忘记考虑在HLSL和C 之间打包差异。如果有人对解决方案感兴趣,我必须将此单个预处理器命令添加到我的HLSL代码:

#pragma pack_matrix(row_major)

(或将转置矩阵发送到常数缓冲区)