Рендеринг 3D-моделей с текстурами, имеющими альфу в OpenGL - PullRequest
2 голосов
/ 10 марта 2012

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

Когда у меня включен буфер глубины, и начинаю рисовать всетреугольники в 3D-модели: если он рисует треугольник, который находится перед другим треугольником в модели, он просто не будет отображать задний треугольник, когда доберется до него.Проблема в том, что передний треугольник имеет альфа-прозрачность, и его можно увидеть сквозь треугольник позади него, но треугольник позади все еще не отображается.

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

Depth Buffer Enabled

Вы можете увидеть, как вы все еще можете видеть контур прозрачных треугольников.

На следующем рисунке показано, как это выглядит, когда буфер глубины отключен.

Depth Buffer Disabled

Здесь вы можете увидеть, как некоторые из треугольников на задней части дерева отображаютсяперед остальной частью дерева.

Есть идеи, как решить эту проблему и правильно отрисовать сосну?

PS Я использую шейдеры для рендеринга всего.

Ответы [ 3 ]

5 голосов
/ 10 марта 2012

Если вы не используете какую-либо частичную прозрачность (все равно 0 или 255), вы можете glEnable (GL_ALPHA_TEST) , и это должно вам помочь.Проблема заключается в том, что если вы сначала визуализируете верхний конус, он помещает весь четырехугольник в z-буфер (даже прозрачные части), поэтому нижние ветви под ним отклоняются по z, когда их время рисовать.Включение альфа-тестирования не записывает пиксели в буфер z, если они не проходят альфа-тест (устанавливается с помощью glAlphaFunc) .

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

Вам нужно оставитьТакже включен z-буфер.

[править] Ой, я понял, что эти функции, я не верю, работают, когда вы используете шейдеры.В случае шейдера вы хотите использовать функцию сброса в фрагментном шейдере, если значение альфа близко к нулю.

if(color.a < 0.01) {
   discard;
} else {
   outcolor = color;
}
0 голосов
/ 21 октября 2012

Вам необходимо реализовать двухпроходный алгоритм.

Первый проход отображает только задние грани, а второй проход - только передние грани.

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

0 голосов
/ 24 июня 2012

Я могу ошибаться, но это потому, что при рендеринге в 3d вы не визуализируете обратную сторону треугольников с использованием настроек Directx по умолчанию, когда Z удаляется - он рисует их по порядку, а Z на нем не рисуетзадняя сторона треугольников больше.Можно показать обе стороны треугольника, даже с включенным Z, однако я думаю, что может быть причина, по которой он обычно включен .. такой как скорость ..

Device->SetRenderState(D3DRS_CULLMODE, Value);

значение может равняться

D3DCULL_NONE - Shows both sides of triangle
D3DCULL_CW - Culls Front side of triangle
D3DCULL_CCW - Default state
...