constants - 从堆栈或堆变量更新 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_data
like时SHADER_DIRECTIONAL_LIGHT* m_data
,我更新的值并没有真正起作用。着色器端的值只是未初始化的随机值。
通过调试,我只是猜测问题出在我用来更新常量缓冲区的变量的不同内存空间上。如果我在堆栈中使用变量,我会成功更新常量缓冲区,而当使用堆中的变量时,它不会。
希望有人澄清这里的实际问题。谢谢
解决方案
您正在通过调用传递成员指针 m_data 的地址
CopyMemory(mappedData.pData, &m_data, sizeof(SHADER_DIRECTIONAL_LIGHT));
由于指针已经保存了地址,所以在没有地址运算符的情况下传递它,如下所示:
CopyMemory(mappedData.pData, m_data, sizeof(SHADER_DIRECTIONAL_LIGHT));
推荐阅读
- mysql - 在 .NET Core 中执行 MySQL 存储过程时出现“MySqlException:表 'mysql.proc' 不存在”
- java - Google App Engine 无法启动 Dataflow 作业
- c++ - 使用 [] 访问字符串元素会打印随机结果
- r - 计算 r 中每个患者的持续时间
- javascript - 如何使用来自 Ajax JQuery 的响应更新 html 元素
- python - 使用pandas DataFrame 比较两个file_csv 找出差异并将F2 加入F1
- php - 函数内array_push(mainArr,subAssociativeArr)的PHP问题
- powerbi - 计算累计总计时如何提取月份
- python - 如何从 django 中的预先编写的视图中删除 put
- format - 首次使用时,MIFARE Ultralight 上的 OTP 页面是否应该为空?