glColor4f (1, 1, 1, 0.5f);// Full Brightness. 50% Alpha
glBlendFunc (GL_SRC_ALPHA, GL_ONE); // Set The Blending Function For Translucency
return true;
}
Степень непрозрачности (opacity) куба задана с помощью glColor4f (1, 1, 1, 0.5f);. Метод смешивания задан с помощью двух констант: GL_SRC_ALPHA и GL_ONE. Они говорят OpenGL, что источник полупрозрачен, а мишень непрозрачна. Трактуйте это так. Передняя стенка полупрозрачна, а задняя — нет. Функцию перерисовки оствьте без изменений. В функцию Update внесите изменения, как показано ниже. Обратите внимание на новую регулировку (клавиша A — Ambient). Она задает интенсивность фонового освещения и работает только если освещение включено (клавиша L).
void Update (DWORD ms)
{
if (gInfo.keys[VK_ESCAPE])
{
gInfo.bQuit = true;
PostMessage (gInfo.hWnd, WM_QUIT, 0, 0);
}
if (gInfo.keys[VK_F1])
PostMessage (gInfo.hWnd, WM_TOGGLEFULLSCREEN, 0, 0);
if (gInfo.keys['L'] && !lp)
{
lp = true; light = !light;
if (!light)
glDisable(GL_LIGHTING);
else
glEnable(GL_LIGHTING);
return;
}
if (!gInfo.keys['L'])
lp = false;
if (gInfo.keys['F'] && !fp)
{
fp = true; filter = (filter + 1) % 3;
gInfo.title =
filter == 0 ? "Nearest Filtered Texture" :
filter == 1 ? "Linear Filtered Texture" :
"MipMapped Filtered Texture";
SetWindowText (gInfo.hWnd, gInfo.title);
return;
}
if (!gInfo.keys['F'])
fp = false;
if (gInfo.keys['B'] && !bp) // Blending Code Starts Here
{
bp = true; blend = !blend;
if (blend)
{
glEnable (GL_BLEND); // Turn Blending On
glDisable (GL_DEPTH_TEST);// Turn Depth Testing Off
}
else
{
glDisable (GL_BLEND); // Turn Blending Off
glEnable (GL_DEPTH_TEST);// Turn Depth Testing On
}
}
if (!gInfo.keys['B'])
bp = false;
if (gInfo.keys['A'] && !ap)
{
ap = true; amb = !amb;
if (amb)
{
ambient[0] = 1; ambient[1] = 1; ambient[2] = 1;
}
else
{
ambient[0] = 0.2f; ambient[1] = 0.2f; ambient[2] = 0.2f;
}
glLightModelfv (GL_LIGHT_MODEL_AMBIENT, ambient);
}
if (!gInfo.keys['A'])
ap = 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;
}
Запустите приложение и проверьте управление прозрачностью, светом и методом наложения текстуры. Обратите внимание на то, что цвета поверхностей куба смешиваются только друг с другом, и не смешиваются с цветом фона. Это происходит благодаря особой логике включения-выключения теста глубины. (см. код в Update, начиная с if (blend)). Временно выключите этот алгоритм управления тестом глубины и сравните результаты.
Другие варианты сочетания констант, задающих метод смешивания, вы исследуете самостоятельно. Их количество достаточно велико, если учесть, что эффект смешивания можно исследовать при разных значениях непрозрачности источника и мишени. Бездумный перебор вариантов вас разочарует, так как далеко не все комбинации имеют смысл. В качестве отправной точки для анализа сообщим, что самый простой вариант (отсутствие смешивания) дает сочетание glBlendFunc (GL_ONE, GL_ZERO);.
Задача перемещения в пространстве (моделирование полета в 3-хмерном пространстве или даже просто ходьбы по горизонтальной поверхности) представляет для начинающего определенную проблему, так как требуют использовать матричные преобразования координат. Различают два подхода в реализации перемещения:
q Изменение параметров функции gluLookAt, которая позволяет управлять позицией глаза наблюдателя, а также центром сцены (позицией точки, куда взгляд направлен), и направлением вверх (то есть, направлением оси, перпендикулярной плоскости перемещения).
q Изменение параметров функций glTranslate*, glRotate*, которые создают матрицы смещения и вращения. Они готовят, тем самым матрицу преобразования координат для всех объектов.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.