}
if (!gInfo.keys['F'])
fp = false;
if (gInfo.keys[VK_PRIOR])
z -= 0.02f;
if (gInfo.keys[VK_NEXT])
z += 0.02f;
if (gInfo.keys[VK_UP])
xspeed -= 0.01f;
if (gInfo.keys[VK_DOWN])
xspeed += 0.01f;
if (gInfo.keys[VK_RIGHT])
yspeed += 0.01f;
if (gInfo.keys[VK_LEFT])
yspeed -= 0.01f;
}
Запустите приложение, выберите оконный режим, откройте файл очень простого bitmap-изображения (bmp32x32.bmp или Fly.bmp) и исследуйте все способы фильтрации. Текущий способ мы выводим в заголовок окна. Обратите внимание на тот факт, что различие между способами фильтрации заметно только на простом изображении.
Вы уже знаете, что цвет в OpenGL может быть задан четырьмя компонентами (red, green, blue, alpha). До сих пор мы не использовали четвертую компоненту. Она управляет режимом смешивания цветов. С ее помощью можно управлять прозрачностью объектов сцены OpenGL. По умолчанию этот режим выключен (равносильно команде glDisable (GL_BLEND)). Если его включить, то значение alpha используется при вычислении цвета пиксела. При этом учитывается цвет вновь поступившего пиксела и цвет пиксела, который уже присутствует в буфере кадра (framebuffer).
Здесь полезно представить переднюю стенку куба (новый элемент сцены), заслоняющую заднюю стенку куба (старый элемент сцены). Если режим смешивания выключен, то каждый новый фрагмент (так называют пиксел с теми же координатами x и y, что и у существующего в буфере пиксела, но координата z которого больше — то есть он ближе к наблюдателю) замещает тот, который существует в буфере кадра. В этом случае говорят, что новый фрагмент непрозрачен.
Если режим включен, то значение alpha определяет степень использования цвета нового фрагмента в процессе комбинирования его с цветом уже существующего. Это влияет на степень непрозрачности (opacity) нового слоя изображения. Часто оперируют понятием transparency (прозрачности). Прозрачность дополняет opacity до единицы. Так, если мы изоражаем объект, расположенный за зеленым стеклом, непрозрачность (opacity) которого 10% (а прозрачность 90%), то при вычислении комбинированного цвета пиксела естественно взять 10% (зеленого) цвета стекла и 90% цвета объекта. Эта логика обобщается и на случай нескольких последовательно соединенных пропускающих свет (translucent) поверхностей.
Смешивание работает в момент, когда сцена уже прошла фазу растеризации (преобразована в множество фрагментов), но перед тем, как получить и записать в буфер кадра окончательный цвет пиксела. Следующий пример использует смешивание цветов. Создайте новый файл Blend.cpp, Скопируйте в него предыдущий модуль, подключите новый файл к проекту и введите изменения.
bool light, blend, amb, lp, fp, bp, ap; // Lighting ON/OFF, Blending OFF/ON, L Pressed? etc.
float
angleX, angleY, // X, Y Rotation angles
xspeed, yspeed, // X, Y Rotation Speeds
z = -5, // Depth Into The Screen
ambient[] = { 0.2f, 0.2f, 0.2f, 1 },
diffuse[] = { 1, 1, 1, 1 },
position[] = { 0, 0, 2, 1};
UINT filter, // Which Filter To Use
texture[3]; // Storage For 3 Textures
TCHAR curDir[MAX_PATH], *pFile = 0;
В функции Init, кроме уже рассмотренных установок параметров света, задана степень прозрачности объекта (50%) и один из способов смешивания цветов (см. вызов glBlendFunc).
bool Init ()
{
::GetCurrentDirectory (MAX_PATH-1, curDir);
if (pFile == 0)
{
pFile = strcpy (new TCHAR[MAX_PATH], curDir);
pFile = gInfo.bFull ? strcat (pFile, "/Data/Glass.bmp") : FileDlg (true);
}
if (!LoadTexture (pFile, texture))
return false;
glClearColor(0, 0, 0, 0.5f);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glClearDepth(1);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); // Setup The Ambient Light
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); // Setup The Diffuse Light
glLightfv(GL_LIGHT0, GL_POSITION,position);// Position The Light
glEnable (GL_TEXTURE_2D); // Enable Texture Mapping
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.