从堆栈或堆变量更新 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_data
如 SHADER_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));
你好我最近在学习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
更新到常量缓冲区的值也正确应用于着色器端。
但是当我像 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));