Войти
ПрограммированиеСтатьиГрафика

Реализация карт теней с использованием GLSL шейдеров (4 стр)

Автор:

Режим сравнения текстуры

Перед рендерингом затенённой сцены, для автоматического сравнения, которое используется в варианте #2, нам нужно в коде добавить пару строчек, задающих режим сравнения текстуры:

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);

Первая строка задаёт режим сравнения, можно задать одно из двух значений:

1. GL_NONE — выключение сравнения текстуры.
2. GL_COMPARE_R_TO_TEXTURE — включение сравнения текстуры.

Вторая строка задаёт то, как нам сравнивать, можно задать одно из восьми значений:

1. GL_LEQUAL — меньше либо равно.
2. GL_GEQUAL — больше либо равно.
3. GL_LESS — меньше.
4. GL_GREATER — больше.
5. GL_EQUAL — равно.
6. GL_NOTEQUAL — не равно.
7. GL_ALWAYS — всегда.
8. GL_NEVER — никогда.

Сравнение будет происходить по следующему принципу:

При GL_LEQUAL будет:

if (R <= D)
  return 1.0;
else
  return 0.0;

При GL_GEQUAL будет:

if (R >= D)
  return 1.0;
else
  return 0.0;

При GL_LESS будет:

if (R < D)
  return 1.0;
else
  return 0.0;

При GL_GREATER будет:

if (R > D)
  return 1.0;
else
  return 0.0;

При GL_EQUAL будет:

if (R == D)
  return 1.0;
else
  return 0.0;

При GL_NOTEQUAL будет:

if (R != D)
  return 1.0;
else
  return 0.0;

При GL_ALWAYS будет:

return 1.0;

При GL_NEVER будет:

return 0.0;

Где R значение текстурной координаты, а D значение текстуры глубины. Значения должны быть в диапазоне [0..1].
Если у нас фильтрация текстуры глубины GL_TEXTURE_MAG_FILTER не GL_NEAREST или GL_TEXTURE_MIN_FILTER не GL_NEAREST/GL_NEAREST_MIPMAP_NEAREST, то тогда R может быть сравнено больше чем с одним значением текстуры глубины. Детали реализации зависят от производителя видеокарты. Это означает, что на разных видеокартах картинка может различаться.

Сначала посмотрите, как выглядит тень с фильтрацией GL_NEAREST:

shadow_nearest | Реализация карт теней с использованием GLSL шейдеров

А теперь посмотрите, как будет выглядеть тень при фильтрации GL_LINEAR на видеокартах NVIDIA:

shadow_linear | Реализация карт теней с использованием GLSL шейдеров

Стоит заметить, чтобы автоматическое сравнение работало, текстура глубины должна быть GL_DEPTH_COMPONENT, в противном случае результат не определён.

Заключение

shadow | Реализация карт теней с использованием GLSL шейдеров

Надеюсь, информация, изложенная в статье, помогла вам лучше разобраться с тенями.

В заключение хочу поблагодарить XProger и ca$per за помощь в написании статьи.

Пример к статье вы можете скачать по следующей ссылке:
Реализация карт теней с использованием GLSL

Страницы: 1 2 3 4

#GLSL, #OpenGL, #shader, #тени

1 февраля 2009 (Обновление: 14 сен. 2009)

Комментарии [226]