Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Igor Zuenko                          2:5064/13.19   23 Apr 2002  10:53:02
 To : Alexander Topolskiy
 Subject : прозрачность
 -------------------------------------------------------------------------------- 
 
 AT> Истина где-то рядом, All...
 AT> 
 AT> Как реализуется прозрачность? Я так понимаю таких алгоритмов несколько?
 AT> 
 
 Hапример в OpenGL сабж реализуется на аппаратном уровне, и програмируется очень
 легко.
 --------------пример прозрачности-----------------
 С помощью четвертого компонента цвета можно получать различные эффекты
 наложения объктов друг на друга, наложения цветов и т.п. Здесь я расскажу о
 наиболее нужном и распрострененном эффекте - прозрачности объектов. Для того,
 чтобы разрешить обрабатывать четвертый компонент цвета вы должны вызвать
 функцию
 glEnable с аргументом GL_ALPHA_TEST. Для получения требуемого эффекта
 прозрачности нужно разрешить наложение цветов - glEnable(GL_BLEND). И
 установить
 алгоритм, по которуму будут смешиваться два цвета - glBlendFunc(GL_SRC_ALPHA,
 GL_ONE_MINUS_SRC_ALPHA). Учтите, что эти режимы очень затормаживают вывод
 изображения, поэтому я не рекомендую устанавливать эти режимы глобально, для
 воспроизведения всех объектов. Выделите из ваших объектов те, которым требуется
 этот режим, включайте и отключайте его своевременно. Именно поэтому, эти тесты
 я
 разместил в функции display. Создайте новый проект с именем transperence и
 отредактируйте функцию display, как показано ниже. 
  
 void CALLBACK display(void)
 {
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   glEnable(GL_ALPHA_TEST);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
   glColor4d(1,0,0, 1);
   auxSolidSphere( 1 );
   
   glColor4d(0,1,0, 0.6);
   auxSolidCylinder(2,3);
   
   glDisable(GL_BLEND);
   glDisable(GL_ALPHA_TEST);
   
   auxSwapBuffers();
 }    
 
 В заключение, добавлю, что если вы поменяете местами создание цилиндра и сферы,
 то никакого эффекта прозрачности не увидите. Это не баг, а фича - так задумано.
 Секрет прост: вы должны сначала рисовать дальние объекты, а потом ближние.
 Связано это с тем, что выполняется тест глубины. Теперь смотрите, что
 получается. Если вы сначала рисуете сферу(она удалена), а потом цилиндр, то
 выполняется это следующим образом. 
 
 Создаем сферу. 
 Выполняется тест глубины успешно, т.к. цилиндра пока нет. 
 В буфере рисуется сфера. 
 Создаем цилиндр. 
 Выполняется тест глубины успешно, т.к. стенка цилиндра ближе, чем сфера. 
 В буфере рисуется цилиндр, он закрывает сферу с учетом прозрачности. 
 Теперь смотрим, что происходит, если сначала нарисовать цилиндр, потом сферу. 
 
 Создаем цилиндр. 
 Выполняется тест глубины успешно. 
 В буфере рисуется цилиндр. 
 Создаем сферу. 
 Вполняется тест глубины аварийно, т.к. сфера создается за цилиндром. 
 В буфере ничего не рисуется. 
 В последнем случае вы увидите один цилиндр. 
 ------------------коней примера------------------
 С DirectDraw дело обстоит посложнее, т.к. в стандартной библиотеке,
 которая идёт например с C++Builder5, програмирование сопряжено с трудностями
 всвязи с тем, что многое приходится писать напрямую в WinAPI.
  
 Tschau
 --- F.I.P.S./32 v1.0r W95/NT [M]
  * Origin: No woman no cry!  (2:5064/13.19)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 прозрачность   Alexander Topolskiy   22 Apr 2002 01:35:22 
 прозрачность   Igor Zuenko   23 Apr 2002 10:53:02 
 прозрачность   Alexander Topolskiy   25 Apr 2002 00:41:22 
 прозрачность   Alex Astafiev   25 Apr 2002 11:00:05 
 прозрачность   Alexander Lunkov   22 Apr 2002 22:16:30 
 пpозpачность   Victor Anikeev   15 May 2002 20:20:48 
Архивное /ru.algorithms/33483cc520ee.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional