c++ - 在 opengl 中绘制具有六个不同颜色面的立方体

标签 c++ opengl

我在 OpenGL 中绘制了一个立方体,但我希望立方体的每个面都填充一种颜色。

这就是我所做的,我不知道为什么只有2张脸被填充了颜色。

void DrawCube(GLfloat centerPosX, GLfloat centerPosY, GLfloat centerPosZ, GLfloat edgeLength)
{
    GLfloat halfSideLength = edgeLength * 0.5f;

    GLfloat vertices[] =
    {
        // front face
        centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top left
        centerPosX + halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top right
        centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom right
        centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom left

        // back face
        centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top left
        centerPosX + halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top right
        centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right
        centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom left

        // left face
        centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top left
        centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top right
        centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right
        centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom left

        // right face
        centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top left
        centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top right
        centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right
        centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom left

        // top face
        centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top left
        centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top right
        centerPosX + halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // bottom right
        centerPosX + halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // bottom left

        // bottom face                                                                                                                                                                           // right face
        centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // top left
        centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // top right
        centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right
        centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom left                                                                                                                                                                                                                                                                                                                                                                                                                                                  centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right                                                                                                                                                                                                                                                                                                                                                                                                                                                  centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength  // bottom left
    };

    GLfloat colour[] = {
        255, 0, 0,
        255, 0, 0,
        255, 0, 0,
        255, 0, 0,
        0, 255, 0,
        0, 255, 0,
        0, 255, 0,
        0, 255, 0,
        0, 0, 255,
        0, 0, 255,
        0, 0, 255,
        0, 0, 255,
        100,100,100,
        100,100,100,
        100,100,100,
        100,100,100,
        200,200,200,
        200,200,200,
        200,200,200,
        200,200,200,
        40,220,75,
        40,220,75,
        40,220,75,
        40,220,75,
    };

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glColorPointer(3, GL_FLOAT, 0, colour);
    glDrawArrays(GL_QUADS, 0, 24);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
}

我的程序的输出是这样的: enter image description here

如你所见,我有 1 张红脸、1 张绿脸和 4 张非彩色脸

最佳答案

虽然 Armen 是正确的,但还有其他问题。

您忘记开启深度测试。这就是为什么你可以看到红色的一面,即使从你的角度来看你不应该看到。这也是为什么您可以“透过”前墙看到后绿墙的原因。

关于c++ - 在 opengl 中绘制具有六个不同颜色面的立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39138419/

相关文章:

java - 如何在 OpenGL/LWJGL 显示列表上绘制纹理?

c++ - OpenGL 透视矩阵不起作用

c - 如何在 OpenGL 中获取矩阵堆栈的当前大小?

opengl - 每个 VBO 都需要一个 VAO 吗?

c++ - 在 GLSL 中重新使用内置 OpenGL 变量定义自己的制服。为什么?

c++ - 如何从 Visual Studio 调试器执行所有进程内存的高级搜索?

包含 header 时的 C++ OpenGL LNK2001

c++ - 为什么我的 C++ 异常没有被捕获?

c++ - 使用 if 条件隐式 bool 求值

c++ - 从字符串输入格式调用 C++ 成员函数