【问题标题】:How does opengl knows how many vertex there are?opengl如何知道有多少个顶点?
【发布时间】:2017-12-04 10:12:44
【问题描述】:

我目前正在尝试学习 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 和输出颜色。请考虑我的顶点着色器将有一个名为位置的变量,而我的片段着色器有一个名为颜色的变量。

现在,我不明白的问题是我从未在 vbo 中指定我的顶点的终点。结果,opengl怎么知道它应该只看vbo中的前9个float位置,而不是去vbo中的color rgba规范。

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    您的问题有两个答案:

      1234563将被绘制的顶点。
      因为你选择GL_TRIANGLE作为你的基本类型,3个连续的顶点将被绘制为一个顶点。
    • 如果使用索引缓冲区,则指定要渲染的索引数,即应该使用索引缓冲区的多少条目进行绘制。索引缓冲区中的最大数量反过来告诉 OpenGL 最多使用多少个顶点。

    【讨论】:

    • 您好,谢谢您的回答。所以只是快速澄清一下,我在 glDrawArray 中指定了 3 但它如何知道它是什么数据类型?既然我的数据基本上是 vec3f,它怎么知道一次拉 3 个浮点数?现在我想到了可以使用 glVertexAttribPointer 告诉它为每个顶点一次拉 3 个浮点数的情况,但问题是它如何知道在我上面的代码中使用 glVertextAttribPointer 作为位置而不是使用 glVertexAttribPointer 作为颜色?
    • 这是glVertexAttribPointer 参数的一部分:您指定pos 缓冲区的每个条目将由3 个浮点数组成,col 缓冲区的每个条目将由4 个浮点数组成。
    • 但我不太清楚为什么它会知道在查询浮点数时使用 pos 条目而不是 col 条目。
    • 啊,现在我正确理解了你的问题。这是由于 glVertexAttribPointer 的最后一个参数:它提供了 offset GL 用于查找此顶点属性的条目。所以你的缓冲区的布局是| vertices | colors |,因此你需要告诉GL顶点和颜色部分从哪里开始,你在调用中通过指定偏移量03*3*sizeof(GLfloat)来做这件事,这正是空间量您需要跳过顶点并直接获取颜色。
    • 哦,好吧,现在这更有意义了。所以基本上 glDrawArray 将偏移量与 glAttribPointer 中的偏移量匹配正确吗?所以如果我将它作为 3*3*sizeof(GLfloat) 的偏移量,它会查询 4 ​​float 而不是 3 对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2021-01-22
    • 1970-01-01
    • 2020-02-11
    相关资源
    最近更新 更多