Итак, я пытаюсь найти лучший способ визуализации 3D-модели в OpenGL, когда некоторые текстуры, применяемые к ней, имеют альфа-каналы.Рендеринг 3D-моделей с текстурами, которые имеют альфа в OpenGL
Когда у меня включен буфер глубины и начните рисовать все треугольники в 3D-модели, если он рисует треугольник, который находится перед другим треугольником в модели, он просто не будет отображать задний треугольник, когда он будет к нему. Проблема заключается в том, что передний треугольник имеет альфа-прозрачность и должен быть доступен для наблюдения за треугольником позади него, но треугольник позади все еще не отображается.
Отключение буфера глубины устраняет эту проблему, но создает очевидную проблему: если треугольник IS непрозрачен, тогда он будет по-прежнему отображать треугольники над ним сверху, если после этого будет отображаться.
Например, я пытаюсь сделать сосну, которая в основном представляет собой несколько конусов, уложенных друг на друга, которые имеют прозрачную основу. На следующем рисунке показана проблема, которая возникает, когда буфер глубины включен:
Вы можете увидеть, как вы можете видеть схему прозрачных треугольников.
На следующем рисунке показано, как выглядит буфер буферизации.
Здесь вы можете увидеть, как некоторые из треугольников на обратной стороне дерева, оказываемые в передней части остальной части дерева.
Любые идеи, как решить эту проблему, и правильно отремонтировать сосну?
P.S. Я использую шейдеры для визуализации всего.
... или используйте «discard» в вашем шейдере фрагмента, если альфа находится ниже вашего порогового значения в любой среде без поддержки альфа-теста (например, ES 2.0 или WebGL). – Tommy
Они работают, когда у вас есть шейдеры (в настольном OpenGL). Что не работает, это альфа-тест, когда вы используете [core OpenGL 3.1 или выше] (http://www.opengl.org/wiki/Core_And_Compatibility_in_Contexts). –
@Tim Итак, я пробовал использовать discard, и он, кажется, удаляет любое изменение цвета, выполняемое шейдером фрагмента. Однако, похоже, он вообще не влияет на буфер глубины. При использовании сброса я получаю те же результаты, что и на картинке, где включен буфер глубины. – Jeremy