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 を有効にして glClear() に GL_DEPTH_BUFFER_BIT を追加するオプションが表示されることを期待しています。これで、顔の順序付けの問題が解決されるはずです。

その他の問題: 二重の glEnd() があります (renderLoop() のもの) には対応する glBegin() がありません。

glTranslatef() は (0,0,0) のまま何もしないでください。しかし、実際に実際の値で使用したい場合は、変換される各オブジェクトの周りに glPushMatrix()/glPopMatrix() を実行する必要があります (つまり、renderBlock() の最初/最後)。そうしないと、それらが蓄積されます。

頂点の座標の選択は少し奇妙です。通常、原点はオブジェクトの中心 (つまり、XYZ に +/-1 座標を使用) または左下隅 (つまり、XYZ に 0/1 座標を使用) に配置されます。これは問題にはなりませんが、予期しない変化の原因となる可能性があります。

于 2013-01-07T07:35:53.130 に答える