|
|
From: "Alexander J. Samusev" <Alexander.J.Samusev@p15.f877.n5030.z2.fidonet.org>
Date: Sat, 03 Aug 2002 01:14:59 +0400
Subj: Graphics FAQ (Demo)
==========================================================================
RU.ENGINE.PROG Graphics FAQ (Demo)
Frequently
Asked
Questions
by Alexander J. Samusev saj@mailru.com (2:5030/877.15)
Редакция от: 08-Apr-2001
Дата последнего изменения: 03-Aug-2002
Spacial Thanks люди, которые в какой-то мере оказали
влияние на данный FAQ
Alex Mizrahi mizrahi@mizrahi.dn.ua
Alexey Yakovenko alexeyyakovenko@boolatgames.com
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Присылайте свои добавления, поправки по адресу 2:5030/877.15 на мое имя.
==========================================================================
Данный FAQ содержит описание и реализацию различных известных графических
эффектов.
Оглавление
1. BSP
2. Shader
3. Mipmapping
4. Shadowmaps
5. Lightmaps
6. Альфа-канал
7. Color key
8. Environment Mapping
9. Dynamic Lighting
10. Specular Lighting
11. Volumetric fog
12. Portal
13. Pixel Shaders
14. Vertex Shaders
15. Real-time lightmapping
16. Shadow volumes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. BSP
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2. Shader
Shader это небольшой текстовый скрипт в котором определены свойства/сцена-
рий поверхности (surface), как это появляется и функционирует в мире игры
(или в совместимом редакторе). Например, можно делать такие вещи, как:
небо, жидкость (включая как модифицирование текстуры, ее координат, бленд,
environment mapping, так и деформирование координат поверхности, что
позволяет поучить эфект волн) и другие специальные эфекты.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3. Mipmapping
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4. Shadowmaps
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5. Lightmaps
Lighting map - это карта освещенности. Используется как наиболее простой
метод накладывания теней. Обычно lightmap'ы генерят заранее (при построе-
нии геометрии уровня т.е. сборке игровой карты). Lightmap'ы статичны. Про
динамическое освещение (Dynamic Lighting) см. пункт 9.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6. Альфа-канал
Четвертый цветовой канал нужен для задания прозрачности или полупрозрачно-
сти изображения. На каждый цветовой канал отведено определенное количество
бит. На альфу обычно это 1, 4 или 8 бит. Градация прозрачности
прямопропорциональна количеству бит. Альфа канал используется для
смешивания изображений, и реализуется попиксельно по следующей формуле:
color = color0*alpha + color1*(1-alpha)
color - полученный смешанный цвет
color0, color1 - смешиваемые цвета
alpha - коэффициент прозрачности
Эту формулу можно преобразовать в:
color = alpha*(color0 - color1) + color1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7. Color key
Цветовой ключ (color key) обычно используется для того, чтобы сделать
определенный цвет прозрачным (например, черный цвет или цвет, который
редко используется).
Лего реализуется в софтовом рендере. Удобно определить как макрос:
#define TRANSPARENT_COLOR <Your Value>
А при прорисовке проверять цвет, и в случае, если цвета совпадут, не рисо-
вать пиксель.
В Direct3D это делается с помощью следующих функций:
GetDefaultColorKey -- восстанавливает цветовой ключ,
который был установлен по умолчанию
GetColorKey -- возвращает идентификатор текущего
цветового ключа
SetColorKey -- изменяет цветовой ключ
Подробнее про реализацию в Direct3D расписано в DirectX SDK.
В OpenGL нет color key, поэтому позрачность реализуют следующим образом:
glEnable( GL_ALPHA_TEST );
glAlphaFunc( alphafunc, alphafuncref );
При этом текстура должна быть с альфа-каналом.
В своем движке я сделал "искусственный" color key путем пpогpаммного
добавления альфа-канала пеpед загpузкой текстуpы в видео память:
int width, height, bytesperpixel;
unsigned char *pixels;
LoadPicFromDisk (name, &pixels, &width, &height, &bytesperpixel);
if (transpcolor && bytesperpixel >= 3)
{
int i;
unsigned char *s, *d, *newimage;
if ( bytesperpixel == 3 ) // Add alpha channel to mark transparent color
newimage = (unsigned char *)malloc (width*height*4);
else // Use image alpha channel to mark transparent color
newimage = pixels;
if (!newimage)
{ // out of memory
free (pixels);
return 0;
}
for ( i=width*height, s = newimage, d = pixels ; i>0 ; i--, d+=3 )
{
*s++ = d[0];
*s++ = d[1];
*s++ = d[2];
*s++ =
(d[0]==transpcolor[0]&&d[1]==transpcolor[1]&&d[2]==transpcolor[2])?0:255;
}
if ( pixels != newimage )
{
free (pixels);
pixels = newimage;
bytesperpixel = 4;
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8. Environment Mapping
Environment Mapping - эффект отображения окружающей среды. Позволяет де-
лать различные текстурные эффекты, например, отражение на воде, железных
стенах. Принцип состоит в том, чтобы нарисованная или сгенеренная (в
реальном времени или заранее) текстура окружающей среды отображалась на
поверхности, создавая эффект зеркала. Для достижения реалистичности отра-
жения на неровных поверхностях можно сделать различные искажения.
Вот пример получения новых текстурных координат для envmap:
float dir[3];
// отнять от вектора vieworigin вектор vert.origin
// и записать результат в dir
vec_sub (vert.origin, vieworigin, dir);
vec_norm (dir);
vert.uv[0] = dir[0]+vert.normal[0];
vert.uv[1] = dir[1]+vert.normal[1];
Выше приведенный код нужно применить для каждой вершины.
Алгоритм получения эффекта:
stage0 + stage1,
где stage0 - базовая текстура;
stage1 - текстура окружающей среды.
Для аппаратной акселлерации под Direct3D можно исполтьзовать:
SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX,
D3DTSS_TCI_CAMERASPACENORMAL | 1 );
Подробнее про Direct3D можно узнать в RU.DIRECTX
Для аппаратной акселлерации под OpenGL можно поюзать
GL_NV_texgen_reflection
За подробной информацией в RU.OPENGL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9. Dynamic Lighting
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10. Specular Lighting
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11. Volumetric fog
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12. Portal
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13. Pixel Shaders
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
14. Vertex Shaders
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15. Real-time lightmapping
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16. Shadow volumes
<under construction>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
© faqs.org.ru