[英]Why isn't my game rendering properly?
我正在和朋友一起開發引擎,確實發生了一些奇怪的事情。 我相信我已經在LWJGL中設置了所有內容,並且應該在即時模式下渲染一個灰色矩形,但該矩形不會出現。 我們將其直接放置在相機的外面(它代表地面),但仍然不存在。 我敢肯定,這是一個很常見的問題,但是在Google中輸入“為什么不是我的opengl渲染”會為我帶來數千個結果。 因此,我將向您展示其源代碼的精簡版。
這是引擎代碼:(極其精簡)
public class Engine {
private static int[] size = { 1200, 900 };
private static final DisplayMode DISPLAY_MODE = new DisplayMode(size[0], size[1]);
public static PhysicsHandler physicsHandler;
public static Thread physicsThread;
public static Canvas canvas;
public Engine() {
loadGame();
setUpDisplay();
while (!Display.isCloseRequested()) {
render();
Display.update();
Display.sync(60);
}
cleanUp();
}
public static void main(String[] args) {
new Engine();
}
private static void setUpDisplay() {
try {
Display.setDisplayMode(DISPLAY_MODE);
Display.setVSyncEnabled(true);
Display.setTitle("Hello, world!");
Display.create();
canvas = new Canvas();
} catch (LWJGLException e) {
System.err.println("Couldn't set up the display");
Display.destroy();
System.exit(1);
}
}
public void render() {
canvas.render();
}
private static void cleanUp() {
physicsThread = null;
canvas.cleanUp();
Display.destroy();
}
}
這是畫布(又稱為渲染代碼):
import org.lwjgl.opengl.Display;
import org.lwjgl.util.vector.Vector3f;
public class Canvas {
public void render(Vector3f pos, Vector3f rot) {
//not used until I have a proper camera
}
public void render() {
render3D();
}
public void clearGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
}
public void init3D() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90, (float) Display.getWidth() / (float) Display.getHeight(), 0.03f,20f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_FOG);
}
public void render3D() {
glRotatef(5f, 1f, 0f, 0f);
init3D();
clearGL();
System.out.println("Trying to render");
glBegin(GL_QUADS);
glColor4f(0.6f, 0.6f, 0.6f, 1);
glVertex4f(-50, 0, -50, 1);
glColor4f(0.85f, 0.85f, 0.85f, 1);
glVertex4f(-50, 0, +50, 1);
glColor4f(0.75f, 0.75f, 0.75f, 1);
glVertex4f(+50, 0, +50, 1);
glColor4f(0.5f, 0.5f, 0.5f, 1);
glVertex4f(+50, 0, -50, 1);
glEnd();
}
public static void cleanUp() {
}
}
我是否無法正確設置狀態?
透視投影的遠裁剪平面設置為20
,但幾何范圍為50
。 整個矩形距離最遠的點都可以繪制。
另外,假設您要繪制一個不平行於所看方向(現在是它的方向)的矩形,那么glVertex4f
軸就glVertex4f
。 50s應該在X和Y軸上,並且您應該為Z設置一個不為0的值,以便它位於相機的前面而不是它的后面。
另外, gluPerspective
的第一個參數是垂直視場,而不是水平視場,因此當它工作時,將會出現一些嚴重的失真。 將90度水平fov轉換為垂直fov的一種近似方法是除以縱橫比( width / height
)。
另一件事,在render3D
開始時調用glRotatef
沒有做任何事情。 init3D
通過調用glLoadIdentity
從模型視圖矩陣清除所有轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.