java - GL_QUADS 以我不希望的方式渲染

标签 java eclipse opengl lwjgl

我正在使用 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();
                }
            }
        }
    }
}
}

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

最佳答案

您似乎没有使用深度缓冲区。我不知道 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 坐标)。这应该不是问题,但可能会导致一些意外的转变。

关于java - GL_QUADS 以我不希望的方式渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187665/

相关文章:

java - 如何在HashMap中实现入门级锁定?

java |如果父线程终止则终止所有子线程

c++ - OpenGL 在 3D 空间中渲染 2D

java - 应该执行复数算术的简单应用程序中出现编译错误

java - 调用rest api客户端

c - 关于 FBX 二进制文件格式

c++ - 如何在 C++ OpenGL 应用程序中播放 FLV 文件?

java - Java 代码的等效 Scala 代码不起作用(方法签名无效)

java - 使用注释时如何在 JAXB 解码器上设置自定义 ValidationEventHandler

java - 使用 Twilio SDK 将电话号码 "+2125551212"转换为格式 "(212) 555-1212"