现在,我正在学习OpenGL,我想绘制一个金字塔,其中每侧都有不同的颜色。我遇到的问题是,我似乎只能为顶点分配颜色,而不能为侧面分配颜色。因此,每一面都具有渐变效果,而不是纯色。如何给我的侧面增色?

    void init_buffer()
    {
        glGenBuffers(1, &(b.trifan));
        glBindBuffer(GL_ARRAY_BUFFER, b.trifan);

        GLfloat trifan[6][3] =
        {
            {0.0, 1.0, 0.0},
            {1.0, 0.0, 1.0},
            {-1.0, 0.0, 1.0},
            {-1.0, 0.0, -1.0},
            {1.0, 0.0, -1.0},
            {1.0, 0.0, 1.0}
        };

        glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, trifan, GL_STATIC_COPY);


        //base of the pyramid as 2 triangles
        glGenBuffers(1, &(b.tribase));
        glBindBuffer(GL_ARRAY_BUFFER, b.tribase);
        GLfloat tribase[4][3] =
        {
            {1.0, 0.0, -1.0},
            {-1.0, 0.0, -1.0},
            {1.0, 0.0, 1.0},
            {-1.0, 0.0, 1.0}
        };
        glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 4 * 3, tribase, GL_STATIC_COPY);

        //colors
        glGenBuffers(1, &b.colors);
        glBindBuffer(GL_ARRAY_BUFFER, b.colors);
        GLfloat colors[6][3] =
        {
            {1.0, 0.0, 0.0},
            {1.0, 0.0, 0.0},
            {1.0, 0.0, 0.0},
            {1.0, 0.0, 1.0},
            {0.5, 0.0, 1.0},
            {1.0, 0.0, 0.5},
        };
        glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, colors, GL_STATIC_COPY);

        check_errors();
    }


...
//Inside my display function
glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);
    {
        glBindBuffer(GL_ARRAY_BUFFER, b.trifan);
        glVertexPointer(3, GL_FLOAT, 0, 0);

        glBindBuffer(GL_ARRAY_BUFFER, b.colors);
        glColorPointer(3, GL_FLOAT, 0, 0);

        glDrawArrays(GL_TRIANGLE_FAN, 0, 6);

        glBindBuffer(GL_ARRAY_BUFFER, b.tribase);
        glVertexPointer(3, GL_FLOAT, 0, 0);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    }
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

最佳答案

您可以按照注释中的建议为每个面复制顶点。通过为每个面使用不同的纹理(位图),而无需复制顶点,也可以实现相同的效果。

参考

http://oglsuperbible5.googlecode.com/svn/trunk/Src/Chapter05/Pyramid/Pyramid.cpp

https://www.scss.tcd.ie/Michael.Manzke/CS7055/Lab2/SuperBible.4th.Ed.Ch8-9.pdf处的图

注意:最佳参考只有一个纹理映射到所有面上,因此要编写其他代码以将不同纹理映射到不同面上。

10-06 04:53