faqs.org.ru

 Главная > Программирование > Программирование графики >

RU.ENGINE.PROG Graphics FAQ

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