Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Альфа режимы обьясните чайнику.


Автор: waran 4.11.2009, 23:06
Пишу прогу на gl4java,  почти полностью дублирует
сишевское opengl поэтому пишу сюда.
Какая то непонятка у меня с этими всякими "альфа режимами"
Обьявляю его так :
 gl.glEnable(GL_ALPHA_TEST); 
       gl.glEnable(GL_BLEND);     // Turn blending On
     gl.glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_CONSTANT_COLOR);     // (Type of blending) Set the blending function for translucency 
   
потом рисую куб с цветами 
gl.glColor4d(cx,cx,cx,0.1);
gl.glBegin(GL_QUADS);...gl.glEnd();   
получаются такие красивые полупрозрачные грани.

внутри куба находится другой обьект,рисованый тоже 
квадами цветом
gl.glColor4d(0.3,0.4,1.0,1);

Че то получается так, что "обьект" в кубе никогда не виден
(или выбирается режим что вся картинка черная)
А когда куб не рисую, "обьект" виден нормально 
Ну если не считать что некоторые нормали повернуты не так,
но это не важно мне просто надо понять сам прикол 
почему его тупо не видно внутри куба
 

Автор: EgoBrain 5.11.2009, 12:47
х3 как в OpenGL (наверное так же как и в DirectX), но в Директе смешивание должно выполняться по следующему правилу (внимательно смотрите теорию): сначала рисуются объекты без использования смешивания, а затем упорядоченно объекты со смешиванием, порядок следующий - начинается от самого дальнего объекта и заканчивается самым близким. То есть если внутренний куб рисуется без смешивания, то рисуй сначала его, если со смешиванием, то тут походу нада уже смотреть по граням: переднюю грань внешнего, затем переднюю грань внутреннего, затем заднюю грань внутреннего и уже потом заднюю грань внешнего, походу как то так, и не забываем отключать отбрасывание невидимых граней smile
Ну все это я писал с расчетом на то, что OpenGL и DirectX очень похожи, хотя это может быть полным абсурдом - х3, если что надеюсь на объяснение smile

Автор: waran 5.11.2009, 14:53
спасибо, честно говоря про фичу "упорядочивания" я и понятия не имел, по идее оно должно просто блендится же по расстоянию...

если это так, то вопрос как тогда реализовать подобное "упорядочивание граней", если у меня куб вертится по всем осям  %0
(передняя становится потом задней то есть)
а про внутренний обьект, более сложный полигон я вообще молчу)

Автор: EgoBrain 6.11.2009, 01:42
Ну я х3. Если ты кубы строишь самостоятельно, то есть создаешь массив точек с указанием координат, то наверное в цикле бери каждую грань и смотри на каком расстоянии от "глаза" она находится в пространсве вида по оси Z. Если же ты строишь кубы по готовым примитивам бибилиотеки, то здесь наверное уже с настройками смешивания нада мутить.

Автор: VirtualVoid 17.11.2009, 21:33
Может сначала рисовать внутри куба, потом то что снаружи?

Цитата(EgoBrain @  5.11.2009,  17:47 Найти цитируемый пост)
х3 как в OpenGL (наверное так же как и в DirectX), но в Директе смешивание должно выполняться по следующему правилу (внимательно смотрите теорию): сначала рисуются объекты без использования смешивания, а затем упорядоченно объекты со смешиванием


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

И про прозрачность написано в МСДН: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) - лучшая реализация прозрачности на фиксированном конвейере.

Добавлено через 4 минуты и 22 секунды
При этом внутренний непрозрачный объект должен корректно перекрыть заднюю грань куба. Про перекрытие задней грани передней гранью... это уже смотреть надо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)