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 将顶点绘制到啥位置?的主要内容,如果未能解决你的问题,请参考以下文章