Opengl 三角形包含孔并且有时会消失

标签 opengl graphics 3d rendering lwjgl

我当前正在显示列表中渲染三角形条,它显示了奇怪的小孔。

此外,旋转环境时一些三角形似乎完全消失。
这是代码:

public class Landscape {

    int displayList;

    public Landscape() throws IOException {
        try {
            Display.setDisplayMode(new DisplayMode(640, 480));
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        GLU.gluPerspective(60f, 640f/480f, 0.0001f, 1000f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LEQUAL);
        glPolygonMode(GL_FRONT_AND_BACK, GL_FLAT);
        glEnable(GL_CULL_FACE);

        BufferedImage heightMap = ImageIO.read(new File("heightmap.png"));
        BufferedImage heightMapColor = ImageIO.read(new File("hoehenprofil.png"));
        displayList = glGenLists(1);
        glNewList(displayList, GL_COMPILE);
        for (int z = 0; z < heightMap.getHeight(); z++) {
            glBegin(GL_TRIANGLE_STRIP);
            for (int x = 0; x < heightMap.getWidth(); x++) {
                int y = 0xFF - heightMap.getRGB(x, z) & 0xFF;
                int color = heightMapColor.getRGB(y-1, 0);
                glColor3ub((byte)((color >> 16) & 0xFF), (byte)((color >> 8) & 0xFF), (byte)(color & 0xFF));
                glVertex3i(x, y*5, z);
                if (z < heightMap.getHeight() - 1) {
                    y = 0xFF - heightMap.getRGB(x, z+1) & 0xFF;
                    color = heightMapColor.getRGB(y-1, 0);
                    glColor3ub((byte)((color >> 16) & 0xFF), (byte)((color >> 8) & 0xFF), (byte)(color & 0xFF));
                    glVertex3i(x, y*5, z+1);
                }
            }
            glEnd();
        }
        glEndList();

        float camX = 500, camY = 500, camZ = -500;
        float rotX = 45, rotY = 0, rotZ = 0;
        long lastTick = System.currentTimeMillis();
        int fps = 0;
        while (!Display.isCloseRequested()) {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glLoadIdentity();
            if (Keyboard.isKeyDown(Keyboard.KEY_W)) camZ++;
            if (Keyboard.isKeyDown(Keyboard.KEY_S)) camZ--;
            if (Keyboard.isKeyDown(Keyboard.KEY_A)) camX--;
            if (Keyboard.isKeyDown(Keyboard.KEY_D)) camX++;
            if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) camY++;
            if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) camY--;
            if (Keyboard.isKeyDown(Keyboard.KEY_Q)) rotY -= 0.5f;
            if (Keyboard.isKeyDown(Keyboard.KEY_E)) rotY += 0.5f;
            glRotatef(rotX, 1, 0, 0);
            glRotatef(rotY, 0, 1, 0);
            glRotatef(rotZ, 0, 0, 1);
            glTranslatef(-camX, -camY, camZ);
            glCallList(displayList);
            Display.update();

            fps++;
            if (lastTick + 1000 <= System.currentTimeMillis()) {
                lastTick += 1000;
                System.out.println("FPS: " + fps);
                fps = 0;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        new Landscape();
    }
}

它似乎也出现在禁用深度测试的情况下。即使启用了剔除面,这似乎也不起作用。

编辑:
除此之外,当绕 x 或 y 轴平移一定量时,我会看到一些黑色闪烁。这是一个屏幕截图。

它导致了大量的延迟,我找不到任何原因。

编辑2:
我按照要求缩放了 x 轴和 z 轴,并删除了屏幕截图的 y 轴比例。它似乎只在绕 y 轴拉伸(stretch)很远时才会导致错误。

最佳答案

近平面和远平面(gluPerspective 的最后两个参数)之间的差异非常大。这两者之间的相对大小(远除以近)越大,获得的深度缓冲区精度就越低。在你的例子中,远/近是 1,000,000,这比你通常想要的要多得多。我通常喜欢将它们的比例保持在 10 左右,尽管 100 之类的比例可能仍然没问题。

调整值,同时确保您想要看到的任何几何图形都不会被剪切掉。尝试 1.0 和 10.0 之类的东西。如果这会剪掉远端的几何图形,请将远值增加到 100.0 之类的值,也许看看是否也可以增加近值。

关于Opengl 三角形包含孔并且有时会消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23137448/

相关文章:

opengl - 使用 openGL 旋转缩放球体

c++ - 使用 QListWidgetItem 类更改文本大小

jquery - 复制时的 3d viewport jquery 问题

c++ - GLUT 中的平滑运动

math - 多边形数学

java - 将缓冲图像保存为 gif

opengl - SFML::View inverted-y 轴是标准的吗?如何解决它?

java - JCanvas3D 与 Canvas3D

python - 类型错误 : Axes3D

java - 当前线程中没有 OpenGL 上下文