【问题标题】:Drawing a 2d overlay over a 3d scene in lwjgl/opengl在 lwjgl/opengl 中的 3d 场景上绘制 2d 叠加层
【发布时间】:2014-06-15 21:01:26
【问题描述】:

我正在尝试在 3d 场景的顶部绘制一个显示应用程序 fps 的 hud。我知道这个问题的答案与更改初始化代码并将其切换回来有关。你知道,这些东西:

GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 800, 600, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);

这是我需要渲染屏幕的 2d 部分的代码。在相关说明中,我很难理解所有这些代码的作用,并且还没有找到很好的资源。谁能指出我正确的方向。大多数教程不包含设置代码,我认为他们假设人们知道使用什么(但我不知道!)。

【问题讨论】:

  • 我会为你解释glOrtho电话。那是您的投影矩阵,它基本上定义了您的视图如何投影到您的视口中。正交投影矩阵是没有透视的;投影点的 X 和 Y 位置不会随着它们变得更远/更近而增长/缩小。您已经定义了投影,其中 0,600 是左下角,800,0 是右上角。您还定义了 Z 值的范围,使得 1 是离您最近的点,而 -1 是最远的点(这实际上与惯例相反,但如果您不要使用深度测试)。
  • 您需要了解的其余内容比我在答案中解释的要复杂和耗时。要回答这个问题,需要告诉你如何加载字体等。这是一个非常复杂的过程,最好的办法是找到一个教程……如果你在实际实现文本渲染时遇到问题,那么这将是在 StackOverflow 上提出另一个问题的好时机。现在这个问题太宽泛了,很遗憾:-\

标签: opengl 3d 2d lwjgl


【解决方案1】:

我正在使用这些方法:

public static void make3D() {

    glPopAttrib();
    glPushAttrib(GL_ENABLE_BIT);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    glViewport(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // FOV = Field of View
    // Aspect ration
    // zNear and zFar (Viewing range)
    gluPerspective(FOV,(float) SCREEN_WIDTH / SCREEN_HEIGHT,0.1f,1000f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}

用于更改为 3D 视图,并且

public static void make2D() {

    glPopAttrib();
    glPushAttrib(GL_ENABLE_BIT);

    glViewport(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT,0,-1,1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}

用于切换到 2D 视图。

Java 似乎没有任何问题,如果我错了,请纠正我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多