|
|
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)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/33483cc520ee.html, оценка из 5, голосов 10
|