代码之家  ›  专栏  ›  技术社区  ›  ufk

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

  •  1
  • ufk  · 技术社区  · 6 年前

    我正在尝试用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() 命令

    如果不是。。我还有别的命令吗?

    非常感谢。

    2 回复  |  直到 6 年前
        1
  •  1
  •   bruno    6 年前

    description of glDrawArrays 上面写着:

    与调用GL过程来传递每个单独的顶点属性不同,您可以使用GLVertexAttributePointer预先指定顶点、法线和颜色的单独数组,并使用它们通过对GLDrawArray的单个调用来构造一系列基元。

    这就是你的解决方案吗?

        2
  •  1
  •   Rabbid76    6 年前

    几十年来,固定功能属性和客户端功能一直被弃用。请参阅 Fixed Function Pipeline Legacy OpenGL . 了解 Vertex Specification Shader


    无论如何,您可以通过以下方式定义颜色属性数组: 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);
    
    推荐文章