2014-09-10 2 views
0

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

На рисунке показана пустая труба с левой стороны и полная справа.

Transparent pipe

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

Я использую следующий GL-код:

gl.glColor4d(240, 240, 240, 0.1); // transparent color 
gl.glEnable(gl.GL_BLEND); 
gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE); 
glu.gluCylinder(quadObj, width, width, length, 32, 1); 

Как я должен настроить смешивания FUNC (и/или цвет, если это необходимо), чтобы добиться того же эффекта с белым фоном?

ответ

3

Я предлагаю glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

BTW. значения, идущие в glColor…{f,d}, обрезаются до диапазона [0,1]. Я предлагаю вам попробовать светло-серый для наружной трубы, т. Е. glColor4f(0.75, 0.75, 0.75, 0.1)

Также имейте в виду, что прозрачность OpenGL не зависит от заказа. Лица должны быть отсортированы назад, чтобы смешение работало должным образом (если вы посмотрите на дальний конец цилиндра на картинке, вы можете видеть, что он пропускает заднее лицо, которое может быть, потому что оно натягивается последним, но затем оно уже поглощается остальной части цилиндра

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

glEnable(GL_CULL_FACE); 
glCullFace(GL_FRONT); 
gluCylinder(quadObj, width, width, length, 32, 1); 
glCullFace(GL_BACK); 
gluCylinder(quadObj, width, width, length, 32, 1); 
glDisable(GL_CULL_FACE); 
+0

Спасибо, все работает! Видимо, черная версия только удалась ^^ – kap

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

  • Нет связанных вопросов^_^