我目前正在尝试学习 opengl,在此过程中,我遇到了一个需要澄清的问题。所以基本上,我被告知顶点着色器适用于每个顶点一次。我不太确定它怎么知道有多少数据构成一个顶点,因为我给着色器的所有内容基本上都是一个包含一堆 float 的缓冲区。
考虑以下代码:
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 规范。
最佳答案
您的问题有两个答案:
在您的特殊情况下,您在最后一行告诉 OpenGL 要绘制多少个顶点:
glDrawArray
将count
作为其第三个参数,当您不使用索引缓冲区时,它恰好是将要绘制的顶点数。
因为您选择了GL_TRIANGLE
作为基本类型,所以 3 个连续的顶点将被绘制为一个顶点。如果您使用索引缓冲区,您需要指定要渲染的索引的数量,即索引缓冲区的多少条目应该用于绘图。索引缓冲区中的最大数量反过来告诉 OpenGL 最多将使用多少个顶点。
关于c++ - opengl如何知道有多少个顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44846658/