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值。但是我有一个很大的开销。
有好的解决方案吗?谢谢你的帮助!
编辑:
我使用了以下解决方案:
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的细节,我猜以下可能性可能有助于您调试。
- 尝试注释布局(std140)。
- 仔细检查你已经调用了glBindBufferBase()来绑定缓冲区对象的目标与正确的绑定点(默认情况下,它应该从0开始,如果你没有指定它,因为你在着色器中声明了UConstantBufferPS1)。
相关文章:
- 销毁C++中动态分配的内存(数组对象)
- 数组对象的生存期是否在重用其元素存储时结束?
- 为什么顶点数组对象会导致错误?
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- OpenGL 顶点数组对象与 tinyobjloader
- 将数组/对象/结构列表从C#库中传递给C MFC应用程序
- C++ RapidJson 帮助反序列化数组对象
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- 检查成员函数是否返回临时对象或数组对象
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 当数组对象以函数参数传递时,为什么复制构造函数会自称
- 如何使用箭头指针打印出一类数组对象,这些对象中有多个分数
- C++17 std::shared_ptr<> 类数组对象的重载运算符 []
- 添加两个具有运算符重载的数组对象,从而导致分段错误
- opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
- 使用相同的数据填充数组对象或使用指针
- 方法用于最快的分配,并且不需要将动态大小的数组对象作为局部变量
- 如何将2d数组对象传递给c++中的函数
- ReferenceTable溢出(jni-android),数组对象释放