2009-07-22 2 views
3

Я пытаюсь создать простой трассировщик лучей. У меня есть перспективный вид, который показывает лучи видимо для целей отладки.OpenGL Alpha смешивание с неправильным цветом

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

лучи рисуются в виде линий с

glLineWidth(10.0f)

Если луч попадает в сферу его заданного цвета

glColor4ub(100,100,100,100);

в моем коде инициализации я следующее:

 
    glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_GREATER, 0.0f); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA,GL_SRC_ALPHA); 

Вы можете см. на снимке экрана, что по какой-то причине лучи, проходящие между точкой обзора и сферой, смешиваются по цвету с осевой линией за спиной а не с самой сферой.

Вот скриншот:

screenshot

Может кто-нибудь объяснить, что я делаю неправильно здесь?

Спасибо!

+0

Я отредактировал этот файл, чтобы включить скриншот –

ответ

7

Возможно ли, что вы нанесли эти лучи, прежде чем рисовать сферу?

Затем, если Z-буфер включен, фрагменты сферы просто не будут отображаться, поскольку те части лучей ближе. Когда вы рисуете что-то полупрозрачное (используя смешение), вы должны следить за порядком, который вы тщательно рисуете.

На самом деле, я думаю, вы не можете использовать Z-буфер любым разумным способом вместе с процессом трассировки лучей. Вам придется отслеживать Z-порядок вручную. Хотя мы и находимся в этом, OpenGL может быть не лучшим API для визуализации процесса трассировки лучей. (Это будет возможно намного медленнее, чем чистое программное обеспечение ray-tracer)

+0

Ну, я буду ... просто изменить порядок моего кода рисования - все, что нужно; Я понятия не имел, что может так сильно повлиять! Спасибо, сэр! Вы джентльмен и ученый. – 2009-07-22 18:23:58

+0

Просто, чтобы прояснить мое намерение для любопытных. Фактическая трассировка лучей полностью не зависит от чертежа OpenGL.Я только что бросил в 3D перспективный вид, чтобы помочь мне отлаживать, пока я получаю свой трассировщик лучей. Он просто показывает лучи и копию растрированного изображения, текстурированного на квадроцикл перед точкой зрения растритера. – 2009-07-22 18:27:54

+0

@puddlesofjoy: вы можете изменить вопрос и добавить результат после этого исправления? Для людей было бы поучительно посмотреть, как выглядел ваш предполагаемый результат. Не biggie - просто предложение. Рад, что это сработало! – Argalatyr

2
  1. Вам не нужен glAlphaFunc, отключите его.
  2. Световые лучи должны быть смешаны путем добавления в буфер:. glBlendFunc(GL_ONE, GL_ONE) (для предварительно умноженного альфа, который вы выбрали
  3. Выключить буфер глубины запись (не испытывая) при визуализации лучей: glDepthMask(GL_FALSE)
  4. рендер лучей . последняя
0

AlphaTest только для отбрасывания фрагментов. - не смешивая их Проверить the spec используя его, вы говорите OpenGL, что вы хотите, чтобы выбросить пиксели вместо рисования их, так что вы не будете может любой transp arent смешивание. Наиболее распространенной функцией смешивания является glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Вы также можете проверить OpenGL Transparency FAQ.

Смежные вопросы