【问题标题】:Mixed types in VBO?VBO中的混合类型?
【发布时间】:2012-07-23 17:25:53
【问题描述】:

假设我想在一次绘制调用中将无符号整数浮点数据上传到显卡。我使用标准 VBO(不是 VAO,我使用的是 OpenGL 2.0),将各种顶点属性数组组合成单个 GL_ARRAY_BUFFER,并使用 glVertexAttribPointer(...) 单独指向,所以:

    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId);
    glEnableVertexAttribArray(positionAttributeId);
    glEnableVertexAttribArray(myIntAttributeId);
    glVertexAttribPointer(positionAttributeId, 4, GL_FLOAT, false, 0, 0);
    glVertexAttribPointer(colorAttributeId, 4, GL_UNSIGNED_INT, false, 0, 128);

    glClear(...);
    glDraw*(...);

我在这里遇到的问题是我的缓冲区(由vertexBufferId 引用)必须在LWJGL 中创建为FloatBuffer,以便它可以支持GL_FLOAT 类型的属性,这将似乎在这里排除了GL_INT 的使用(或者,反过来 - 它是一个或另一个,因为缓冲区不能是两种类型)。

有什么想法吗?这将如何在原生 C 代码中处理?

【问题讨论】:

  • 您使用的是 OpenGL 还是 OpenGL ES 2.0?因为它们不是一回事。
  • @NicolBolas 我正在使用 OpenGL 2.0 的 OpenGL ES 2.0 子集——据我所知。
  • OpenGL ES 2.0 不是 OpenGL 2.0 的子集。那么您使用的是哪一个:桌面 GL 还是 GL ES?
  • @NicolBolas 再一次,在 OpenGL 2.0/2.1 和 OpenGL ES 2.0 之间有一个可编程管道功能的共享子集(“交叉点”),对吗?由于 OpenGL ES 2.0 规范源自 OpenGL 2.1 规范。据我所知,这是常识。 FTR,我目前正在桌面环境中开发。
  • 然而……你正在使用GL_UNSIGNED_INT,这在 ES 2.0 中是不允许的(ES 只允许 BYTESHORT)。因此,即使有交叉路口,您也不会使用它。至于“常识”,这是一个普遍的误解

标签: opengl types lwjgl vbo


【解决方案1】:

这将在 C 中(以安全的方式)通过以下方式处理:

GLfloat *positions = malloc(sizeof(GLfloat) * 4 * numVertices);
GLuint *colors = malloc(sizeof(GLuint) * 4 * numVertices);

//Fill in data here.

//Allocate buffer memory
glBufferData(..., (sizeof(GLfloat) + sizeof(GLuint)) * 4 * numVertices, NULL, ...);
//Upload arrays
glBufferSubData(..., 0, sizeof(GLfloat) * 4 * numVertices, positions);
glBufferSubData(..., sizeof(GLfloat) * 4 * numVertices, sizeof(GLuint) * 4 * numVertices, colors);

free(positions);
free(colors);

还有其他方法可以做到这一点,其中涉及大量的演员等等。但此代码模拟了您在 LWJGL 中必须执行的操作。

【讨论】:

  • 够用了;我认为 C 会使用巧妙的强制转换,因为它在内存访问方面非常灵活,但这对我解决问题中特定于 LWJGL 的部分没有帮助。
  • 它在 LWJGL 中对您有何帮助?你能不创建一个 int 缓冲区并使用glBufferSubData 将其上传到缓冲区的一部分吗?我没有使用 C 风格的转换技巧的原因是为了模仿你在 Java 中需要做的事情。
  • 我想我明白了。我会试试这个。
猜你喜欢
  • 2011-09-03
  • 2015-11-04
  • 2014-01-10
  • 1970-01-01
  • 2021-12-15
  • 2019-11-12
  • 1970-01-01
  • 2014-04-28
  • 2016-09-07
相关资源
最近更新 更多