Фильтрация текстур. Пиксельные операции. Астана 2004 Лекция 11
Фильтрация текстур Выборка ближайшего текселя GL_NEAREST: Линейная комбинация 4-x соседних пикселей GL_LINEAR:
Фильтрация текстур: mipmapping увеличение текстуры масштаб 1:1 уменьшение текстуры увеличение текстуры масштаб 1:1 уменьшение текстуры в 2 раз
Фильтрация текстур: mipmapping. Часть 2 256x x64 216x16 4 Трилинейная фильтрация GL_LINEAR_MIPMAP_LINEAR
Анизотропная фильтрация Экран Расширение GL_EXT_texture_filter_anisotropic
Использование текстуры как фонового изображения Устанавливаем ортогональную проекцию glMatrixMode(GL_PROJECTION); glLoadIndentity(); glOrtho(-1,1,-1,1,-1,1); Устанавливаем ортогональную проекцию glMatrixMode(GL_MODELVIEW); glLoadIndentity(); Рисуем прямоугольник glEnable(GL_TEXTURE_2D); glBindTexture(bktex); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex2f(-1,-1); glTexCoord2f(1,0); glVertex2f(1,-1); glTexCoord2f(1,1); glVertex2f(1,1); glTexCoord2f(0,1); glVertex2f(-1,1); glEnd();
Текстура и освещение RGBA f из модуля T&LRGBA t текстурыRGBA с результат += Модулирование GL_MODULATE (по умолчанию) Смешение GL_DECAL,GL_BLEND Замещение GL_REPLACE Demo
Генерация текстурных координат Линейная зависимость Environment mapping - эффект отражающей поверхности r n hP (u,v)
Генерация текстурных координат. Продолжение Включаем автоматическую генерацию текстурных координат (для первыхдвух координат) glEnable(GL_TEX_GEN_S); glEnable(GL_TEX_GEN_T); Включаем автоматическую генерацию текстурных координат (для первых двух координат) glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);
Кубические карты среды. n P е r R Точка R определяет одну из шести текстур и текстурные координаты. Расширение GL_EXT_cube_map
Преобразование текстурных координат Работаем с матрицей T точно также как с M и P. glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMultMatrix(…); Позволяет существенно изменять вид объекта не изменяя геометрии
Пиксельные операции T&L Rasterization Pixel Ops Буфер кадра Буфер глубины Буфер трафарета Буфер аккумулятора
Пиксельные операции. Продолжение. Scissor testAlpha test Stencil testDepth testBlending Stencil Buffer: S ij Z Buffer: Z ij Frame buffer: RGBA ij
Scissor & Alpha test Не записывать пиксел Нет Да glScissor(x,y,w,h); glEnable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST); glAlphaFunc(GL_GREATER,0.5);
Смешение цветов glEnable(GL_ENABLE); glDisable(GL_DISABLE); glBlendFunc(sfactor,dfactor) Команды OpenGL: glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA): glBlendFunc(GL_ONE_MINUS_SRC_ALPHA,GL_SRC_ALPHA): glBlendFunc(GL_ZERO,GL_SRC_COLOR):
Полупрозрачные объекты Полупрозрачная грань - грань через часть пикселов которой видно лежащие за ней грани. Ключевые команды glAlphaFunc и glBlendFunc Полупрозрачные грани необходимо выводить в порядке back-to-front. Применение метода Z-буфера ведет к визуальным артефактам -глюкам :) Для выпуклых объектов можно выводить сначала нелицевые грани, а затем - лицевые. Объекты можно выводить методом художника - сортировать по убыванию координат Z центров.
Карты освещенности (lightmaps) (i,j) Карта освещенности: Мультитекстурирование: Экономия количества примитивов при динамическом освещении Экономия текстур при статическом освещении Возможен предварительный расчет освещения
Мультитекстурирование F(RGBA c,RGBA 0 ) RGBA 0 Texture 0 Lighting RGBA c RGBA 1 Texture 1 RGBA f F(RGBA f,RGBA 1 ) Объединение текстуры объекта и текстуры среды Расширение GL_ARB_multitexture
Буфер трафарета и буфер глубины RGBA x,y =F(RGBA x,y,RGBA f ) Изменение S x,y Да Нет Не записывать пиксел void glStencilOp(GLenum failOp, GLenum zfailOp, GLenum zpassOp); failOp: zfailOp: zpassOp: void glStencilFunc(GLenum func, GLint ref, GLuint mask); func:
Буфер трафарета: видимость пикселей true S x,y =1 для грани F - Запись пикселя Да Нет F F S x,y == 1 S x,y == 0 glStencilFunc(GL_KEEP, GL_KEEP, GL_REPLACE); glStencilOp(GL_ALWAYS, 1,1);
Буфер трафарета: обработка пикселей S x,y ==1? - - Запись пикселя Да Нет - F F S x,y == 1 S x,y == 0 glStencilOp(GL_EQUAL, 1,1); glStencilFunc(GL_KEEP, GL_KEEP, GL_KEEP);
Буфер трафарета: тени и отражения Отбрасывание тени на плоскую грань ПравильноНеправильно Отражения и порталы
Буфер трафарета: теневые объемы Строим теневой объем Рисуем затеняемый объект со включенным Z-буфером Z Y … glEnable(GL_DEPTH_TEST); glCallList(object); …
Теневые объемы (2/3). Выводим грани теневого объема в произвольном порядке. Z Y … glStencilFunc(GL_ALWAYS,1,1); glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); glDisable(GL_CULL_FACE); glColorMask(0,0,0,0); glDepthMask(0); glCallList(shadow); glColorMask(1,1,1,1); glDepthMask(1); …
Теневые объемы (3/3). Рисуем затененную часть объекта Z Y … glStencilFunc(GL_EQUAL,1,1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); … glCallList(object); … glDisable(GL_STENCIL_TEST); ……
Системы частиц Система частиц – система из большого количества объектов с достаточно простым поведением Для рисования каждой частицы можно применять текстурированный четырехугольник с полупрозрачностью. Billboard – объект, который всегда повернут к наблюдателю одной стороной