c++ - opengl如何知道有多少个顶点?

标签 c++ opengl

我目前正在尝试学习 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 要绘制多少个顶点:glDrawArraycount 作为其第三个参数,当您不使用索引缓冲区时,它恰好是将要绘制的顶点数。
    因为您选择了 GL_TRIANGLE 作为基本类型,所以 3 个连续的顶点将被绘制为一个顶点。

  • 如果您使用索引缓冲区,您需要指定要渲染的索引的数量,即索引缓冲区的多少条目应该用于绘图。索引缓冲区中的最大数量反过来告诉 OpenGL 最多将使用多少个顶点。

关于c++ - opengl如何知道有多少个顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44846658/

相关文章:

c++ - C++段错误中的命令行参数

java - 使用透明度渲染到纹理时渲染覆盖透明度

c++ - GLM View 矩阵导致模型矩阵无效

android - 是否有可能在 Android Studio 中构建一个带有 .so 作为输出的 native 模块

c# - 计算机视觉 : Segmentation of XRay image vertebrae detection

opengl - 如何在3D世界中拿起鼠标

macos - 如何从屏幕上读取一个像素?

java - 用Java实现 'Waterfall'模拟

C++运算符重载库类

c++ - 将 Boost 日志转发到文件会丢弃元信息