LWJGL在纹理上绘制矩形

时间:2015-02-19 13:31:08

标签: java opengl lwjgl

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

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 个答案:

答案 0 :(得分:1)

两件事:

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

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

  3. 我希望我已经清楚了,这有帮助。

    祝你好运! :)

    // SK