Буфер глубины OpenGL испорчен

1

У меня есть приложение OpenGL, которое я разрабатываю. Представленный ландшафт, похоже, не соответствует правилам буфера глубины, поэтому я предполагаю, что я немного испортился где-то

У меня есть GL11.glEnable(GL11.GL_CULL_FACE) в моем коде

Здесь, как выглядит самолет в сценарии, где ни один квад не стоит за другим, так что даже при отсутствии zbuffer все выглядит нормально. Обратите внимание, что это происходит из вида "сверху вниз", где "камера" находится над плоскостью

Изображение 174551

Изображение 174551

И теперь, под углом с другого вида

Изображение 174551

Квадраты, наиболее удаленные от сцены, отображаются поверх квадов ближе к компьютеру. Вот как выглядит мой призыв к glOrtho, указав ближние и дальние отсечения. В частности, самая дальняя плоскость видна, когда она должна быть скрыта по восходящей плоскости

GL11.glOrtho(0, 1000, 0, 750, 50, -50);

Интересно, что если я удалю свой вызов GL11.glEnable(GL_DEPTH_TEST), zbuffer, похоже, работает только на несколько углов

Изменение: Я думаю, проблема связана с тем, что я назвал glOrtho. Он вызывается только один раз, вместе с моим glEnable в начале кода. Должен ли я повторять его в моем цикле после GL11.glLoadIdentity() (который неоднократно вызывается во время цикла)?

Редактирование 2: добавление кода для отображения рендеринга

public void render() {
    for (int y = 0; y <  mapHeight - 1; y++) {
        for (int x = 0; x < mapWidth - 1; x++) {
            drawTile(x, y, rawMap[y][x], rawMap[y][x + 1], rawMap[y + 1][x + 1], rawMap[y + 1][x]);
        }
    }

}

private void drawTile(double xPos, double zPos, double height1, double height2, double height3, double height4) {
    GL11.glColor3ub((byte) 255, (byte) 255, (byte) 255);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
    GL11.glBegin(GL11.GL_QUADS);
    Point3D normal = faceNormals[(int) zPos][(int) xPos];
    GL11.glNormal3d(normal.getX(), normal.getY(), normal.getZ());
    double xIn = xPos * 0.15;
    double xOut = xIn + 0.15;
    double zIn = zPos * 0.15;
    double zOut = zIn + 0.15;


    /* Original First */
    GL11.glTexCoord2d(xPos * textureFactorX, zPos * textureFactorY);
    GL11.glVertex3d(xIn, height1, zIn);

    GL11.glTexCoord2d(xPos * textureFactorX, (zPos + 1) * textureFactorY);
    GL11.glVertex3d(xIn, height4, zOut);

    GL11.glTexCoord2d((xPos + 1) * textureFactorX, (zPos + 1) * textureFactorY);
    GL11.glVertex3d(xOut, height3, zOut);

    GL11.glTexCoord2d((xPos + 1) * textureFactorY, zPos * textureFactorY);
    GL11.glVertex3d(xOut, height2, zIn);

    GL11.glEnd();
}

Вот код, который устанавливает все мои glEnables и постоянные значения

public static void main(String[] args) {
    try {
        Display.setDisplayMode(new DisplayMode(1000, 750));
        Display.create();
        Display.setResizable(true);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    GL11.glMatrixMode(GL11.GL_PROJECTION);

    // GL11.glEnable(GL11.GL_CULL_FACE);
    GL11.glCullFace(GL11.GL_FRONT_AND_BACK);
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    GL11.glEnable(GL11.GL_LIGHTING);
    GL11.glEnable(GL11.GL_LIGHT0);

    // Enable lighting
    FloatBuffer lightFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(5f).put(5f).put(1f).put(0f).flip();
    FloatBuffer ambientFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(2f).put(2f).put(2f).put(2f).flip();
    FloatBuffer diffuseFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(1f).put(1f).put(1f).put(1f).flip();
    FloatBuffer specularFloatBuffer = (FloatBuffer) BufferUtils.createFloatBuffer(4).put(1f).put(1f).put(1f).put(1f).flip();

    GL11.glLightModeli(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, GL11.GL_TRUE);
    GL11.glShadeModel(GL11.GL_FLAT);

    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, ambientFloatBuffer);
    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, diffuseFloatBuffer);
    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, specularFloatBuffer);
    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, lightFloatBuffer);

    System.out.println("Resource Directory: " + RESOURCE_DIR.toString());

    new Game().start();
    Display.destroy();
}
Теги:
opengl
lwjgl

1 ответ

1
Лучший ответ

ПРИМЕЧАНИЕ. После некоторого обсуждения, используя glDepthFunc(GL_GREATER); и вызов glClearDepth(0.0f); перед очисткой буфера глубины.

То, что, по-видимому, происходит, просто состоит в том, что вы отбираете задние поверхности объектов. Для этих плоских плоскостей, если вы хотите, чтобы они были видны со спины, удаление лица должно быть полностью отключено. Насколько я вижу.

EDIT: Я видел ваш предыдущий пост об отбраковании лица. Это похоже на правильный результат отбраковки лица; вы просто смотрите на свои обращенные лица со стороны, где они будут выбиты.

  • 0
    На первом снимке середина самолета поднимается вверх, как гора. На втором рисунке показан квадроцикл до упора вправо, даже если средние четырехугольники должны быть сверху.
  • 0
    Установка glCullFace (GL_FRONT_AND_BACK) приводит к тому, что все окно становится черным, при этом ничего не отображается (или просто не отображается)
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню