что такое steep parallax в сталкере
Что такое steep parallax в сталкере
В настоящее время игра «Сталкер» не требует наличия у игрока топовой конфигурации компьютера, как это было раньше. Компьютерное железо в своём развитии ушло далеко вперед. Сейчас трудно найти компьютер с памятью меньше 2 Гб и процессором с числом ядер меньше двух. Именно столько и требует эта замечательная игра. «Сталкер» хорошо идёт даже на современных интегрированных видеокартах. Например, APU от AMD (в которых центральный процессор совмещён с несколькими видеоядрами) хорошо тянет «Сталкер — Зов Припяти» на средних настройках графики в разрешении 720p. То есть для относительно комфортной игры даже не требуется дискретная видеокарта!
Но не все пользователи имеют даже такие компьютеры. Многие пытаются запустить «Сталкер» на «калькуляторе» — компьютере 10-ти или 15-летней давности. Также большое количество сталкероманов играют на ноутбуках, которые зачатую имеют слабый процессор и не оснащены дискретной видеокартой.
Чтобы решить вопрос комфортной игры на слабых компьютерах мы и написали эту статью. Через настройки игры вполне возможно увеличить средний FPS в нашей любимой игре, а использую другие хитрости можно вообще запускать игру на таком железе, на котором даже теоретически «Сталкер» не мог запускаться.
Прежде всего разберемся с настройками игры, которые помогают нам существенно увеличить FPS (количество кадров в секунду) без заметного снижения качества картинки.
Сразу оговоримся, что значит слабое, среднее и сильное влияние на производительность:
Настройки графики в игре «Сталкер — Зов Припяти» (относится также к двум другим играм серии):
Ниже выкладываем информацию для тех, кто любит копаться в конфигурационном файле User.ltx. Этот файл находится в папке «Мои документы» в директориях сохранённых игр для ОС Windows 7 и новее. Параметры в списке указаны для игры «Сталкер — Чистое Небо», хотя большинство параметров вполне подходит и для двух других серий игры. Все правки делаем блокнотом. После исправлений в файле User.ltx не рекомендуется менять настройки в самой игре — возможны вылеты. На всякий случай сохраните файл User.ltx в надежном месте, если игра не сможет стартовать из-за ошибки правок файла, то можно будет его легко заменить на оригинальный файл.
Параметры r1_* (для режима DirectX 8)
Вкл./Выкл. свет от вашего фонарика. Не рекомендую его выключать, а то ночью слишком страшно будет 🙂
r1_dlights_clip [10.000 — 150.000]
Возможно, это влияет на дальность освещения вашим фонариком.
r1_glows_per_frame [2 — 32]
Установка числа источников света. Не сильно влияет на качество графики и на ФПС.
r1_lmodel_lerp [0.000 — 0.333]
r1_ssa_lod_a [16.000 — 96.000]
Регулирует основной Уровень Детализации (LOD), чем выше величина, тем больше детализация и видимость объектов на расстоянии, но за счет легкого падения FPS.
r1_ssa_lod_b [16.000 — 64.000]
Установка подобна предыдущей, но управляет детализацией некоторых объектов на карте. Снова, чем выше значение, тем меньше ФПС.
r1_tf_mipbias [-0.500 — 0.500]
Управляет чёткостью текстур на расстоянии. При уменьшении значения текстуры будут более чёткие, но за это придется платить незначительным падением ФПС. Повышение параметра сделает текстуры размытыми, но может чуть-чуть поднять ФПС.
Параметры r2_* (для режима DirectX 9)
Эта опция включает т.н. псевдосглаживание. Это не является настоящим антиальясингом, а просто немного размазывает картинку на экране. Если у вас ЖК монитор, вы можете получить похожий эффект нахаляву, поставив разрешение экрана чуть меньше родного 🙂 При его включении немного падает ФПС. Если включить эту опцию в DX10-режиме, это может привести к появлению артефактов.
r2_aa_kernel [0.300 — 0.700]
Регулирует величину псевдосглаживания. Чем выше значение, тем сильнее размытие. Значение 0.300 даёт разумную величину размытия.
Эта опция регулирует расстояние, на котором действует псевдосглаживание. Вы можете сами подобрать удобное вам значение, но их увеличение не обязательно означает прирост качества. Например, значение r2_aa_break 0.000000,1.000000,0.000000 даст чёткие закрытые помещения и размытые открытые пространства.
r2_aa_weight [0.000000 — 1.000000,0.000000 — 1.000000,0.000000 — 1.000000]
Этот параметр нужен для более точного управления псевдосглаживающим эффектом. Чем выше значения, тем сильнее смазывание.
При включении опции частично будет использоваться DX8 освещение. Вроде бы, производительность должна подняться, но на деле может быть наоборот…
r2_dof [0.000000 — 1.000000,0.000000 — 1.000000,0.000000 — 1.000000]
Эта фича регулирует величину постфильтра Depth of Field. Но всё же, лучше менять значения рассмотренных ниже опций r2_dof_*.
r2_dof_far [0.000 — 10000.000]
Эта настройка управляет расстоянием, на котором включается DoF. Это не относится к временному повышению DoF (при перезарядке оружия), а действует постоянно. Понижение опции с значения 600 по-умолчанию увеличит размытость картинки.
r2_dof_focus [-10000.000 — 10000.000]
Чем ниже значение этой величины (по дефолту 1.4), тем меньшая часть вашего поля зрения будет «в фокусе». Это будет особенно заметно при изменении значений r2_dof_far и r2_dof_near.
r2_dof_kernel [0.000 — 10.000]
Эта опция регулирует общий уровень DoF. При установке 0, DoF не будет заметен вообще, а более высокие числа повышают его уровень.
r2_dof_near [-10000.000 — 10000.000]
r2_dof_sky [-10000.000 — 10000.000]
Уровень DoF применительно к небу. По умолчанию 30, и чем выше оно, тем более размытое небо.
Вкл/выкл более реалистичный метод освещения «Global Illumination», при котором свет может отражаться с поверхностей и освещать другие поверхности. Включение этой опции сильно бьёт по производительности. Опция не работает в двух режимах «Улучшенное полное динамическое освещение».
r2_gi_clip [0.000 — 0.100]
Настройка расстояния действия Global Illumination.
Настройка глубины теней.
r2_gi_photons [8 — 256]
Опция регулирует уровень Global Illumination. Значения должны быть кратны 8.
r2_gi_refl [0.001 — 0.990]
Регулирует отражающий эффект поверхностей.
r2_gloss_factor [0.000 — 10.000]
Чем больше значение этого параметра, сильнее блестят глянцевые поверхности.
Эта опция включает усиленную форму Bloom’a, но не заменяет HDR Bloom’ом. При включении картинка будет слишком яркой и смазанной, на ФПС почти не влияет. Вам не нужно включать эту опцию, чтобы использовать другие параметры r2_ls_bloom_*.
r2_ls_bloom_kernel_b [0.010 — 1.000]
Управляет уровнем размытия Bloom’a, чем больше величина, тем сильнее засветка от источников света.
r2_ls_bloom_threshold [0.000 — 1.000]
Регулирует яркость Bloom’a, чем больше значение, тем менее яркость Bloom’a, использующегося вместе с HDR. В результате, при значении 1, картинка будет как на DX8. Можете попробовать значение 0.350, чтобы блум был более красивым.
r2_ls_depth_bias [-0.500 — 0.500]
Регулятор дальности вида источников света. Низкие значения увеличивают глубину и границу источника, повышение параметра может практически полностью удалить источники света. Оптимально значение по умолчанию.
r2_ls_depth_scale [0.500 — 1.500]
Аналогичная предыдущей установка.
r2_ls_squality [0.500 — 1.000]
Настройка качества теней.
r2_mblur [0.000 — 1.000]
Регулирует смазывание при движении. Отлично смотрится со значением 0.1, причём это не влияет на ФПС. Чтобы активировать это, недостаточно изменить параметр в конфиг-файле, нужно запустить игру с параметром –mblur. Открываете свойства ярлыка игры, и в пути к запускающему экзешнику дописываете –mblur через пробел. Получится примерно так: «D/Supergames/STALKER/XR_3DA.exe» –mblur. Опция не работает в двух режимах «Улучшенное полное динамическое освещение».
Вкл./выкл. Parallax Mapping
r2_parallax_h [0.000 — 0.500]
Эта опция должна управлять Parallax Mapping’ом, но никаких визуальных изменений не наблюдается.
r2_slight_fade [0.020 — 2.000]
Настройка дистанции освещения.
r2_ssa_lod_a [16.000 — 96.000]
Регулирует Уровень Детализации (LOD) для мира игры, чем выше величина, тем больше детализация и видимость объектов на расстоянии, но за счет легкого падения FPS.
r2_ssa_lod_b [32.000 — 64.000]
Опция подобна предыдущей, но управляет детализацией объектов.
Вкл/выкл Солнце как источник света. Если выкл, деревья и дома не будут отбрасывать тени. Если опция включена, можно поиграться с параметрами r2_sun_depth_*
r2_sun_depth_far_bias [-0.500 — 0.500]
r2_sun_depth_far_scale [0.500 — 1.500]
r2_sun_depth_near_bias [-0.500 — 0.500]
r2_sun_depth_near_scale [0.500 — 1.500]
Эти параметры регулируют r2_sun, если оно включено. Это управление уровнем детализации теней и границей солнечного света и теневых областей. Оптимальны значения по умолчанию.
r2_sun_near [1.000 — 50.000]
Контролирует качество солнечного света на близких к игроку поверхностях.
r2_sun_far [51.000 — 180.000]
Контролирует качество солнечного света на далёких от игрока поверхностях.
r2_sun_lumscale [-1.000 — 3.000]
Определяет яркость Солнца, с величинами ниже нуля выключает Солнце :).
r2_sun_lumscale_amb [0.000 — 3.000]
Регулирует яркость предметов, которые освещены Солнцем.
r2_sun_lumscale_hemi [0.000 — 3.000]
Регулирует общую яркость всех предметов.
r2_tf_mipbias [-0.500 — 0.500]
Определяет, насколько чёткими будут текстуры на расстоянии. При уменьшении значения текстуры будут более чёткие, но за это придется платить незначительным падением ФПС. Повышение параметра сделает текстуры размытыми, но может чуть-чуть поднять ФПС. Не работает в DX10-режиме.
Вкл/выкл Tone Mapping. Включение сделает HDR более качественным без падения производительности. Следующие опции r2_tonemap_* позволяют его настраивать.
r2_tonemap_adaptation [0.010 — 10.000]
Опция указывает время адаптации зрения к изменению уровня освещения.
r2_tonemap_lowlum [0.000 — 1.000]
Эта установка регулирует Tone Mapping’а в темных областях. Чем выше эта установка, тем темнее HDR.
r2_tonemap_middlegray [0.000 — 2.000]
Эта установка имеет наиболее сильное влияние на HDR, и если её поднять, эффект HDR будет более богатый. Например, попробуйте величину 1.2, чтобы HDR в С.Т.А.Л.К.Е.Р.е выглядел, как в Oblivion’е.
Экспериментальная опция, включение непротестированных шейдеров. Скорее всего, приведёт к снижению производительности или артефактам.
Вкл./выкл. мягкие частицы.
Вкл./выкл. мягкую воду.
r2_ssao st_opt_high [off,high]
r2_sun_quality st_opt_high [low,high]
r2_sun_shafts st_opt_high [off,high]
Солнечные лучи, сильно влияют на ФПС. Поэтому их можно выключить, ФПС хорошо поднимется, а качество упадёт несильно.
Параметры r3_* (для режима DirectX 10)
r3_dynamic_wet_surfaces_far [30.000 — 100.000]
Эта фича контролирует расстояние, на котором видны мокрые поверхности. Значение по умолчанию 30, чем оно выше, тем дальше видны мокрые поверхности.
r3_dynamic_wet_surfaces_near [10.000 — 70.000]
Эта фича контролирует расстояние, на котором видны мокрые поверхности рядом с игроком. Значение по умолчанию 10, чем оно выше, тем менее детализированы близкие к игроку мокрые поверхности.
r3_dynamic_wet_surfaces_sm_res [64 — 2048]
Настройка разрешения карт мокрых поверхностей. Изначально стоит 256, если его повысить, качество этих поверхностей возрастёт, но FPS уменьшится.
Вкл./выкл. специальную оптимизацию рендеринга под DX10. Включение может поднять FPS, но вызвать некоторые артефакты, а может и не вызвать 🙂
Это управление сглаживанием в DX10-режиме. Для сохранения изменений необходим перезапуск игры.
Параметры для всех режимов
r__supersample [1 — 8]
Настройка сглаживания. Чтобы работало в DX10, вместе с этой опцией нужно включить r3_msa.
Настройка анизотропной фильтрации.
r__dtex_range [5.000 — 175.000]
Настройка расстояния, на котором видны высокодетализированные текстуры. Чем выше значение, тем дальше их видно.
r__wallmark_ttl [1.000 — 300.000]
Время жизни таких эффектов, как следы от пуль, кровь и т.п. Выше значение – дольше они будут оставаться.
r__geometry_lod [0.1 — 1.2]
Уровень детализации объектов. Большие значения соответствуют лучшей детализации.
r__detail_density [0.2 — 0.6]
Уровень детализации травы. Большие значения соответствуют лучшей детализации.
Когда включено, на экране будет показана всякая техническая статистика, в т.ч. число кадров в секунду – FPS.
Вкл/выкл аппаратное ускорение звука.
snd_cache_size [4 — 32]
Настраивает, сколько оперативной памяти используется для кэширования звуков, чтобы предотвратить заедания. При этом используется в два раза больше памяти, то есть, если вы поставите 16, будет использовано 32 МБ. Желательно ставить максимальное значение (32), чтобы предотвратить подгрузки звука во время игры.
Опция определяет число одновременных источников звука, повышение отрицательно влияет на производительность при слабой (читай-встроенной) звуковой карте. На слабых звуковухах лучше ограничиться значением 24.
Настройка разрешения экрана, здесь можно выставить разрешение, которого нет в меню игры.
Вкл\выкл тени от объектов, освещаемых фонарями.
По умолчанию, когда вы жмёте Вперёд, игрок бежит, если эту опцию выключить, он будет идти шагом.
Уровень детализации удалённых текстур. Чем ниже значение, тем лучше текстуры.
Вертикальная синхронизация. Рекомендую отключить это.
rs_vis_distance [0.4 — 1.5]
Настройка дальности видимости.
Видео с общей информацией, помогающей запускать «Сталкер» и моды для него на слабом «железе»:
Что такое steep parallax в сталкере
Открываем библиотеку, ищем S.T.A.L.K.E.R.: Call of Pripyat, нажимаем правой кнопкой мыши и выбираем свойства, затем в открышимся разделе общие, выбираем установить параметры запуска, и вписываем туда все команды и их значения что описал ниже.
Настройки конфигурации в S.T.A.L.K.E.R.: Call of Pripyat хранятся в файле User.ltx, который находится по адресу \Documents and Settings\All Users\Общие документы\STALKER-STCOP в Windows XP, либо \Users\Public\Documents\STALKER-STCOP в Windows Vista. Файл можно открыть с помощью Блокнота. Прежде чем вносить в него изменения, сделайте резервную копию. Рассмотрим некоторые настройки из этого файла. В квадратных скобках записаны возможные значения параметров.
После редактирования файла User.ltx нежелательно менять настройки в меню игры, этим можно сбить все изменения в конфиг-файле.
r1_dlights [on,off]
Вкл./Выкл. свет от вашего фонарика. Не рекомендую его выключать, а то ночью слишком страшно будет 🙂
r2_aa [on,off]
Эта опция включает т.н. псевдосглаживание. Это не является настоящим антиальясингом, а просто немного размазывает картинку на экране. Если у вас ЖК монитор, вы можете получить похожий эффект нахаляву, поставив разрешение экрана чуть меньше родного 🙂 При его включении немного падает ФПС. Если включить эту опцию в DX10-режиме, это может привести к появлению артефактов.
r2_allow_r1_lights [on,off]
При включении опции частично будет использоваться DX8 освещение. Вроде бы, производительность должна подняться, но на деле может быть наоборот…
r2_gi [on,off]
Вкл/выкл более реалистичный метод освещения «Global Illumination», при котором свет может отражаться с поверхностей и освещать другие поверхности. Включение этой опции сильно бьёт по производительности. Опция не работает в двух режимах «Улучшенное полное динамическое освещение».
r2_ls_bloom_fast [on,off]
Эта опция включает усиленную форму Bloom’a, но не заменяет HDR Bloom’ом. При включении картинка будет слишком яркой и смазанной, на ФПС почти не влияет. Вам не нужно включать эту опцию, чтобы использовать другие параметры r2_ls_bloom_*.
r2_steep_parallax [on,off]
Вкл./выкл. Parallax Mapping
r2_sun [on,off]
Вкл/выкл Солнце как источник света. Если выкл, деревья и дома не будут отбрасывать тени. Если опция включена, можно поиграться с параметрами r2_sun_depth_*
r2_sun_details [on,off]
Тени травы
r2_tonemap [on,off]
Вкл/выкл Tone Mapping. Включение сделает HDR более качественным без падения производительности. Следующие опции r2_tonemap_* позволяют его настраивать.
r2_exp_donttest_shad [on,off]
Экспериментальная опция, включение непротестированных шейдеров. Скорее всего, приведёт к снижению производительности или артефактам.
r2_soft_particles [on,off]
Вкл./выкл. мягкие частицы.
r2_soft_water [on,off]
Вкл./выкл. мягкую воду.
r2_ssao st_opt_high [off,high]
Настройка ssao.
r2_ssao_blur [on,off]
Настройка блюра.
r2_sun_quality st_opt_high [low,high]
Качество солнца.
r2_sun_shafts st_opt_high [off,high]
Солнечные лучи, сильно влияют на ФПС. Поэтому их можно выключить, ФПС хорошо поднимется, а качество упадёт несильно.
r3_gbuffer_opt [on,off]
Вкл./выкл. специальную оптимизацию рендеринга под DX10. Включение может поднять FPS, но вызвать некоторые артефакты, а может и не вызвать 🙂
r3_msaa [st_opt_off,2x,4x,8x]
Это управление сглаживанием в DX10-режиме. Для сохранения изменений необходим перезапуск игры.
rs_stats [on,off]
Когда включено, на экране будет показана всякая техническая статистика, в т.ч. число кадров в секунду – FPS.
snd_acceleration [on,off]
Вкл/выкл аппаратное ускорение звука.
vid_mode [WxH]
Настройка разрешения экрана, здесь можно выставить разрешение, которого нет в меню игры.
ai_use_torch_dynamic_lights [on,off]
Вкл\выкл тени от объектов, освещаемых фонарями.
g_always_run [on,off]
По умолчанию, когда вы жмёте Вперёд, игрок бежит, если эту опцию выключить, он будет идти шагом.
rs_v_sync [on,off]
Вертикальная синхронизация. Рекомендую отключить это.
-center_screen – Центрирует окно игры при оконном режиме.
-dsound – Использует звук DirectSound вместо OpenAL.
-gpu_nopure – Переключает полное аппаратное ускорение видеокарты на неполное. На новых картах это не прибавит производительности.
-gpu_ref – Переключает режим видеокарты на режим по-умолчанию
-gpu_sw – Полностью отключает аппаратное ускорение видеокарты. Не рекомендуется.
-load [ваш сэйв] – Загрузка определённого сэйва сразу после запуска игры.
-ltx [filename.ltx] – Загружает и выполняет определенный файл «filename.ltx» конфигурации. Например, вы можете создать свой конфиг-файл вместо User.ltx, и запускать его этой командой.
-nodistort – Удаляет эффекты искажения: воздух от костра, аномалии. Это может помочь обладателям старых видеокарт.
-nolog – Отключает лог
-noprefetch – Отключает prefetch. Игра станет грузиться быстрее, но в игре могут быть резкие падения ФПС.
-noshadows – Отключает тени от динамических источников света (Солнце не в счёт), повышается ФПС.
-nosound – Отключает весь звук в игре
-overlay [путь к папке] – Указание пути к другой папке с сэивами/конфигами/профилями.
-psp – Включает вид от третьего лица.
Настройка User.ltx
Улучшение детализации:
Откройте файл user.ltx в блокноте, найдите и выставите следующие значения параметрам:
r2_ssa_lod_a 64.
r2_ssa_lod_b 96.
Снижение размытости дальних объектов:
Откройте файл user.ltx в блокноте, найдите и выставите следующие значения параметрам:
r2_dof_enable on
r2_dof_kernel 2.
r1_dlights [on, off]
Вкл./Выкл. свет от вашего фонарика. Не рекомендую его выключать, а то ночью слишком страшно будет.
r2_aa [on, off]
Эта опция включает т.н. псевдосглаживание. Это не является настоящим антиальясингом, а просто немного
размазывает картинку на экране. Если у вас ЖК монитор, вы можете получить похожий эффект нахаляву,
поставив разрешение экрана чуть меньше родного. При его включении немного падает ФПС. Если включить
эту опцию в DX10-режиме, это может привести к появлению артефактов.
r2_aa_break 0.000000,1.000000,0.000000 даст ч?ткие закрытые помещения и размытые открытые простран-
ства.
r2_allow_r1_lights [on, off]
При включении опции частично будет использоваться DX8 освещение. Вроде бы, производительность долж-
на подняться, но на деле может быть наоборот.
r2_gi [on, off]
Вкл/выкл. более реалистичный метод освещения «Global Illumination», при котором свет может отражаться с
поверхностей и освещать другие поверхности. Включение этой опции сильно бь?т по производительности.
Опция не работает в двух режимах «Улучшенное полное динамическое освещение».
r2_ls_bloom_fast [on, off]
Эта опция включает усиленную форму Bloom’a, но не заменяет HDR Bloom’ом. При включении картинка бу-
дет слишком яркой и смазанной, на ФПС почти не влияет. Вам не нужно включать эту опцию, чтобы исполь-
зовать другие параметры r2_ls_bloom_*.
r2_steep_parallax [on, off]
Вкл./выкл.. Parallax Mapping.
r2_sun_details [on, off]
Тени травы.
r2_tonemap [on, off]
Вкл/выкл. Tone Mapping. Включение сделает HDR более качественным без падения производительности.
Следующие опции r2_tonemap_* позволяют его настраивать.
r2_exp_donttest_shad [on, off]
Экспериментальная опция, включение непротестированных шейдеров. Скорее всего, привед?т к снижению
производительности или артефактам.
r2_soft_particles [on, off]
Вкл./выкл. мягкие частицы.
r2_soft_water [on, off]
Вкл./выкл.. мягкую воду.
r2_ssao st_opt_high [off, high]
Настройка ssao.
r2_ssao_blur [on, off]
Настройка блюра.
r2_sun_quality st_opt_high [low, high]
Качество солнца.
r3_gbuffer_opt [on, off]
Вкл./выкл. специальную оптимизацию рендеринга под DX10. Включение может поднять FPS, но вызвать не-
которые артефакты, а может и не вызвать.
r3_msaa_alphatest st_opt_atest_msaa_dx10_1
r3_use_dx10_1 on
Включение сглаживания прозрачных текстур (альфа-сглаживание).
Параметры для всех режимов
rs_stats [on, off]
Когда включено, на экране будет показана всякая техническая статистика, в т.ч. число кадров в секунду –
FPS.
snd_acceleration [on, off]
Вкл/выкл. аппаратное ускорение звука.
vid_mode [WxH]
Настройка разрешения экрана, здесь можно выставить разрешение, которого нет в меню игры.
ai_use_torch_dynamic_lights [on, off]
Вкл\выкл тени от объектов, освещаемых фонарями.
g_always_run [on, off]
По умолчанию, когда вы жм?те Впер?д, игрок бежит, если эту опцию выключить, он будет идти шагом.
rs_v_sync [on, off]
Вертикальная синхронизация. Рекомендую отключить это.
Learn OpenGL. Урок 5.6 – Parallax Mapping
Parallax Mapping
Parallax Mapping относится к семейству техник Displacement Mapping или рельефного текстурирования, которые смещают вершины геометрии на основе значений, хранящихся в специальных текстурных картах. Для примера представьте плоскость, составленную из порядка тысячи вершин. Каждую из них можно сместить согласно величине, считанной из текстуры, представляющую собой высоту плоскости в данной точки. Такая текстура, содержащая значения высоты в каждом текселе, называется картой высот. Примером такой карты, полученной на основе геометрических характеристик поверхности кирпичной кладки, может служить следующее изображение:
Осуществляя выборки из данной карты и смещая каждую вершину согласно значению высоты, можно из идеальной плоскости получить выпуклую поверхность, повторяющую геометрические параметры исходной поверхности. Так, взяв плоскость с достаточным количеством вершин и применив карту высот из примера, можно получить следующий результат:
Описанный подход прост и легок в реализации, но требует большой плотности вершин в обрабатываемом объекте, иначе результат смещения будет слишком грубым. И если на каждую плоскую поверхность начать отпускать по тысяче с лишком вершин, то очень скоро мы просто не будем успевать рендерить все, что нам требуется. Может быть найдется алгоритм, позволяющий качественно сымитировать качество наивного алгоритма Displacement Mapping, но при этом не требуя таких затрат на геометрию? Если стоите – сядьте, поскольку на изображении выше на самом деле присутствует всего шесть вершин (два треугольника)! Рельеф кирпичной кладки отлично сымитирован благодаря использованию Parallax Mapping, техники рельефного текстурирования, не требующей множества вершин для правдоподобной передачи рельефа поверхности, а, как и Normal Mapping, использующей оригинальный подход для обмана глаз наблюдателя.
Основная идея реализации в том, чтобы на основе направления взгляда и данных карты высот исказить текстурные координаты для текущего фрагмента так, чтобы создать иллюзию, будто этот фрагмент принадлежит участку поверхности, лежащей выше или ниже, чем есть на самом деле. Для лучшего понимания принципа посмотрите на схему нашего примера с кирпичами:
Здесь грубая красная линия представляет собой значения из карты высот, отражающие геометрические характеристики имитируемой поверхности кирпичной кладки. Вектор представляет собой направление от поверхности на наблюдателя (viewDir). Если бы плоскость действительно была рельефной, то наблюдатель увидел бы точку поверхности
. Однако, по факту мы имеем идеальную плоскость и луч по направлению взгляда пересекает плоскость в точке
, что очевидно. Задача Parallax Mapping сместить текстурные координаты в точке
так, чтобы они стали идентичны координатам, соответствующим точке
. Далее для текущего фрагмента (соответствует точке
) мы используем полученные координаты точки
для всех необходимы текстурных выборок, что и создает иллюзию, будто наблюдатель видит точку
.
Основная сложность заключена в том, как вычислить текстурные координаты точки находясь в точке
. Parallax Mapping предлагает приближенное решение, применяя простое масштабирование вектора направления от поверхности
к наблюдателю на величину высоты для фрагмента
. Т.е. просто меняем длину
так, чтобы она соответствовала величине выборки из карты высот
, соответствующей фрагменту
. На схеме ниже показан результат масштабирования – вектор
:
Далее результирующий вектор раскладывается на компоненты в соответствии с системой координат самой плоскости, которые используются как смещения для исходных текстурных координат. При этом, поскольку вектор
вычисляется с использованием величины из карты высот, то чем больше значение высоты соответствует текущему фрагменту, тем сильнее для него будет смещение.
Этот простой прием дает неплохие результаты в ряде случаев, но все же является очень грубой оценкой положения точки . Если карта высот содержит участки с резко меняющимися значениями, то результат смещения становится некорректным: скорее всего вектор
даже близко не будет попадать в окрестность точки
:
Исходя из вышеописанного, остается еще один вопрос: каким же образом определить, как корректно спроецировать вектор на произвольно сориентированную поверхность, чтобы получить компоненты для смещения текстурных координат? Было бы неплохо вести расчеты в некой системе координат, где разложение вектора
на компоненты x и y всегда бы соответствовало базису текстурной системы координат. Если вы внимательно проработали урок по Normal Mapping, то уже догадались, что речь идет о расчетах в касательном пространстве.
Переведя вектор от поверхности к наблюдателю в касательное пространство мы получим измененный вектор
, покомпонентное разложение которого всегда будет вестись в соответствии с векторами касательной и бикасательной для данной поверхности. Поскольку касательная и бикасательная всегда сонаправлены с осями текстурной системы координат поверхности, то, независимо от ориентации поверхности, можно спокойно использовать компоненты x и y вектора
как смещения для текстурных координат.
Однако, довольно теории и, закатав рукава, перейдем к непосредственной реализации.
Parallax Mapping
Для реализации мы будем использовать простую плоскость с рассчитанными для нее касательной и бикасательной – это мы уже умеем делать по уроку о Normal Mapping. Плоскости мы назначим ряд текстурных карт: диффузную, нормалей и смещения, файл каждой из которых доступен по соответствующей ссылке. В уроке мы также применим и Normal Mapping, поскольку Parallax Mapping создает иллюзию рельефа поверхности, которая легко нарушается, если освещение не будет изменяться соответственно рельефу. Поскольку карты нормалей зачастую создаются на основе карт высот, то их совместное применение гарантирует корректную связь освещения с учетом рельефа.
Вы, вероятно, уже заметили, что карта смещения, приведенная по ссылке выше, по факту представляет собой инверсию карты, приведенной в начале урока. Реализация Parallax Mapping обычно ведется как раз с использованием таких карт, обратным к картам высот – карт глубин. Так получается, поскольку имитация углублений на плоскости осуществляется несколько легче, чем имитация возвышения. В соответствии с этим изменением меняется и схема работы Parallax Mapping:
Снова мы видим знакомые точки и
, однако, в этот раз вектор
получается вычитанием вектора
из текстурных координат в точке
. Значения глубины вместо высоты можно получить просто вычитая выборку глубины из единицы или инвертировав цвета текстуры в любом редакторе изображений.
Parallax Mapping реализуется в фрагментном шейдере, поскольку данные о рельефе отличаются для каждого фрагмента внутри треугольника. Код фрагментного шейдера потребует расчета вектора от фрагмента к наблюдателю , так что понадобится передать ему положение фрагмента и наблюдателя в касательном пространстве. По результатам урока о Normal Mapping у нас на руках остался вершинный шейдер, который передает все эти вектора уже приведенными к касательному пространству, воспользуемся им:
Из важного отмечу только то, что конкретно под нужды Parallax Mapping необходимо передать во фрагментный шейдер aPos и положение наблюдателя viewPos в касательном пространстве.
Внутри шейдера реализуем алгоритм Parallax Mapping, что выглядит примерно так:
Мы объявили функцию ParallaxMapping, которая принимает текстурные координаты фрагмента и вектор от фрагмента на наблюдателя в касательном пространстве. Результатом функции становятся смещенные текстурные координаты, которые уже и используются для выборок из диффузной текстуры и карты нормалей. В результате диффузный цвет пикселя и его нормаль корректно соответствуют измененной «геометрии» плоскости.
Что же скрывается внутри функции ParallaxMapping?
Данная относительно простая функция является буквальной реализацией метода, основные моменты которого мы обсудили выше. Берутся исходные текстурные координаты texCoords, с помощью них делается выборка высоты (или глубины) из depthMap для текущего фрагмента. Для расчета вектора
берется вектор viewDir в касательном пространстве и пара его компонент x и y делится на компоненту z, а результат масштабируется считанным значением смещения height. Также введен юниформ height_scale для дополнительной возможности управления степенью выраженности эффекта Parallax Mapping, поскольку обычно эффект смещения выходит слишком сильным. Для получения результата мы вычитаем полученный вектор
из исходных текстурных координат.
Разберемся с моментом деления viewDir.xy на viewDir.z. Поскольку вектор viewDir нормализован, то его компонента z лежит в интервале [0, 1]. Когда вектор практически параллелен поверхности компонента z близка к нулю, а операция деления возвращает вектор гораздо большей длины, чем в случае если viewDir близок к перпендикуляру к поверхности. Другими словами, мы масштабируем вектор
так, чтобы он увеличивался при взгляде на поверхность под углом – это позволяет получить более реалистичный результат в таких случаях.
Некоторые разработчики предпочитают убирать масштабирование делением на viewDir.z, поскольку, в определенных случаях, такой подход дает некорректные результаты при взгляде под углом. Эта модификация техники называется Parallax Mapping with Offset Limiting. Выбор варианта подхода, по большей части, остается делом личных предпочтений – я, например, более лоялен к результатам работы обычного алгоритма Parallax Mapping.
Результирующие измененные текстурные координаты в итоге используются для выборки из диффузной карты и карты нормалей, что дает нам довольно неплохой эффект искажения поверхности (параметр height_scale здесь выбран близким к 0.1):
На изображении можно сравнить эффект техник Normal Mapping и Parallax Mapping. Поскольку Parallax Mapping имитирует неровности поверхности, то для этой техники возможны ситуации, когда кирпичики действительно перекрывают друг друга, в зависимости от направления взгляда.
Также видны и странные артефакты вдоль границ оттекстурированной плоскости. Появляются они вследствие того, что смещенные алгоритмом Parallax Mapping текстурные координаты могут выпасть за пределы единичного интервала и, в зависимости от режима повторения текстуры (wrapping mode), вызвать появление нежелательных результатов. Простой способ избавления от таких артефактов – просто отбросить все фрагменты, для которых текстурные координаты оказались вне единичного интервала:
В итоге все фрагменты, имеющие смещенные текстурные координаты, выпадающие из интервала [0, 1], будут отброшены и визуально результат действия Parallax Mapping станет приемлемым. Очевидно, что этот метод отбраковки не универсален и может быть неприменим для некоторых поверхностей или случаев текстурирования. Но на примере плоскости он работает идеально и помогает усилить эффект изменения рельефа плоскости:
Исходники примера находятся здесь.
Выглядит неплохо, да и производительность метода отличная – всего то потребовалась одна дополнительная выборка из текстуры! Но простота метода имеет и значительные недостатки: эффект рельефности легко разрушается при взгляде на плоскость под углом (что верно и для Normal Mapping) или при наличии в карте высот участков с резкими перепадами значений:
Причина разрушения иллюзии кроется в том, что алгоритм является весьма грубым приближением реального Displacement Mapping. Однако, нас могут выручить несколько дополнительных приемов, которые позволяют получить практически идеальные результаты даже при взгляде под углом или при использовании карт высот с резкими перепадами. Например, мы можем использовать несколько выборок из карты высот, дабы найти точку, ближайшую к точке .
Steep Parallax Mapping
Техника Steep Parallax Mapping является логическим развитием классического Parallax Mapping: используется такой же подход в алгоритме, но вместо единственной выборки берется несколько – для лучшей аппроксимации вектора , использующегося для расчета точки
. За счет этих дополнительных выборок результат работы алгоритма визуально гораздо более правдоподобен, даже в условиях взгляда под острыми углами к поверхности.
Основа подхода Steep PM заключается в том, чтобы взять некоторый диапазон глубин и разбить его на равные по размеру слои. Далее мы итеративно проходим по слоям одновременно смещая исходные текстурные координаты в направлении вектора и делая выборки из карты глубин, останавливаясь в тот момент, когда глубина из выборки оказывается меньше, чем глубина текущего слоя. Ознакомьтесь со схемой:
Как видно, мы движемся по слоям сверху вниз и для каждого слоя сравниваем его глубину со значением из карты глубин. Если глубина слоя оказывается меньше значения из карты глубин, это значит, что вектор , соответствующий этому слою, лежит выше поверхности. Этот процесс повторяется до тех пор, пока глубина слоя не оказывается больше выборки из карты глубин: в этот момент вектор
указывает на точку, лежащую под имитируемым рельефом поверхности.
В примере видно, что выборка из карты глубин на втором слое () все еще лежит «глубже» по отношению к величине глубины второго слоя равной 0.4, а значит процесс поиска продолжается. В следующем проходе глубина слоя равная 0.6 наконец оказывается лежащей «выше» значения выборки из карты глубин (
). Отсюда мы делаем вывод, что вектор
полученный для третьего слоя является наиболее достоверным положением для искаженной геометрии поверхности. Можно использовать текстурные координаты
, полученные из вектора
, для смещения текстурных координат текущего фрагмента. Очевидно, что точность метода растет с количеством слоев.
Изменения в реализации затронут только функцию ParallaxMapping, поскольку в ней уже собраны все необходимые для работы алгоритма переменные:
Сперва осуществим инициализацию: установим количество слоев, рассчитаем глубину каждого из них и, в итоге, найдем размер смещения текстурных координат вдоль направления вектора , на которое необходимо будет смещаться на каждом слое.
Далее идет проход по слоям, начиная с верхнего, до тех пор, пока не будет найдена выборка из карты глубин, лежащая «выше» значения глубины текущего слоя:
В данном коде мы осуществляем проход по всем слоям глубины и смещаем исходные текстурные координаты, до тех пор, пока выборка из карты глубин не станет меньше глубины текущего слоя. Смещение осуществляется вычитанием из исходных текстурных координат дельты, основанной на векторе . Результатом работы алгоритма становится смещенный вектор текстурных координат, определенный с гораздо большей точностью, нежели классический Parallax Mapping.
Используя порядка 10 сэмплов пример с кирпичной кладкой становится гораздо более реалистично выглядящим, даже при взгляде под углом. Но лучше всего достоинства Steep PM видны на поверхностях с картой глубин, имеющей резкие перепады значений. Например, как на этой, уже демонстрировавшейся ранее, деревянной игрушке:
Можно улучшить алгоритм еще немного, если немного проанализировать особенности техники Parallax Mapping. Если смотреть на поверхность примерно по нормали, то необходимость сильно смещать текстурные координаты нет, в то время как при взгляде под углом смещение стремится к максимуму (мысленно представьте направление взгляда в обоих случаях). Если параметризировать число выборок в зависимости от направления взгляда, то можно неплохо сэкономить там, где лишние выборки не нужны:
Результат скалярного произведения вектора viewDir и положительной полуоси Z используется для определения числа слоев в интервале [minSamples, maxSamples], т.е. направление взгляда определяет необходимое число итераций эффекта (в касательном пространстве положительная полуось Z направлена по нормали к поверхности). Если мы бы мы взглянули параллельно поверхности, то эффект бы использовал все 32 слоя.
Модифицированный исходный код находится здесь. Также предлагаю к скачиванию текстуры деревянной игрушки: диффузная, карта нормалей, карта глубин.
Не лишен подход и недостатков. Поскольку число сэмплов все равно конечно, то неизбежно появление эффектов алиасинга, что делает переходы между слоями бросающимися в глаза:
Можно снизить выраженность артефакта путем наращивания количества используемых сэмплов, но это довольно быстро сожрет всю доступную производительность видеопроцессора. Существует несколько дополнений к методу, которые возвращают как результат не первую же точку, оказавшуюся под мнимым рельефом поверхности, а интерполированное значение двух ближайших слоев, что позволяет еще немного уточнить положение точки .
Из этих методов чаще всего используются два: Relief Parallax Mapping и Parallax Occlusion Mapping, причем Relief PM дает наиболее достоверные результаты, но и является немного более требовательным к производительности, по сравнению с Parallax Occlusion Mapping. Поскольку Parallax Occlusion Mapping все же довольно близок по качеству к Relief PM и при этом работает быстрее, то его предпочитают использовать чаще всего. Далее будет рассмотрена реализация именно Parallax Occlusion Mapping.
Parallax Occlusion Mapping
Метод Parallax Occlusion Mapping работает все на тех же базовых принципах, что и Steep PM, но вместо использования текстурных координат первого же слоя, где было обнаружено пересечение с мнимым рельефом, метод использует линейную интерполяцию между двумя слоями: слоем после и до пересечения. Весовой коэффициент для линейной интерполяции основывается на величине отношения текущей глубины рельефа к глубинам обоих рассматриваемых слоев. Посмотрите на схему, чтобы понять получше, как все работает:
Как видно, все очень схоже с Steep PM, добавляется лишь один дополнительный шаг интерполяции текстурных координат двух слоев глубины, соседствующих с точкой пересечения. Конечно, и такой метод является всего лишь приближением, но куда более точным, нежели Steep PM.
Код, отвечающий за дополнительные действия Parallax Occlusion Mapping является дополнением к коду Steep PM и не слишком сложен:
В момент нахождения слоя, лежащего после точки пересечения с мнимым рельефом, мы также определяем текстурные координаты слоя, лежащего до точки пересечения. Далее находим смещения глубины мнимого рельефа относительно глубин двух рассматриваемых слоев и используем их отношение как весовой коэффициент дальнейшей линейной интерполяции текстурных координат, соответствующих двум рассмотренным слоям. Результат интерполяции возвращается функцией для дальнейшего использования.
Parallax Occlusion Mapping дает на удивление визуально достоверные результаты, пусть и с небольшими огрехами и артефактами алиасинга. Но для компромиссного по скорости и качеству варианта они незначительны и проявляются лишь при пристальном наблюдении поверхности вблизи от камеры или при очень острых углах взгляда.
Код примера находится здесь.
Parallax Mapping воистину великолепная техника, позволяющая резко повысить визуальную детализацию вашей сцены, но, безусловно, имеет свои недостатки в виде артефактов, о чем стоит помнить при реализации техники в проекте. По большей части Parallax Mapping используется на плоских поверхностях типа стен или полов – там, где не так то просто определить очертания объекта целиком, а угол взгляда на поверхность часто близок к перпендикуляру. В таком случае огрехи Parallax Mapping практически незаметны, на фоне возросшей детальности поверхности.
Бонусы от переводчика:
Relief Parallax Mapping
Раз уж автор упомянул два метода уточнения результата Steep PM, то для полноты картины опишу и второй из подходов.
Как и Parallax Occlusion Mapping здесь используется результат выполнения Steep PM, т.е. нам известны глубины двух слоев между которыми лежит реальная точка пересечения вектора с рельефом, а также соответствующие им текстурные координаты
и
. Уточнение оценки точки пересечения в данном методе идет за счет применения бинарного поиска.
Шаги алгоритма уточнения:
На изображении видно, что после нахождения точек и
мы уполовиниваем размер слоя и размер смещения текстурных координат, что дает нам первую точку итерации бинарного поиска (1). Так как величина выборки в ней оказалась больше, чем текущая глубины слоя, то мы еще раз уполовиниваем параметры и смещаемся вдоль
, получая точку (2) с текстурными координатами
, что и будет результатом Steep PM для двух итераций бинарного поиска.
Самозатенение
Также небольшое дополнение о добавлении в алгоритм вычисления затенения от выбранного источника света. Решил добавить, поскольку технически метод расчета идентичен рассмотренным выше, а эффект все же интересный и детальности добавляет.
По сути применяется тот же Steep PM, но с поиск идет не вглубь имитируемой поверхности вдоль линии взгляда, а из поверхности, вдоль вектора на источник света . Этот вектор также переносится в касательное пространство и используется для определения величины смещения текстурных координат. На выходе метода получится вещественный коэффициент освещенности в интервале [0, 1], который используется для модуляции диффузной и зеркальной компонент в расчетах освещения.
Для определения затенения с резкими краями достаточно пройтись вдоль вектора до тех пор, пока не найдется точка, лежащая под поверхностью. Как только такая точка найдена – принимаем коэффициент освещенности 0. Если же мы достигли нулевой глубины, не встретив точки, лежащей под поверхностью, то коэффициент освещенности берем равным 1.
Для определения затенения с мягкими краями необходимо проверить несколько точек, лежащих на векторе и находящиеся под поверхностью. Коэффициент затенения при этом берется равным разности глубины текущего слоя и глубины из карты глубин. Также учитывается удаление очередной точки от рассматриваемого фрагмента в виде весового коэффициента равного (1.0 – stepIndex/numberOfSteps). На каждом шаге определяется частичный коэффициент освещенности как:
Конечным же результатом является максимальный коэффициент освещенности из всех частичных:
Схема работы метода:
Ход работы метода для трех итераций в данном примере:
Полученный коэффициент используется для модуляции результата работы используемой в примерах модели освещения Блинна-Фонга: