OpenGL显示正方形而不是立方体

时间:2020-07-05 13:21:29

标签: c++ opengl glfw

我开始在OpenGL中使用修补程序,并且我想绘制一个立方体。我去了一个教程,然后去了,只得到了这个奇怪的方块。

这是我的代码。

#include <GLFW/glfw3.h>
void drawCube() {
    float rotate_x{ 193 };
    float rotate_y{ 112 };
    glBegin(GL_POLYGON);

    glColor3f(1.0, 0.0, 0.0);     glVertex3f(0.5, -0.5, -0.5);      
    glColor3f(0.0, 1.0, 0.0);     glVertex3f(0.5, 0.5, -0.5);      
    glColor3f(0.0, 0.0, 1.0);     glVertex3f(-0.5, 0.5, -0.5);     
    glColor3f(1.0, 0.0, 1.0);     glVertex3f(-0.5, -0.5, -0.5);      

    glColor3f(1.0, 1.0, 1.0);
    glVertex3f(0.5, -0.5, 0.5);
    glVertex3f(0.5, 0.5, 0.5);
    glVertex3f(-0.5, 0.5, 0.5);
    glVertex3f(-0.5, -0.5, 0.5);

    glColor3f(1.0, 0.0, 1.0);
    glVertex3f(0.5, -0.5, -0.5);
    glVertex3f(0.5, 0.5, -0.5);
    glVertex3f(0.5, 0.5, 0.5);
    glVertex3f(0.5, -0.5, 0.5);

    glColor3f(0.0, 1.0, 0.0);
    glVertex3f(-0.5, -0.5, 0.5);
    glVertex3f(-0.5, 0.5, 0.5);
    glVertex3f(-0.5, 0.5, -0.5);
    glVertex3f(-0.5, -0.5, -0.5);
    
    glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.5, 0.5, 0.5);
    glVertex3f(0.5, 0.5, -0.5);
    glVertex3f(-0.5, 0.5, -0.5);
    glVertex3f(-0.5, 0.5, 0.5);
    
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(0.5, -0.5, -0.5);
    glVertex3f(0.5, -0.5, 0.5);
    glVertex3f(-0.5, -0.5, 0.5);
    glVertex3f(-0.5, -0.5, -0.5);

    glLoadIdentity();
    glRotatef(30, 0.0, 1.0, 0.0);

    glEnd();
}

int main(void)
{
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Triangle", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);

        drawCube();
        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

我正在使用GLFW进行此操作,并在Visual Studio 2017 Community Edition中进行构建。 我还尝试在drawCube()的末尾旋转它。 我遵循的教程是https://www.wikihow.com/Make-a-Cube-in-OpenGL,但是我对它进行了一些微调以使用glfw。

2 个答案:

答案 0 :(得分:4)

您正在绘制具有24个顶点的单个多边形。由于OpenGL要求多边形必须是凹面且是平面的(不是您的数据),所以它会绘制一些随机的东西。

如果要绘制一个立方体,则必须分别为每个面将调用glBegin(GL_POLYGON)glEnd()分开绘制(如本教程在第4部分的第二个代码示例中所示),或者您可以将原始模式更改为GL_QUADS

请注意,您正在使用的OpenGL版本(固定功能管道)已经过时了10多年。您可能要考虑切换到(至少)OpenGL 3.3核心配置文件并使用着色器。

答案 1 :(得分:0)

  1. 相机

    我看不到您在任何地方设置矩阵...所以我敢打赌,无论您如何调整渲染的轴对齐数据,您的矩阵都是单位的2D视图。

    gluPerspective用于GL_PROJECTION。为新手正确设置透视3D视图(在-Z方向上与恒等矩阵完全相反)上设置透视图有点麻烦,因此网格处于可见区域。

  2. CULL_FACE

    对于初学者,请尝试glDisable(GL_CULL_FACE),因为您的数据很可能包含缠绕错误,并且您将不知道自己已经拥有什么样的面孔。

  3. 立方体网格

    现在,您正在使用glVertex对其进行硬编码,调用它更容易为点和面(QUADS或TRIANGLES)使用单独的数组。另外,正如BDL指出的那样,您在glBegin/glEnd调用中使用了禁止的命令,由于错误处理,它们会被忽略并减慢运行速度。

  4. 照明

    要使3D更好,您还应该为每张脸添加法线并启用灯光。否则,您需要为每个面孔涂上不同的颜色才能看到“ 3D”。

看看我的:

只需忽略高级内容(GLSL,VAO / VBO ...),然后查看视图设置和立方体网格数据。您只需要使用for循环而不是VAO / VBO来渲染它。例如:

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
#ifndef vao_indices
glBegin(GL_QUADS);
for (int i=0;i<6*4*3;i+=3)
    {
    glNormal3fv(vao_nor+i);
    glColor3fv (vao_col+i);
    glVertex3fv(vao_pos+i);
    }
glEnd();
#else
int i,j,k;
const GLfloat vao_nor[]=
    {
//   nx   ny   nz
     0.0, 0.0,-1.0,
     0.0, 0.0,+1.0,
     0.0,-1.0, 0.0,
    +1.0, 0.0, 0.0,
     0.0,+1.0, 0.0,
    -1.0, 0.0, 0.0,
    };
glBegin(GL_QUADS);
for (j=0;j<6*4;j++)
    {
    i=vao_ix[j]; i+=i+i;
    k=j>>2; k+=k+k;
    glNormal3fv(vao_nor+k);
    glColor3fv (vao_col+i);
    glVertex3fv(vao_pos+i);
    }
glEnd();
#endif
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);

在两种模式下(索引和直接)在链接的质量检查中使用gl_simple中的网格。