【发布时间】:2015-06-02 16:09:57
【问题描述】:
我有一个像这样的统一缓冲区(GLSL/GPU):
layout(std140) uniform UConstantBufferPS1
{
float m_LuminanceHistory[8];
};
我像这样上传我的数据(C++/CPU):
SHistoryBuffer* pHistogramHistory = static_cast<SHistoryBuffer*>(Gfx::BufferManager::MapConstantBuffer(m_BufferSetPtr->GetBuffer(1)));
pHistogramHistory->m_LuminanceHistory[0] = 1.0f;
pHistogramHistory->m_LuminanceHistory[1] = 1.0f;
pHistogramHistory->m_LuminanceHistory[2] = 1.0f;
pHistogramHistory->m_LuminanceHistory[3] = 1.0f;
pHistogramHistory->m_LuminanceHistory[4] = 1.0f;
// ...
Gfx::BufferManager::UnmapConstantBuffer(m_BufferSetPtr->GetBuffer(1));
在 GLSL 方面,除了第一个和第二个浮点值 (m_LuminanceHistory[0]) 之外,所有内容都是 0。好像是用某种方式包装的!?
一个糟糕的解决方案是在 CPU 和 GPU 上定义一个浮点向量 (vec4) 数组。然后我可以在这个数组中迭代并读取数组的每个 x 值。但是我的开销很大。
有什么好的解决办法吗?谢谢 4 你的帮助!
编辑:
我使用了以下解决方案:
layout(std140) uniform UConstantBufferPS1
{
vec4 m_LuminanceHistory[2];
};
float History[8];
History[0] = m_LuminanceHistory[0].x;
History[1] = m_LuminanceHistory[0].y;
History[2] = m_LuminanceHistory[0].z;
History[3] = m_LuminanceHistory[0].w;
History[4] = m_LuminanceHistory[1].x;
History[5] = m_LuminanceHistory[1].y;
History[6] = m_LuminanceHistory[1].z;
History[7] = m_LuminanceHistory[1].w;
此解决方案按预期工作,但我不知道为什么我不能直接使用 float[8]。
【问题讨论】:
-
如果没有看到
Gtx::BufferManager的代码,我认为任何人都无法帮助您。 -
就是用“glBufferSubData”上传数据而已。
-
@TobiasSchwandt 上传数据时您可能忘记将字节大小乘以
sizeof(float)。