【问题标题】:My Engine flickers when I try to render 2D and 3D当我尝试渲染 2D 和 3D 时,我的引擎会闪烁
【发布时间】:2014-01-08 04:36:51
【问题描述】:

我正在与 LWJGL 合作制作游戏。这是非常基本的。在实现任何类型的 gpu 渲染或花哨的模型加载器之前,我想确保我至少可以同时渲染 2D 和 3D;当你四处走动时,我的游戏有一个 gui。或者至少,它应该是。这是我的初始化代码;当我只渲染 3D 时,不会发生闪烁。

public void clearGL() {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glLoadIdentity();
}

public void init3D() {

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective((float) 68, Engine.size[0] / Engine.size[1], 0.3f, 1000);
    glMatrixMode(GL_MODELVIEW);

    glEnable(GL_TEXTURE_2D);
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);


}

public void render3D(Camera c) {

    init3D();
    clearGL();

    //Do translations here
    glTranslatef(0f, -5f, 0f);


    glColor3f(0, 1, 0);
    glBegin(GL_QUADS);
    glVertex3f(-50f, 0f, -50f);
    glColor3f(0, 0, 1);
    glVertex3f(50f, 0f, -50f);
    glColor3f(1, 0, 0);
    glVertex3f(50f, 0f, 50f);
    glColor3f(0, 1, 1);
    glVertex3f(-50f, 0f, 50f);
    glEnd();


}

public void init2D() {

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, Engine.size[0], 0, Engine.size[1], -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);
    glLoadIdentity();


}

public void render2D() {
    init2D();

    glBegin(GL_QUADS);
    glVertex2f(0f, 50f);
    glVertex2f(50f, 50f);
    glVertex2f(50f, 0f);
    glVertex2f(0f, 0f);

    glPopMatrix();

}

我完全可以分辨出它的渲染,因为我正在绘制一个四边形来表示 JBullet 中的地板。出于某种原因,它位于相机头部上方,但是当我将相机向上平移时,它会变得更远,这就是我将相机转换为 -5 的原因。那是另一个问题,改天。

【问题讨论】:

    标签: java opengl 3d buffer lwjgl


    【解决方案1】:

    如果您打算在 Z=0 处绘图,您应该真的考虑在从 3D“切换”到 2D 时禁用深度测试>(深度范围的中间)。如果您不这样做,则 3D 场景中一半的可见空间可能会阻碍您的 2D 绘图。或者,您可以将您的 glVertex2f (...) 调用替换为 glVertex3f (x,y, -1.0),以将 2D 中的所有内容带到深度范围的最前端。

    但是关于这一切的真正奇怪的事情是你的render2D (...)函数的结束:你从来没有调用glEnd (...)并且你弹出一个你似乎从未推送过的矩阵。这是不匹配怪异的两个来源,其中任何一个都可能导致您的问题。

    【讨论】:

    • OP 也应该调用 glClearDepth(1)。
    • 为什么?这将是完全多余的,因为他们已经在init3D (...) 中这样做了。更不用说,这是开始的默认值。
    • 没关系,没看到。但是在 2D 中渲染时深度位不会改变吗?他不应该清除吗?
    • 清除深度缓冲区可能不会有什么坏处,但绝对没有必要。由于这是正交 2D 并且所有这些顶点都处于相同的 Z 值,四边形将生成相同的深度值 - 如果使用 Z=-1,则四边形将 总是在当前设置下通过深度测试。不幸的是,这不是当前代码的工作方式 - 它在 Z=0 处绘制,这是此特定设置中深度缓冲区的确切中间,并且可能被任何 3D 对象覆盖场景。
    猜你喜欢
    • 2022-12-04
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2018-08-04
    • 2019-06-18
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多