好的,所以我目前正在使用LWJGL在java上进行2D游戏。我对java及其工作原理有相当深入的了解,并且了解游戏的工作原理和LWJGL / openGL,但是我在渲染纹理方面遇到了这个非常奇怪的问题。我确定我的一种绘制方法是罪魁祸首..
public static void texturedTriangleInverted(float x, float y, float width, float height, Texture texture) {
GL11.glPushMatrix();
{
GL11.glTranslatef(x, y, 0);
texture.bind();
GL11.glBegin(GL11.GL_TRIANGLES);
{
GL11.glVertex2f(width / 2, 0);
GL11.glTexCoord2f(width / 2, 0);
GL11.glVertex2f(0, height);
GL11.glTexCoord2f(0, 1);
GL11.glVertex2f(width, height);
GL11.glTexCoord2f(1, 1);
}
GL11.glEnd();
}
GL11.glPopMatrix();
}
所以会发生的事情是,如果我用这个方法渲染任何东西,渲染的下一个东西看起来就像在一端被压缩并在另一端被拉伸,即使渲染的下一个东西没有用这个方法渲染。我几乎肯定它与我传递给Gl11.glTexCoord2f(float x, float y)
方法的论点有关,但我无法弄清楚如何修复它。
这是我的openGL初始化代码
private void initGL() {
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, Strings.DISPLAY_WIDTH, 0, Strings.DISPLAY_HEIGHT, -1, 1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_TEXTURE_BINDING_2D);
GL11.glViewport(0, 0, Strings.DISPLAY_WIDTH, Strings.DISPLAY_HEIGHT);
GL11.glClearColor(0, 0, 1, 0);
GL11.glDisable(GL11.GL_DEPTH_TEST);
}
我的游戏循环代码
private void gameLoop() {
while (!Display.isCloseRequested()) {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL11.glLoadIdentity();
GL11.glTranslatef(Strings.transX, Strings.transY, 0);
this.level.update();
this.level.render();
Display.update();
Display.sync(Strings.FPS_CAP);
}
Keyboard.destroy();
Display.destroy();
}
我的纹理加载代码(注意我使用光滑来加载我的纹理)
public static final Texture loadTexture(String location) {
try {
if (textureExists(location)) {
return TextureLoader.getTexture("png", new BufferedInputStream(new FileInputStream(new File(location))), false);
} else {
System.err.println("txture does not exist");
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
答案 0 :(得分:0)
您需要在glTexCoord
引用之前指定glVertex
,而不是之后。这与glColor
和glNormal
相同,glVertex
使用您设置的最后一个属性。