【问题标题】:drawing a cube with six different colored faces in opengl在opengl中绘制一个有六个不同颜色面的立方体
【发布时间】:2016-08-25 06:45:31
【问题描述】:

我在 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);
}

我的程序的输出是这样的:

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

【问题讨论】:

  • 使用 GL_FLOAT 颜色时,颜色必须在 [0, 1] 范围内。
  • 谢谢,如果我想使用 [0,255] 范围颜色怎么办?我应该使用什么来代替 GL_FLOAT?
  • @splunk 然后使用其中一种整数类型。
  • GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT 确保您的颜色数组也具有您选择的类型。
  • @splunk 我认为,您的顶点顺序错误。默认情况下逆时针,您使用顺时针顺序。当然,你有错误的颜色(你应该使用 0.0f-1.0f)

标签: c++ opengl


【解决方案1】:

虽然 Armen 是正确的,但仍有一些地方是错误的。

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

【讨论】:

  • 并且不要忘记在创建 OpenGL 上下文时实际向操作系统请求一些深度位。除非您要求,否则您可能不会得到任何东西。
【解决方案2】:

您可以使用GLfloat (GL_FLOAT),但必须使用 [0.0, 1.0] 的范围。

或者您使用GLubyte (GL_UNSIGNED_BYTE),那么您将不得不使用范围[0, 255]

这对你有帮助:https://www.opengl.org/wiki/OpenGL_Type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2014-07-25
    相关资源
    最近更新 更多