【发布时间】: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 只允许BYTE和SHORT)。因此,即使有交叉路口,您也不会使用它。至于“常识”,这是一个普遍的误解。