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>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

самовыравнивающиеся полимерные полы для складов
evropoll.ru
Как подобрать палки для скандинавской ходьбы
Прочные эргономичные палки Masters для ходьбы по любому грунту! Подробнее
nordicstick.ru
Лазерная резка металла
Описание профессиональных лазерных аппаратов. Лазерная коррекция зрения
mphold.ru

Вернуться в раздел "Программирование графики" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru