【发布时间】:2013-02-19 13:34:41
【问题描述】:
我正在开发一款基于 Voxed 的小游戏。我不打算创建 Minecraft 副本,但这不是重点。
使用 C++ OpenGL 和 VBO,我无法成功地将“非标准”类型发送到我的 GLSL 着色器。 假设一个结构由 3 个 uint8_t 属性组成,我试图将这个结构的数组发送到我的 glsl。但我无法得到正确的值。
我找到的最准确的是:WebGL - How to pass unsigned byte vertex attribute colour values?
但它并没有真正回答我的问题。
这里有一些代码可以帮助理解我想要做什么。我什至不知道是否有任何解决方案可以实现它......
我的结构
struct Color
{
uint8_t r, g, b;
// Getter and setter etc...
};
我如何将它绑定到 VBO
//_colors contains an array of Color
//_colors.array = new Color[SIZE];
glBind(GL_ARRAY_BUFFER, _colors.buffer);
glBufferData(GL_ARRAY_BUFFER,
sizeof(Color) * _colors.size,
&(_colors.array[0]),
GL_STATIC_DRAW);
我如何尝试将它们发送到 GPU
glBind(GL_ARRAY_BUFFER, _colors.buffer);
glVertexAttribPointer((GLint)1, 3, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0);
我将值存储在着色器中的 vec3 中,但我毫不怀疑这不是正确的做法。我知道我在某个地方错了,但我不明白我能做什么(正如我所说,也许这甚至是不可能的)。
感谢您的帮助/建议!
【问题讨论】:
-
expected 和 read 值是什么?
ivec3可能更合适。另外,您确定没有在您的结构中引入填充吗? -
@BartekBanachewicz:为什么?他正在使用
glVertexAttribPointer。那不能喂ivec3s。 -
是的,一定要检查结构末尾是否有任何填充。
-
所以我应该向我的结构添加一个“未使用”的 uint8_t 属性,以适应 4 字节结构?我还在考虑向 glsl 发送一个无符号整数并将我的值“打包”到其中(R 的第一个字节,G 的第二个字节,B 的第三个字节)
-
@BartekBanachewicz:这不是 GLSL 问题; it's an OpenGL matter。
glVertexAttribPointer只能提供浮点值的顶点着色器输入。正如glVertexAttribIPointer只能提供有符号或无符号顶点着色器输入。正如glVertexAttribLPointer只能提供双精度输入。