LWJGL 在纹理上绘制矩形

LWJGL draw rect over texture

我使用以下方法绘制纹理四边形

tex.bind();
    glTranslatef(x, y, 0);
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(0, 0);

    glTexCoord2f(1, 0);
    glVertex2f(width, 0);

    glTexCoord2f(1, 1);
    glVertex2f(width, height);

    glTexCoord2f(0, 1);
    glVertex2f(0, height);

    glEnd();
    glLoadIdentity();

使用这些配置:

try {
        Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
        Display.create();

    } catch (LWJGLException e) {
        e.printStackTrace();
    }
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    GL11.glDisable(GL11.GL_DEPTH_TEST);
    GL11.glDisable(GL11.GL_LIGHTING);
    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    GL11.glClearDepth(1);

但是现在我想通过在屏幕上绘制一个矩形来为游戏添加一个菜单,但是当我这样做时,所有内容都会变成红色(如果我将红色设置为颜色)

    case MENU:
    GL11.glColor3f(1.0f, 0.0f, 0.0f);
    glRectf(50, 50, 50, 50);

两件事:

  1. 每当您使用颜色而不是纹理进行绘制时,请确保在渲染调用之前通过调用 glDisable(GL_TEXTURE_2D); 来禁用 GL_TEXTURE_2D(在您的情况下是在 case MENU: 之前) .但是不要忘记在您完成并准备再次绘制纹理后立即再次启用它(在您的情况下,在 glRectf() 之后调用 glEnable(GL_TEXTURE_2D);)。这可能不是您遇到问题的原因,但稍后会成为问题。

  2. 之所以一切都变成红色,是因为每当渲染纹理时,当前绑定的颜色会影响从纹理渲染的颜色分量 .您正在绘制的纹理中的每个像素都由 3 或 4 个值组成。 RedGreenBlue 和可能的 Alpha 通道.由于您将颜色绑定到红色,并且在绘制纹理之前不更改它,因此 OpenGL 仅绘制纹理中每个像素的红色分量。因此,在您的纹理中,红色分量的范围为 0-1,而绿色和蓝色值将保持在常量 0。 要解决此问题,只需在渲染红色矩形后调用 glColor3f(1, 1, 1);。这会将渲染颜色设置回白色(默认),因此 OpenGL 将成功绘制纹理像素的所有 3 个颜色分量。

我希望我已经说清楚了并且这对您有所帮助。

祝你好运! :)

//SK