0

我已经在 OpenGL 中编码了几个月,并且主要从事 3D 工作。我的 init 方法如下所示:

private void initGl() {
    glViewport(0, 0, Display.getWidth(), Display.getHeight());
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLU.gluPerspective(45.0f, Display.getWidth() / Display.getHeight(), 1.0f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnable(GL_FOG);
    glFogi(GL_FOG_MODE, GL_EXP2);
    glFogf(GL_FOG_DENSITY, density);
    glHint(GL_FOG_DENSITY, GL_FASTEST);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    vbo = new VBO();
}

这一切都是必要的吗?我想知道我是否在正确的地方调用 loadIdentity(),我也应该在 gluPerspective 之后调用它吗?基本上,何时是调用 loadIdentity() 的合适时间?

4

1 回答 1

1

OpenGL 新手的一个常见误解是,OpenGL 以某种方式被“初始化”。OpenGL 是一个基于状态的绘图机。这意味着“init”函数中的所有这些函数都设置了一些与绘图相关的状态。状态机的特殊之处在于,在实际使用时,您可以在每次需要时设置所有状态,就在您需要的时候。或者换句话说:没有像“OpenGL 初始化”阶段这样的东西。“init”函数中的大多数调用实际上都属于绘图代码。

主要的例外是真正一次性初始化的 OpenGL 对象,如纹理或 VBO。

于 2013-02-06T22:57:07.077 回答