首页 > 解决方案 > 从堆栈或堆变量更新 directx 常量缓冲区

问题描述

嗨,我最近正在学习 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_data喜欢SHADER_DIRECTIONAL_LIGHT m_data;或时static SHADER_DIRECTIONAL_LIGHT m_data;

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

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

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

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

标签: constantsbufferheap-memorydirectx-11stack-memory

解决方案


您正在通过调用传递成员指针 m_data 的地址

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

由于指针已经保存了地址,所以在没有地址运算符的情况下传递它,如下所示:

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

推荐阅读