【问题标题】:GLSL: Float array in uniform buffer objectGLSL:统一缓冲区对象中的浮点数组
【发布时间】: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)

标签: c++ arrays glsl


【解决方案1】:

在没有关于 Gtx::BufferManager 的详细信息的情况下,我猜测以下可能会帮助您进行调试。

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

【讨论】:

  • 谢谢 4 你的回应。我试过评论 std140 但它不起作用。缓冲区已正确绑定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2019-09-18
相关资源
最近更新 更多