繁体   English   中英

GLSL:统一缓冲区对象中的浮点数组

[英]GLSL: Float array in uniform buffer object

我有一个这样的统一缓冲区(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值。 但是那时我的开销很大。

有什么好的解决办法吗? THX 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上没有太多细节的情况下,我猜测以下可能有助于您进行调试的可能性。

  1. 尝试注释掉布局(std140)。
  2. 仔细检查您是否已调用glBindBufferBase()将缓冲区对象的目标与正确的绑定点进行绑定(默认情况下,如果未在着色器中声明UConstantBufferPS1时指定它,则应该以0开头)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM