为什么我的游戏渲染不正确?

时间:2014-01-06 05:48:48

标签: java opengl render lwjgl

我正在和我的朋友一起制作引擎,而且发生了一件非常奇怪的事情。我相信我已经在LWJGL中设置了一切,我应该在立即模式下渲染一个灰色矩形,但它不会出现。我们将它直接放在相机中(它代表地面),但它仍然不在那里。我确信这是一个非常被问到的问题,但是输入'为什么我的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() {



}

}

我没有正确设置状态吗?

1 个答案:

答案 0 :(得分:0)

您的透视投影的远剪裁平面设置为20,但您的几何范围为50。整个矩形超过允许绘制的最远点。

此外,假设您想要绘制一个与您正在查找的方向不同的矩形(现在是这样),您的轴与glVertex4f混合在一起。 50s应该在X轴和Y轴上,你应该为Z设置一个不为0的值,这样它就在镜头前面,而不是在它后面。

此外,gluPerspective的第一个参数是垂直视野,而非水平视野,因此当您使其工作时,您将会遇到严重的失真。将90度水平fov转换为垂直fov的近似方法是除以宽高比(width / height)。

另一件事,glRotatefrender3D开始时调用没有做任何事情。 init3D通过调用glLoadIdentity来清除模型视图矩阵中的所有变换。