0

我正在使用 LWJGL/Open GL 来绘制一个立方体。问题是它没有按正确的顺序绘制面,也没有在正确的位置渲染立方体!这是 Block.java:

            package src;

import static org.lwjgl.opengl.GL11.GL_QUADS;
import static org.lwjgl.opengl.GL11.glBegin;
import static org.lwjgl.opengl.GL11.glColor3f;
import static org.lwjgl.opengl.GL11.glTranslatef;
import static org.lwjgl.opengl.GL11.glVertex3f;

import static org.lwjgl.opengl.GL11.*;

public class Block {
    private float x;
    private float y;
    private float z;
    private Chunk chunk;

public Block(float arg1, float arg2, float arg3, Chunk arg4) {
    x = arg1;
    y = arg2;
    z = arg3;
    chunk = arg4;
}

public void renderBlock() {

    // glTranslatef(0, 0, 0);
    // Texture tx =
    chunk.getWorld().getGame().getTexture(0).bind();
    glBegin(GL_QUADS);
    {
        // Top Face
        glTexCoord2f(0, 0);
        glVertex3f(x - 1, y + 1, z - 1);
        glTexCoord2f(0, 1);
        glVertex3f(x, y + 1, z - 1);
        glTexCoord2f(1, 1);
        glVertex3f(x, y + 1, z);
        glTexCoord2f(1, 0);
        glVertex3f(x - 1, y + 1, z);

        // Bottom Face
        glTexCoord2f(0, 0);
        glVertex3f(x - 1, y, z - 1);
        glTexCoord2f(0, 1);
        glVertex3f(x, y, z - 1);
        glTexCoord2f(1, 1);
        glVertex3f(x, y, z);
        glTexCoord2f(1, 0);
        glVertex3f(x - 1, y, z);

        // Front Face
        glTexCoord2f(0, 0);
        glVertex3f(x, y + 1, z - 1);
        glTexCoord2f(0, 1);
        glVertex3f(x, y, z - 1);
        glTexCoord2f(1, 1);
        glVertex3f(x, y, z);
        glTexCoord2f(1, 0);
        glVertex3f(x, y + 1, z);

        // Back Face
        glTexCoord2f(0, 0);
        glVertex3f(x - 1, y + 1, z - 1);
        glTexCoord2f(0, 1);
        glVertex3f(x - 1, y, z - 1);
        glTexCoord2f(1, 1);
        glVertex3f(x - 1, y, z);
        glTexCoord2f(1, 0);
        glVertex3f(x - 1, y + 1, z);

        // BackFace
        glTexCoord2f(0, 0);
        glVertex3f(x - 1, y + 1, z - 1);
        glTexCoord2f(0, 1);
        glVertex3f(x, y + 1, z - 1);
        glTexCoord2f(1, 1);
        glVertex3f(x, y, z - 1);
        glTexCoord2f(1, 0);
        glVertex3f(x - 1, y, z - 1);

        // FrontFace
        glTexCoord2f(0, 0);
        glVertex3f(x - 1, y + 1, z);
        glTexCoord2f(1, 0);
        glVertex3f(x, y + 1, z);
        glTexCoord2f(1, 1);
        glVertex3f(x, y, z);
        glTexCoord2f(0, 1);
        glVertex3f(x - 1, y, z);

    }
    glEnd();

}

public float getX() {
    return x;
}

public float getY() {
    return y;
}

public float getZ() {
    return z;
}
}

这是 Render.java:

    package src;

import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glEnable;
import static org.lwjgl.opengl.GL11.glEnd;
import static org.lwjgl.opengl.GL11.glLoadIdentity;
import static org.lwjgl.opengl.GL11.glPopMatrix;
import static org.lwjgl.opengl.GL11.glPushMatrix;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

public class Render {

Game game;

public Render(Game arggame) {
    game = arggame;
}

public void initDisplay() {
    try {
        Display.setDisplayMode(new DisplayMode(1280, 720));
        Display.create();
    } catch (LWJGLException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void renderLoop() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    game.cam.useView();

    glPushMatrix();
    {

        renderBlocks(game.world);

        glEnd();
    }
    glPopMatrix();
    Display.update();

}

public void renderBlocks(World arg1world) {
    for (int i = 0; i < 125; i++) {
        if (arg1world.chunkIndex[i] != null) {
            for (int j = 0; j < 32768; j++) {
                if (arg1world.chunkIndex[i].blockIndex[j] != null) {
                    arg1world.chunkIndex[i].blockIndex[j].renderBlock();
                }
            }
        }
    }
}
}

块似乎比应该的要低 2 个块,我认为可以通过编辑 glVertex3f 来修复它,但是为什么它不能正确渲染,因为它使用了位置变量。glTranslate 只会让一切变得更糟(做一些指数变化)。

4

1 回答 1

1

您似乎没有使用深度缓冲区。我不知道 LWJGL 的详细信息,但我希望看到一些在 initDisplay() 中创建深度缓冲区的选项,在某个地方启用 GL_DEPTH_TEST 并将 GL_DEPTH_BUFFER_BIT 添加到 glClear() 中。那应该可以解决您的面部订购问题。

其他一些问题:你有一个双 glEnd()(renderLoop() 中的那个)没有对应的 glBegin(),它不应该受到伤害,但如果你开始检查它们会导致 glErrors(你应该这样做)。

你的 glTranslatef() 不应该做任何事情,因为它是 (0,0,0)。但是如果你真的想用真实值使用它,你需要在每个被翻译的对象周围(即在 renderBlock() 的开头/结尾)执行 glPushMatrix()/glPopMatrix(),否则它们会累积。

您选择的顶点坐标有点奇怪。通常人们将原点放置在对象的中心(即对 XYZ 使用 +/-1 坐标)或在左下角(即对 XYZ 使用 0/1 坐标)。这应该不是问题,但可能会导致一些意想不到的转变。

于 2013-01-07T07:35:53.130 回答