使用一个glDrawArrays命令绘制几个不同颜色的三角形

4

我正在尝试编写OpenGL相关的内容,由于是初学者,所以请见谅我的任何错误。

总体而言,我只想绘制两个不同颜色的三角形,我使用以下代码实现:

float vertices[] = {
        -0.5f, -0.6f, 0.0f,
        0.5f, -0.6f, 0.0f,
        0.4f,  0.5f, 0.0f,
        0.5f, 0.6f, 0.0f,
        -0.5f, 0.6f, 0.0f,
        -0.4f,  -0.5f, 0.0f

};

void display() {
    std::cout << "frame";
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
    glClear(GL_COLOR_BUFFER_BIT);         // Clear the color buffer
    // activate and specify pointer to vertex array
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);

// draw a cube
    glColor3f(1.0f, 0.0f, 0.0f); // Red

    glDrawArrays(GL_TRIANGLES, 0, 3);
    //glColor3f(0.0f, 1.0f, 0.0f); // Green
    glDrawArrays(GL_TRIANGLES, 3, 3);

    glDisableClientState(GL_VERTEX_ARRAY);
    glFlush();  // Render now
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);                 // Initialize GLUT
    glutCreateWindow("OpenGL Setup Test"); // Create a window with the given title
    glutInitWindowSize(320, 320);   // Set the window's initial width & height
    glutInitWindowPosition(50, 50); // Position the window's initial top-left corner
    glutDisplayFunc(display); // Register display callback handler for window re-paint
    glutMainLoop();           // Enter the infinitely event-processing loop
    return 0;
}

现在,如果我想在同一条命令中绘制两个三角形,我可以这样做:

    glDrawArrays(GL_TRIANGLES, 0, 6);

但是它用相同的颜色绘制了这两个三角形。

是否有一种方法可以通过仍然只使用一个glDrawArrays()命令来为每个三角形绘制不同的颜色?

如果没有,那么我应该选择其他的命令吗?

谢谢


如果不是这个命令,我应该使用其他命令吗?自几十年前起,固定功能属性和客户端能力已经过时。请参阅固定功能管线遗留OpenGL。了解顶点规范着色器以获得最先进的渲染方式。 - Rabbid76
2个回答

2
glDrawArrays的描述中写道:

您可以使用glVertexAttribPointer预先指定顶点,法线和颜色的不同数组,并使用它们通过单个调用glDrawArrays构造原语的序列,而不是调用每个单独的顶点属性GL过程。

这是你的解决方案吗?

我不知道这怎么成为问题的(被接受的)答案。使用glVertexAttribPointer需要一个着色器程序,它不与固定功能属性和客户端能力(glEnableClientState)交互。 - Rabbid76

1

"如果不是这个命令,我还有其他的选择吗?" 固定功能属性和客户端能力自几十年前就已经过时了。请参阅固定功能管线传统OpenGL。了解顶点规范着色器,以获得最先进的渲染方式。


无论如何,您都可以通过 glColorPointer 定义颜色属性的数组,这样每个顶点坐标都与一个单独的颜色属性相关联:
float colors[] = {
     1.0f, 0.0f, 0.0f, // red
     1.0f, 0.0f, 0.0f,
     1.0f, 0.0f, 0.0f,
     0.0f, 1.0f, 0.0f, // green
     0.0f, 1.0f, 0.0f,
     0.0f, 1.0f, 0.0f
};

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, 0, colors);

glDrawArrays(GL_TRIANGLES, 0, 6);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接