Java OpenGL纹理朝向错误方向的问题
我在一个新游戏中创建了一个测试纹理,出于某种原因,当我在游戏中实现它时,纹理是水平翻转的,而不是垂直翻转的。为什么会发生这种情况 这是应用程序的照片 正如你所看到的,这个小家伙被水平翻转,几乎就像在睡觉一样。他应该垂直面对。为什么会发生这种情况,我该如何防止?我将发布两个涉及的类 球员级别:Java OpenGL纹理朝向错误方向的问题,java,opengl,lwjgl,textures,Java,Opengl,Lwjgl,Textures,我在一个新游戏中创建了一个测试纹理,出于某种原因,当我在游戏中实现它时,纹理是水平翻转的,而不是垂直翻转的。为什么会发生这种情况 这是应用程序的照片 正如你所看到的,这个小家伙被水平翻转,几乎就像在睡觉一样。他应该垂直面对。为什么会发生这种情况,我该如何防止?我将发布两个涉及的类 球员级别: import java.io.IOException; import org.newdawn.slick.opengl.Texture; import org.newdawn.slick.open
import java.io.IOException;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
public class Player {
public Texture playerTexture;
// Positions & speed
public float xPos = 20.0f; // This is initial
public float yPos = 450.0f; // Same as above.
private float velocity = 20;
public float gravityForce = 6;
public float jumpVelocity = 25;
private static int moveSpeed = 30 / 2;
public boolean isSupported = false; // Once again, initial value.
boolean canJump = true;
// movement methods
public Texture grabTexture() {
try {
playerTexture = TextureLoader.
getTexture("PNG", ResourceLoader
.getResourceAsStream
("resources/test_char.png"));
} catch (IOException e) {
e.printStackTrace();
}
return playerTexture;
}
public void applyGravity() {
}
private void printPos(String moveMethod) {
System.out.println(moveMethod + " X: "
+ xPos + " Y: " + yPos);
}
public void moveRight() {
xPos += moveSpeed;
printPos("Moving right!");
}
public void moveLeft() {
xPos -= moveSpeed;
printPos("Moving left!");
}
public void jump() {
if (!isSupported) {
}
}
public void shoot() {
// do shooty stuff here
}
}
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
public class Main {
private void display() {
try {
Display.setDisplayMode(new DisplayMode(1000, 550));
Display.setTitle("Unnamed Platformer Game");
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
System.exit(0);
}
// OpenGL
while (!Display.isCloseRequested()) {
initGL();
player.applyGravity();
Display.update();
Display.sync(60); // sync to 60 fps
if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
player.moveRight();
} else if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
player.moveLeft();
} else if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
player.jump();
}
}
Display.destroy();
}
private void initGL() {
// initial OpenGL items for 2D rendering
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 1000, 550, 0, 1, -1);
// start rendering player image
player.grabTexture().bind();
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(player.xPos, player.yPos);
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(player.xPos + 100, player.yPos);
GL11.glTexCoord2f(1, 0);
GL11.glVertex2f(player.xPos + 100, player.yPos + 100);
GL11.glTexCoord2f(1, 1);
GL11.glVertex2f(player.xPos, player.yPos + 100);
GL11.glTexCoord2f(0, 1);
GL11.glEnd(); // stop rendering this image
}
Player player = new Player();
public static void main(String[] args) {
Main main = new Main();
main.display();
}
}
主(启动器)类:
问题是您调用这些函数的顺序不正确。无论何时调用glVertex2f
,OpenGL都将获取当前设置的任何属性,并将其用于顶点。在本例中,您将在设置顶点后设置纹理坐标,因此坐标“延迟”一个顶点。如果你交换每一对这样的呼叫,它应该可以工作
此外,您对
glOrtho
的调用将交换顶部和底部参数。底部值是y值应该位于屏幕底部的值(在本例中为0)。最高值也是如此。Posttest\u char.png
。据我们所知,这个小家伙可能在磁盘的侧面。你的nearVal
和farVal
glOrtho的参数可能是向后的。@genpfault你可以在resources@genpfault下找到他,他是40x40,btw@DrewMcGowen我不这么认为。非常非常接近。你可以翻转纹理,只是方式不对。纹理现在是垂直的,但它是颠倒的。你说的几乎所有东西都起作用了,但纹理仍然没有翻转。这些都是对代码的重大更改,只有像我这样的初学者才能做到,但纹理仍然没有固定。如果交换顶部/底部参数不会翻转纹理,我不确定问题出在哪里(可能是纹理类将其倒置加载)。不知道。现在,我把他倒过来重新粉刷,解决了这个问题。可能是个坏主意,但我暂时不谈。@hasherr:使用通常的转换设置,OpenGL将纹理图像原点放在左下角。但是大多数图像文件格式将原点放在左上角。这种组合使它看起来“颠倒”。
GL11.glVertex2f(player.xPos, player.yPos);
GL11.glTexCoord2f(0, 0);