【问题标题】:Send 3 byte-data to OpenGL GLSL将 3 字节数据发送到 OpenGL GLSL
【发布时间】: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 中,但我毫不怀疑这不是正确的做法。我知道我在某个地方错了,但我不明白我能做什么(正如我所说,也许这甚至是不可能的)。

感谢您的帮助/建议!

【问题讨论】:

  • expectedread 值是什么? ivec3 可能更合适。另外,您确定没有在您的结构中引入填充吗?
  • @BartekBanachewicz:为什么?他正在使用glVertexAttribPointer。那不能喂ivec3s。
  • 是的,一定要检查结构末尾是否有任何填充。
  • 所以我应该向我的结构添加一个“未使用”的 uint8_t 属性,以适应 4 字节结构?我还在考虑向 glsl 发送一个无符号整数并将我的值“打包”到其中(R 的第一个字节,G 的第二个字节,B 的第三个字节)
  • @BartekBanachewicz:这不是 GLSL 问题; it's an OpenGL matterglVertexAttribPointer 只能提供浮点值的顶点着色器输入。正如glVertexAttribIPointer 只能提供有符号或无符号顶点着色器输入。正如glVertexAttribLPointer 只能提供双精度输入。

标签: c++ opengl glsl shader


【解决方案1】:

好的,今天我了解了other versions of glVertexAttrib,我现在可以回答你了;)

如果您想按原样将整数顶点属性传递给着色器,您必须(显然)使用glVertexAttribIPointer。如果您想接收浮点输入(例如vec3),请查看链接页面和应用的转换。

【讨论】:

  • 谢谢大家的回答,现在它的工作完全符合我的预期,我想我会保留你的链接@BartekBanachewicz,那里有很多非常有用的信息!
  • @Xleek 我只是想提醒您,您可以将我的问题标记为已接受,就在它的分数以下:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多