我目前正在尝试学习opengl,在这样做时,我遇到了一个需要澄清的问题。所以基本上,我被告知顶点着色器适用于每个顶点一次。我不太确定它是如何知道有多少数据构成一个顶点的,因为我给出着色器的所有内容基本上都是一个包含一堆浮点数的缓冲区。
请考虑以下代码:
GLuint vbo = 0;
glGenBuffer(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,7 * 3 * sizeof(GLfloat), NULL, GL_STATIC_DRAW);
glSubData(GL_ARRAY_BUFFER,0,3*3*sizeof(GLfloat),vertices);
glSubData(GL_ARRAY_BUFFER,3*3*sizeof(GLfloat),4*3*sizeof(GLfloat),colors);
GLuint pos = glGetAttribLocation(programId, "position");
GLuint col = glGetAttribLocation(programId, "color");
glVertexAttribPointer(pos,3,GL_FLOAT,GL_FALSE,0,0);
glVertexAttribPointer(col,4,GL_FLOAT,GL_FALSE,0,3*3*sizeof(GLfloat));
glEnableVertexAttribArray(pos);
glEnableVertexAttribArray(col);
glUseProgram(programId);
glDrawArray(GL_TRIANGLE,0,3);
这只是绘制一个简单的三角形,因此着色器只是在片段着色器上声明gl_position和输出颜色。请考虑我的顶点着色器将有一个名为position的变量,我的片段着色器有一个名为color的变量。
现在,我不明白的问题是我从未在vbo中指定顶点的终点。结果,opengl如何知道它应该只查看vbo中的前9个浮点位置,而不是转到vbo中的颜色rgba规范。
答案 0 :(得分:3)
您的问题有两个答案:
在您的特殊情况下,您告诉OpenGL在最后一行中要绘制多少顶点:glDrawArray
将count
作为其第三个参数,当您不使用索引缓冲区时,确切地说将绘制的顶点数量
因为您选择GL_TRIANGLE
作为基本类型,所以将连续3个顶点绘制为单个顶点。
如果使用索引缓冲区,则指定要渲染的索引的数量,即应使用索引缓冲区的条目数来绘制。索引缓冲区中的最大数量依次告诉OpenGL最多将使用多少个顶点。