繁体   English   中英

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 glDisable(GL_TEXTURE_2D); 在渲染调用之前(在您的情况下,在case MENU:之前)。 但是不要忘记在完成并准备再次绘制纹理后立即再次启用它(在您的情况下,请在glRectf()之后调用glEnable(GL_TEXTURE_2D); )。 这可能不是您遇到问题的原因,但是稍后将成为问题。

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

我希望我已经清楚了,这会有所帮助。

祝好运! :)

// SK

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM