从堆栈或堆变量更新 directx 常量缓冲区

updating directx constant buffer from stack or heap variable

你好我最近在学习directx11。 我在使用常量缓冲区时遇到问题。

所以我正在做的是,我为定向光创建常量缓冲区并更新值,以便我可以在我的着色器中使用它。

应用端常量缓冲结构

struct SHADER_DIRECTIONAL_LIGHT {

        XMFLOAT4 ambient;
        XMFLOAT4 diffuse;
        XMFLOAT4 specular;
        XMFLOAT4 dir;
        XMFLOAT4 enabled;
        XMFLOAT4 intensity;

    };

class DirectionalLight
{
    private:
        //1. member variable
        SHADER_DIRECTIONAL_LIGHT m_data;
        //2. static variable
        //static SHADER_DIRECTIONAL_LIGHT m_data;
        //3. allocated variable
        //SHADER_DIRECTIONAL_LIGHT* m_data;
}

着色器端的常量缓冲区结构

cbuffer DIRECTIONAL_LIGHT : register(b0)
{
    float4 d_Ambient;
    float4 d_Diffuse;
    float4 d_Specular;
    float4 d_Dir;
    float4 d_Enabled;
    float4 d_intensity;
};

我如何更新常量缓冲区

    //of course, edit `m_data` before using map

    D3D11_MAPPED_SUBRESOURCE mappedData;
    ZeroMemory(&mappedData, sizeof(D3D11_MAPPED_SUBRESOURCE));

    HRESULT hr = dContext->Map(m_cb, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedData);
    r_assert(hr);
    CopyMemory(mappedData.pData, &m_data, sizeof(SHADER_DIRECTIONAL_LIGHT));
    dContext->Unmap(m_cb, 0);

    dContext->PSSetConstantBuffers(SHADER_REG_CB_DIRECTIONAL_LIGHT, 1, &m_cb);

问题是

当创建 m_dataSHADER_DIRECTIONAL_LIGHT m_data;static SHADER_DIRECTIONAL_LIGHT m_data; 时,

它工作正常,我使用 map 更新到常量缓冲区的值也正确应用于着色器端。

但是当我像 SHADER_DIRECTIONAL_LIGHT* m_data 一样创建 m_data 时,我更新的值并没有真正起作用。着色器端的值只是未初始化的随机值。

通过调试,我只是猜测问题出在我用来更新常量缓冲区的变量的不同内存 space。如果我在堆栈中使用变量,我会成功更新常量 bufferm,而当使用堆中的变量时,它不会。

希望有人能澄清这里的实际问题。 谢谢

您正在通过调用

传递成员指针m_data的地址
CopyMemory(mappedData.pData, &m_data, sizeof(SHADER_DIRECTIONAL_LIGHT));

因为指针已经保存了地址,所以不用地址运算符就可以像这样传递它:

CopyMemory(mappedData.pData, m_data, sizeof(SHADER_DIRECTIONAL_LIGHT));