簡體   English   中英

為什么我的游戲渲染不正確?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM