java - OpenGL 和 OpenGLES 中的 glVertexAttribPointer

标签 java opengl opengl-es

我正在阅读有关 OpenGL 和 OpenGLES 的教程,我对函数 glVertexAttribPointer 在这两个 API 中的使用有点困惑。

OpenGL 教程中,此函数将数字偏移量用作最后一个参数(转换为 const GLVoid*),我假设顶点直接取自当前数组缓冲区。

glVertexAttribPointer(vs_position, 2, GL_FLOAT, GL_TRUE, 5 * sizeof(GLfloat), (const GLvoid*) (3*sizeof(GLfloat)) );

OpenGLES 教程中,最后一个参数直接指向表示顶点的结构:

GLFloat vertices[] = {...definition};
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);

我不明白这两个函数是如何工作的。它们的功能完全不同吗?

最佳答案

它们是以两种不同的方式使用相同的功能。我会解释为什么它会这样工作,但你不会在意,这是出于非常愚蠢和无关紧要的原因。

重要的是他们在做什么。他们正在做什么取决于您未显示的内容:绑定(bind)到 GL_ARRAY_BUFFER 的内容。

看,glVertexAttribPointer 的行为变化 取决于此。如果在调用 glVertexAttribPointer 时没有绑定(bind)到 GL_ARRAY_BUFFER 的缓冲区对象,则该函数将假定最终值是一个指针(如函数名表示:glVertexAttribPointer)。具体来说,它是指向客户端拥有的内存的指针。

渲染时,顶点属性数据将来自先前提供的指针。因此,第二个示例仅使用以标准 C 样式声明的客户端数据数组作为源数据。不涉及缓冲区对象。

注意:OpenGL 3.1+ 的核心配置删除了使用客户端内存的能力;在那里,您必须使用缓冲区对象,如下所述。

如果在调用 glVertexAttribPointer 时将缓冲区对象绑定(bind)到 GL_ARRAY_BUFFER,则会发生一些特殊情况。 OpenGL 会假装指针(就 C/C++ 而言,它是最终参数)实际上是绑定(bind)到 GL_ARRAY_BUFFER 的缓冲区中的字节偏移量。它将指针转换为整数,然后存储该整数偏移量和当前绑定(bind)到 GL_ARRAY_BUFFER 的缓冲区对象。

所以上面的代码采用3*sizeof(GLfloat),即字节偏移量,并将其转换为指针。 OpenGL 将获取指针并将其转换回偏移量,再次产生 3*sizeof(GLfloat)

渲染时,OpenGL 将使用先前给定的偏移量从先前给定的缓冲区对象中读取。

第一个示例将顶点数据放入 GPU 内存中的缓冲区对象中。第二个示例将顶点数据放入 CPU 内存中的常规 C/C++ 数组中。

关于java - OpenGL 和 OpenGLES 中的 glVertexAttribPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15380491/

相关文章:

java - 如何命名下载的数据: file?

java - 需要简单的方法来创建用于排序的比较器类

c++ - 向着色器添加线不会画任何东西

iphone - 帮助理解 OpenGL 的 Xcode 4 项目模板

javascript - WebGL 几何着色器等效?

java - 从列表 : Java 创建字母表列表

Java如何知道谁在修改ArrayList?

OpenGL + SSH 上的 GLUT 段错误

c++ - 我的文件依赖性有什么问题?

ios - 在 OpenGL ES 1.1 中绘制二维三角形时如何定义顺序?