c - OpenGL,如何为金字塔的侧面提供纯色

标签 c opengl

现在我正在学习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

注意: super 引用仅在所有面上映射了一个纹理,因此需要编写额外的代码来将不同的纹理映射到不同的面上。

关于c - OpenGL,如何为金字塔的侧面提供纯色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35155139/

相关文章:

c - 如何在C中获取数组的长度? "sizeof"是解决方案吗?

c++ - 从 btScalar 矩阵获取方向 vector

c++ - 如何避免纹理透明部分的点击事件?

c++ - Eclipse CDT + MinGW + GLEW,键入对 `LoadShaders(char const*, char const*)' 的 undefined reference

opengl - 自由谷底 (./light) : ERROR: Internal error <FBConfig with necessary capabilities not found> in function fgOpenWindow

子窗口绘画引用

c - 由于字符串复制导致段错误

c++ - zlib inflate 方法没有按预期工作

python - 在 Windows 上的 VSCode 中调试 Python C/C++ 扩展

c++ - OpenGL 和单色纹理