使用redBook

时间:2017-03-30 01:37:30

标签: opengl glut

我试图在redBook中的this popular OpenGl tutorial之后画一个二十面体。

我正在使用GLUT来处理窗口。

这是我的完整代码。主要是教程中的代码加上使用GLUT的一些文书工作

#include <stdio.h>
#include <GL/glut.h>
#define X .525731112119133606
#define Z .850650808352039932

void mouseEventHandler(int button, int state, int x, int y){
}

void display() {
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    static GLfloat vdata[12][3] = {
        {-X,0.0,Z}, {X,0.0,Z}, {-X,0.0,-Z}, {X,0.0,-Z},
        {0.0,Z,X}, {0.0,Z,-X}, {0.0,-Z,X}, {0.0,-Z,-X},
        {Z,X,0.0}, {-Z,X,0.0}, {Z,-X,0.0}, {-Z,-X,0.0},
    };

    static GLuint tindices[20][3] = { 
        {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},    
        {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},    
        {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6}, 
        {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} };

    int i;

    glBegin(GL_TRIANGLES);
    for (i = 0; i < 20; i++){
        glNormal3fv(&vdata[tindices[i][0]][0]);
        glVertex3fv(&vdata[tindices[i][0]][0]);
        glNormal3fv(&vdata[tindices[i][1]][0]);
        glVertex3fv(&vdata[tindices[i][1]][0]);
        glNormal3fv(&vdata[tindices[i][2]][0]);
        glVertex3fv(&vdata[tindices[i][2]][0]);
    }
    glEnd();
    glFlush ( );
}

void windowSetup(){
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

    glutInitWindowPosition(80, 80);
    glutInitWindowSize(1000,1000);

    glutCreateWindow("OpenGL Ico");

    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode( GL_MODELVIEW);
    glLoadIdentity();           
    gluOrtho2D( -2.0, 2.0, -2.0, 2.0 );
}

int main(int argc, char** argv) {

    glutInit(&argc, argv);
    windowSetup();

    glutDisplayFunc(display);
    glutMouseFunc(&mouseEventHandler);
    glutMainLoop();
}

这是我的输出: My icosahedron output 这与预期的输出非常不同:
enter image description here

有人知道为什么这些差异如此之大?

差异似乎是:

  • 我的二十面体缺少面孔

  • 从不同的角度看我的二十面体

  • 我的二十面体点亮了

第一个是最紧迫的。我注意到,当我将glMatrixMode( GL_MODELVIEW);更改为glMatrixMode( GL_PROJECTION);时,未出现的面孔会出现,而当前出现的面孔会消失。有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

  1. 缺少面孔

    很可能你只是错误的指数顺序。在这种情况下,逆转它们将解决问题。要检查这一点,您可以尝试:

    glDisable(GL_CULL_FACE);
    

    如果问题消失我是对的。如果不是这样的话(就像Z_NEAR过于接近相机切割那样但看起来会有所不同。)

    要识别正确的面孔,您可以glColor使用i作为检查

    if (i==5) glColor3f(1.0,0.0,0.0); else glColor3f(1.0,1.0,1.0);
    

    在这种情况下,红脸将是第6位{8,3,10}

  2. <强>照明

    您使用顶点坐标作为法线,因此不要指望 FLAT 着色。此外,我没有看到你在这里设置任何灯(但可以隐藏在 GLUT 某处我不使用它)。为了解决这个问题,每个三角形只使用一次法线。所以平均你得到的3个法线并从中得到一个单位向量并使用它(在每个三角形的第一个glVertex调用之前)。

  3. <强>取向

    只需将GL_MODELVIEW旋转到所需的方向即可。标准视角GL_PROJECTION的{​​{1}}轴为观察方向,z轴与屏幕匹配(x,y为单位)

  4. [Edit1]我尝试了您的代码

    所以问题是你得到了索引的逆序,然后是OpenGL中的默认多边形缠绕(至少在我的环境中)和错误的法线这里固定代码:

    GL_MODELVIEW

    预览:

    icosahedron

    它是一个截图,我的物体在旋转,所以不要指望你期望的方向正确。