Каркас Windows-приложения. Особенности нового каркаса. Перемещение в пространстве (с текстурированными стенами), страница 11

}

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) и исследуйте все способы фильтрации. Текущий способ мы выводим в заголовок окна. Обратите внимание на тот факт, что различие между способами фильтрации заметно только на простом изображении.

Смешивание цветов (Blending)

Вы уже знаете, что цвет в 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