Тест глубины OpenGL не работает при рендеринге ортографической проекции выбранных граней меша.

Вопрос или проблема

Я пытаюсь отобразить ортографическую проекцию выбранных граней модели в OpenGL. Модель имеет отверстие, и я хочу отображать только те грани, которые видны с точки зрения наблюдателя. Однако есть проблема: скрытые поверхности все еще отображаются. Я включил тест глубины, чтобы решить эту проблему, но он, похоже, не оказывает никакого эффекта. Хотя я настроил код на пропуск скрытых граней, они все равно видны в финальном рендере. Как я могу это исправить?

часть моего кода:

// Настройка теста глубины и отсечения
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_GREATER);  // Использование GL_GREATER для тестирования глубины
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

// Очистка цветового иDepth buffer
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Очистка цветового иDepth buffer

// Рисование выбранных граней
glBegin(GL_TRIANGLES);
for (const auto& face : m.cm.face) {
    if (!face.IsD() && face.IsS()) {  // Обработка только выбранных граней
        for (int i = 0; i < 3; ++i) {
            const auto& vert = *face.V(i);
            const vcg::TexCoord2<float>& texCoord = face.WT(i);
            glTexCoord2f(texCoord.U(), texCoord.V());
            glVertex3f(vert.P().X(), vert.P().Y(), vert.P().Z());
        }
    }
}
glEnd();

и я установил glOrtho(minX, maxX, minY, maxY, minZ - 1.0f, maxZ + 1.0f);

это модель:
введите описание изображения здесь

отверстие выглядит так:
введите описание изображения здесь

и это мой результирующий изображение:

введите описание изображения здесь

Я не хочу, чтобы часть текстуры, которую «наблюдатель I» не может видеть спереди модели, отображалась.

Я включил тест глубины с помощью glEnable(GL_DEPTH_TEST) и установил glDepthFunc(GL_GREATER). Я также включил отсечение задних граней с помощью glEnable(GL_CULL_FACE) и glCullFace(GL_BACK), но эта настройка, похоже, не устраняет скрытые грани в итоговом выводе. Учитывая, что у модели есть отверстие, как мне убедиться, что только видимые грани рендерятся правильно, не показывая скрытые поверхности?

Я пробовал изменить исходный glOrtho(minX, maxX, minY, maxY, minZ - 1.0f, maxZ + 1.0f); на glOrtho(minX, maxX, minY, maxY, minZ - 1.0f, maxZ - 1.5f);
Эффект, как показано на рисунке:
введите описание изображения здесь
Но это не тот эффект, который я хочу. Я хочу нарисовать текстуру, которую я вижу в ортографическом виде. Сделав это, я удалю части, которые не должны быть удалены, и это все еще выглядит немного резковато (красная рамка на картинке).

Ответ или решение

Проблема с Глубинным Тестированием в OpenGL при Отрисовке Ортогональной Проекции Выбранных Граней Модели

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

Ошибки в Настройках Отрисовки

  1. Тест глубины: Вы настроили тест глубины с помощью glEnable(GL_DEPTH_TEST) и решили использовать glDepthFunc(GL_GREATER). Однако, важно понимать, что данная функция определяет, может ли текущая вершина быть отрисована на основании глубины. Обычно для большинства случаев используется glDepthFunc(GL_LESS), что означает, что новая вершина будет отрисована, только если ее глубина меньше, чем у уже существующей. Попробуйте заменить вашу функцию на glDepthFunc(GL_LESS).

  2. Режим отрисовки граней: Вы используете glEnable(GL_CULL_FACE) и glCullFace(GL_BACK), что верно только если грани вашего меша не перепутаны. Проверьте, правильно ли ориентированы нормали ваших граней. Для проверки вы можете временно отключить отрисовку граней с помощью glDisable(GL_CULL_FACE) и посмотреть, как это отразится на вашем рендеринге.

  3. Координаты ортогональной проекции: Убедитесь, что значения передаваемые в glOrtho корректны. Например, если у вас есть "дыра" в модели, убедитесь, что она правильно отображается в заданной области видимости.

Предложения по Доработке Кода

В вашем коде вы используете glBegin(GL_TRIANGLES) для отрисовки треугольников. Это может быть и не самая оптимальная практика. Рассмотрите возможность использования Vertex Buffer Objects (VBO) и Vertex Array Objects (VAO), что позволит более эффективно управлять памятью и ускорить рендеринг.

// Пример кода для настройки глубинного теста и режима отрисовки
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);  // Используйте GL_LESS для корректного тестирования глубины
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

// Очистка буферов
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Очищаем цветовой и глубинный буферы

// Отрисовка выбранных граней
glBegin(GL_TRIANGLES);
for (const auto &face : m.cm.face) {
    if (!face.IsD() && face.IsS()) {  // Обрабатываем только выбранные грани
        for (int i = 0; i < 3; ++i) {
            const auto &vert = *face.V(i);
            const vcg::TexCoord2<float> &texCoord = face.WT(i);
            glTexCoord2f(texCoord.U(), texCoord.V());
            glVertex3f(vert.P().X(), vert.P().Y(), vert.P().Z());
        }
    }
}
glEnd();

Проверка Нормалей

Если после всех изменений проблема не решится, проверьте нормали вашей модели. Нормали должны быть направлены наружу от модели. Если они направлены внутрь, это может быть причиной того, что дальнейшее удаление скрытых грани не работает корректно. Для быстрой проверки вы можете визуализировать нормали с помощью простого шейдера.

Заключение

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

Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь их задавать!

Оцените материал
Добавить комментарий

Капча загружается...