Java OpenGL使用glOrtho lwjgl获得黑屏
所以,我制作了一个2d平台。我得到的纹理,控制和一切都很好,直到我决定使游戏有一个滚动相机。我在某个地方读到过,说用glOrtho来移动和缩放相机,但当我打电话给glOrtho时,我的屏幕变黑了,我知道我做错了什么,但不知道该怎么办 在游戏循环之前我得到了这个:Java OpenGL使用glOrtho lwjgl获得黑屏,java,opengl,lwjgl,Java,Opengl,Lwjgl,所以,我制作了一个2d平台。我得到的纹理,控制和一切都很好,直到我决定使游戏有一个滚动相机。我在某个地方读到过,说用glOrtho来移动和缩放相机,但当我打电话给glOrtho时,我的屏幕变黑了,我知道我做错了什么,但不知道该怎么办 在游戏循环之前我得到了这个: glLoadIdentity(); glMatrixMode(GL_PROJECTION); glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); glOrtho(0, GAME_WIDTH, G
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
glOrtho(0, GAME_WIDTH, GAME_HEIGHT, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
*enabling texture_2d and others
我在游戏循环中得到了这个,让摄像机跟随玩家:
glClear(GL_COLOR_BUFFER_BIT);
xOff = player.x - GAME.WIDTH / 2;
yOff = player.y - GAME.HEIGHT / 2;
glOrtho(xOff, xOff + GAME_WIDTH, yOff + GAME_HEIGHT, yOff, 1, -1);
但是它给了我黑屏。。但是,当我在第一次调用glOrtho时更改值是可以的。。我已经在谷歌上搜索了这个问题,但找不到任何帮助
编辑:这是主要课程
package com.org.Game;
import static org.lwjgl.opengl.GL11.*;
import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import com.org.Game.Graphics.Draw;
import com.org.Game.Graphics.Sprite;
import com.org.Game.Graphics.Spritesheet;
import com.org.Game.Level.Level;
import com.org.Game.Level.Entity.Mob.Player;
public class Main {
private static String title = "Platformer";
private static int WINDOW_WIDTH = 800, WINDOW_HEIGHT = 600;
private static int GAME_WIDTH = 320, GAME_HEIGHT = 240;
private boolean exit = false;
private long lastFPS;
private int fps;
private long lastFrame;
private long delta;
private boolean fpscap = true;
private Level lvl;
private Player player;
private int xOff, yOff;
public Main() {
try {
Display.setDisplayMode(new DisplayMode(WINDOW_WIDTH, WINDOW_HEIGHT));
Display.setTitle(title);
Display.setVSyncEnabled(true);
DisplayMode[] modes = Display.getAvailableDisplayModes();
for (int i = 0; i < modes.length; i++) {
if (modes[i].getWidth() == WINDOW_WIDTH && modes[i].getHeight() == WINDOW_HEIGHT && modes[i].getFrequency() == 60 && modes[i].isFullscreenCapable()) {
Display.setDisplayMode(modes[i]);
System.out.println(modes[i].getWidth() + " " + modes[i].getHeight() + " " + modes[i].getBitsPerPixel() + " " + modes[i].getFrequency() + " " + modes[i].isFullscreenCapable());
break;
}
}
// Display.setFullscreen(true);
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
Display.destroy();
System.exit(0);
}
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
glOrtho(0, GAME_WIDTH, GAME_HEIGHT, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR);
glPolygonMode(GL_FRONT, GL_FILL);
lvl = new Level();
lvl.loadLevel("level0.dat");
if (lvl == null) System.out.println("NULL");
player = new Player(16, 16, Sprite.cobalt, lvl);
start();
Spritesheet.tiles.tex.release();
Spritesheet.bg_day.tex.release();
Display.destroy();
System.exit(0);
}
int a;
private void render() {
Draw.clearScreen();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glOrtho(xOff, xOff + GAME_WIDTH, yOff + GAME_HEIGHT, yOff, 1, -1);
glMatrixMode(GL_MODELVIEW);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Draw.setTexture(Spritesheet.bg_day);
Draw.drawBackground(GAME_WIDTH, GAME_HEIGHT, Spritesheet.bg_day);
Draw.setTexture(Spritesheet.tiles);
lvl.renderLevel(GAME_WIDTH, GAME_HEIGHT, xOff, yOff);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
player.render();
}
private void update(long delta) {
player.update(delta);
if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) exit = true;
if (Keyboard.isKeyDown(Keyboard.KEY_Z)) fpscap = true;
if (Keyboard.isKeyDown(Keyboard.KEY_X)) fpscap = false;
}
public void start() {
lastFPS = getTime();
getDelta();
while (!Display.isCloseRequested() && !exit) {
getDelta();
xOff = (int) player.x - GAME_WIDTH / 2;
yOff = (int) player.y - GAME_HEIGHT / 2;
render();
update(delta);
updateFPS();
Display.update();
if (fpscap) Display.sync(120);
}
}
private void getDelta() {
long now = getTime();
delta = now - lastFrame;
lastFrame = now;
}
private void updateFPS() {
fps++;
if (getTime() - lastFPS > 1000) {
lastFPS += 1000;
Display.setTitle(title + " FPS: " + fps);
fps = 0;
}
}
private long getTime() {
return Sys.getTime() * 1000 / Sys.getTimerResolution();
}
public static void main(String[] args) {
new Main();
}
}
package com.org.Game;
导入静态org.lwjgl.opengl.GL11.*;
导入org.lwjgl.LWJGLException;
导入org.lwjgl.Sys;
导入org.lwjgl.input.Keyboard;
导入org.lwjgl.opengl.Display;
导入org.lwjgl.opengl.DisplayMode;
导入com.org.Game.Graphics.Draw;
导入com.org.Game.Graphics.Sprite;
导入com.org.Game.Graphics.Spritesheet;
导入com.org.Game.Level.Level;
导入com.org.Game.Level.Entity.Mob.Player;
公共班机{
私有静态字符串title=“Platformer”;
专用静态内部窗口宽度=800,窗口高度=600;
私有静态整数游戏宽度=320,游戏高度=240;
私有布尔退出=false;
私人长线FPS;
私人int fps;
私人长框架;
私人长三角;
私有布尔fpscap=true;
私有级lvl;
私人玩家;
二等兵;
公用干管(){
试一试{
Display.setDisplayMode(新的显示模式(窗口宽度、窗口高度));
Display.setTitle(标题);
Display.setVSyncEnabled(true);
DisplayMode[]modes=Display.getAvailableDisplayModes();
对于(int i=0;i1000){
lastFPS+=1000;
显示.setTitle(标题+FPS:+FPS);
fps=0;
}
}
私有长getTime(){
返回Sys.getTime()*1000/Sys.getTimerResolution();
}
公共静态void main(字符串[]args){
新的Main();
}
}
这里的问题是,在切换正交投影之前,您没有将矩阵模式更改为GL_投影,据我所知-因为您的第二个代码段没有矩阵模式状态更改。那么,试试这个:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
xOff = player.x - GAME.WIDTH / 2;
yOff = player.y - GAME.HEIGHT / 2;
glOrtho(xOff, xOff + GAME_WIDTH, yOff + GAME_HEIGHT, yOff, 1, -1);
glMatrixMode(GL_MODELVIEW);
private void render() {
// glViewport does not depend on the matrix state
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
Draw.clearScreen();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(xOff, xOff + GAME_WIDTH, yOff + GAME_HEIGHT, yOff, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
// probably don't want to blend the background
// actually get your blending stuff right, I removed it entirely
// because it's completely unclear from your code what you want
// to blend which way
glDisable(GL_BLEND);
Draw.setTexture(Spritesheet.bg_day);
Draw.drawBackground(GAME_WIDTH, GAME_HEIGHT, Spritesheet.bg_day);
Draw.setTexture(Spritesheet.tiles);
lvl.renderLevel(GAME_WIDTH, GAME_HEIGHT, xOff, yOff);
// probably needs its texture set.
player.render();
}
请记住,此代码片段将重置您的转换矩阵,因此任何glTransform()或glRotate()调用或glScale()调用当然都将被取消,但由于这是在游戏循环的开始,并且每勾一次都会运行,我怀疑这不应该是个问题。您的代码有两个问题:您正在执行“OpenGL初始化”. 为什么?OpenGL是一个状态机,它不会被初始化。你把OpenGL放在你需要的状态,就在你需要它的时候。构造函数中的大多数OpenGL调用都是不必要的,没有任何效果。OpenGL的大部分内容应该只在渲染函数中完成。