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);
两件事:
每当您使用颜色而不是纹理进行绘制时,请确保在渲染调用之前通过调用 glDisable(GL_TEXTURE_2D);
来禁用 GL_TEXTURE_2D
(在您的情况下是在 case MENU:
之前) .但是不要忘记在您完成并准备再次绘制纹理后立即再次启用它(在您的情况下,在 glRectf()
之后调用 glEnable(GL_TEXTURE_2D);
)。这可能不是您遇到问题的原因,但稍后会成为问题。
之所以一切都变成红色,是因为每当渲染纹理时,当前绑定的颜色会影响从纹理渲染的颜色分量 .您正在绘制的纹理中的每个像素都由 3 或 4 个值组成。 Red、Green、Blue 和可能的 Alpha 通道.由于您将颜色绑定到红色,并且在绘制纹理之前不更改它,因此 OpenGL 仅绘制纹理中每个像素的红色分量。因此,在您的纹理中,红色分量的范围为 0-1,而绿色和蓝色值将保持在常量 0。
要解决此问题,只需在渲染红色矩形后调用 glColor3f(1, 1, 1);
。这会将渲染颜色设置回白色(默认),因此 OpenGL 将成功绘制纹理像素的所有 3 个颜色分量。
我希望我已经说清楚了并且这对您有所帮助。
祝你好运! :)
//SK
我使用以下方法绘制纹理四边形
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);
两件事:
每当您使用颜色而不是纹理进行绘制时,请确保在渲染调用之前通过调用
glDisable(GL_TEXTURE_2D);
来禁用GL_TEXTURE_2D
(在您的情况下是在case MENU:
之前) .但是不要忘记在您完成并准备再次绘制纹理后立即再次启用它(在您的情况下,在glRectf()
之后调用glEnable(GL_TEXTURE_2D);
)。这可能不是您遇到问题的原因,但稍后会成为问题。之所以一切都变成红色,是因为每当渲染纹理时,当前绑定的颜色会影响从纹理渲染的颜色分量 .您正在绘制的纹理中的每个像素都由 3 或 4 个值组成。 Red、Green、Blue 和可能的 Alpha 通道.由于您将颜色绑定到红色,并且在绘制纹理之前不更改它,因此 OpenGL 仅绘制纹理中每个像素的红色分量。因此,在您的纹理中,红色分量的范围为 0-1,而绿色和蓝色值将保持在常量 0。 要解决此问题,只需在渲染红色矩形后调用
glColor3f(1, 1, 1);
。这会将渲染颜色设置回白色(默认),因此 OpenGL 将成功绘制纹理像素的所有 3 个颜色分量。
我希望我已经说清楚了并且这对您有所帮助。
祝你好运! :)
//SK