OpenGL 如何知道它应该根据 GL_ARRAY_BUFFER 将顶点绘制到啥位置?

Posted

技术标签:

【中文标题】OpenGL 如何知道它应该根据 GL_ARRAY_BUFFER 将顶点绘制到啥位置?【英文标题】:How does OpenGL know to what position it should draw the vertices based on the GL_ARRAY_BUFFER?OpenGL 如何知道它应该根据 GL_ARRAY_BUFFER 将顶点绘制到什么位置? 【发布时间】:2015-06-30 05:41:01 【问题描述】:

例如,我有以下一段代码:

//Create a vbo and bind it to the GL_ARRAY_BUFFER
glGenBuffers(1, &positionBufferObject);    
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);

//vertexPosition is an array of floats that stores the position of 3 vertices (x, y, z, w)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);

//Enable the vbo at index 0 of the vao (assuming I have stored it previously at index 0)
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

//Finally draw the triangle
glDrawArrays(GL_TRIANGLES, 0, 3);

我的问题是,glDrawArrays() 怎么知道绑定到 GL_ARRAY_BUFFER 的内容是指关于位置的信息,而不是关于颜色的信息?

【问题讨论】:

它没有。但是您的着色器确实如此,并且两者绑定在一起。 问题是我能够在不使用着色器的情况下使用该代码绘制三角形。这就是我感到困惑的原因。 我不知道驱动程序的详细信息,但我希望有某种默认值,即原语首先假定它是一个位置组件。 @Robinson:每个驱动程序可能都有自己的驱动程序,但 NVidia 对此非常一致。 opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php 一般来说,使用没有着色器的通用顶点属性是自找麻烦。很多时候,属性 0 似乎与固定函数位置混为一谈。但这并非适用于所有平台。 【参考方案1】:

如果gl_Vertex 可用(即不是核心配置文件),规范会调用该位置和顶点属性0 别名。

来自gl 4.5 compatibility profile specification(第401/1005页):

设置通用顶点属性零指定一个顶点,如 在第 10.7.2 节中描述。设置任何其他通用顶点 属性更新属性的当前值。没有 顶点属性零的当前值

【讨论】:

以上是关于OpenGL 如何知道它应该根据 GL_ARRAY_BUFFER 将顶点绘制到啥位置?的主要内容,如果未能解决你的问题,请参考以下文章

多个 OpenGL 上下文/视图

OpenGL亮度到颜色映射?

我应该针对哪种版本的OpenGL / Direct3D实现最佳兼容性? [关闭]

Qt OpenGL-如何根据鼠标点击获取对象

OpenGL - 需要一个简单的概念澄清

openGL - 我希望相机更接近物体,如何?