<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=217.15.199.231&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=217.15.199.231&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/217.15.199.231"/>
		<updated>2026-04-29T13:41:21Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D1%88%D0%B5%D0%B9%D0%B4%D0%B5%D1%80%D1%8B</id>
		<title>Скриптовые шейдеры</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D1%88%D0%B5%D0%B9%D0%B4%D0%B5%D1%80%D1%8B"/>
				<updated>2014-10-10T10:17:51Z</updated>
		
		<summary type="html">&lt;p&gt;217.15.199.231: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Редактируя любую модель, многие в свойствах поверхностей замечали графу shader, в которой указывается нечто вроде models/model или подобные.&lt;br /&gt;
Как правило, эти шейдеры упакованы в '''shaders.xr''' и '''shaders_xrlc.x'''r, которые представляют собой своеобразную базу данных шейдеров, собранных по определенным шаблонам.&lt;br /&gt;
&lt;br /&gt;
Но кроме этих баз данных есть еще и скриптовые шейдеры, которые имеют приоритет перед теми шейдерами, что упакованы в *.xr. Это файлы, имеющие расширение .s и лежащие в папках соответствующих рендеров. Вычислить правильное название шейдера в БД и шейдерного скрипта '''.s''' можно очень просто - для примера, если у нас в БД шейдер находится в '''model/selflight''', то имя шейдера должно быть '''model_selflight.s''', если details/blend, то скрипт шейдера будет, соответственно, '''details_blend.s'''. Не так уж сложно.&lt;br /&gt;
&lt;br /&gt;
Вообще база данных с шейдерами была выдумана не потому что авторам сталкера очень нравилось плодить экземпляры труднораспарсиваемых форматов, а причина более банальна - чтобы увеличить скорость загрузки игры, сэкономив за счет активности жесткого диска при открытии файлов скриптовых шейдеров в папке соответствующего рендера. Плюс к тому в этом случае уменьшается количество шейдерных файлов, что как минимум вдвое уменьшает вероятность ошибки - при условии двух рендеров эта экономия получается за счет тех шейдеров, которые являются общими для обоих рендеров. Плюс к тому вероятность ошибки еще более уменьшается тем, что базы данных редактируются в сдк, а сдк эти базы данных представляет в виде всевозможных галочек и полей ввода, поэтому ошибка может быть только во вводимых данных, но не в скриптовом коде шейдеров, который, вероятнее всего, генерируется во время загрузки игры.&lt;br /&gt;
&lt;br /&gt;
Скриптовые шейдеры используются же в основном только в тех случаях, когда их код отличается для разных рендеров.&lt;br /&gt;
&lt;br /&gt;
По некоторым причинам я считаю что для модостроителей шейдерные скрипты являются более предпочтительными, чем распространение своих шейдерных модов в виде модифицированной .xr-БД. Причины в основном две: Во-первых скриптовые шейдеры предоставляют бОльшие возможности для полета фантазии, а во-вторых распространение шейдерных модов в виде скриптовых шейдеров все же делает меньше вероятность конфликта модов, так как разные шейдеры будут в разных файлах, а не все вместе в одном хитром и трудноредактируемом, и, что самое плохое, - труднообъединяемом файле. Поэтому далее мы рассмотрим скриптовые шейдеры.&lt;br /&gt;
&lt;br /&gt;
Что собой представляют шейдерные скрипты? Это обычные скрипты на lua, которые являются своеобразным языком для того чтобы объяснить движку, какие загружать текстуры и какие подключать шейдеры из наличествующих .ps и .vs файлов. &lt;br /&gt;
&lt;br /&gt;
: ''Для тех кто воспрял духом сразу скажу, что несмотря на то, что шейдерные скрипты написаны на языке, который используется в игровых скриптах, это все-таки не одно и то же. Во-первых шейдерные скрипты выполняются при загрузке уровня всего один раз (в фазу загрузки &amp;quot;загрузка шейдеров&amp;quot;), поэтому на отрисовку в реальном времени влиять неспособны, и кроме того, к игровым скриптам скриптовые шейдеры доступа не имеют.''&lt;br /&gt;
&lt;br /&gt;
Вот, для примера, содержимое простейшего скриптового шейдера:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;lua&amp;gt;function normal( shader, t_base, t_second, t_detail )&lt;br /&gt;
     shader:begin( &amp;quot;effects_gradient&amp;quot;, &amp;quot;effects_gradient_p&amp;quot; )&lt;br /&gt;
 end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберем его по косточкам:&lt;br /&gt;
&lt;br /&gt;
* '''function normal''' - объявление стандартной функции шейдерного скрипта. В некоторых шейдерах есть еще функции '''l_spot''', '''l_point''', '''l_special''' и '''normal_hq''' аналогичного содержания, но явно просчитывающие поведение этого шейдера в условиях освещения&lt;br /&gt;
&lt;br /&gt;
* '''shader''' - вероятнее всего идентификатор шейдера в игре, содержимое этой переменной обычно представляет собой текстовую строку вроде &amp;quot;models_selflight&amp;quot; или &amp;quot;models/selflight&amp;quot;.&lt;br /&gt;
* '''t_base''' - путь к текстуре, которую следует выводить с помощью этого шейдера&lt;br /&gt;
* '''t_second''', '''t_detail''' - пути к другим текстурам, пока назначение их неизвестно.&lt;br /&gt;
&lt;br /&gt;
* '''shader:begin( &amp;quot;effects_gradient&amp;quot;, &amp;quot;effects_gradient_p&amp;quot; )''' - святая святых шейдера. Если точнее - создание объекта шейдера как такового. &lt;br /&gt;
:: '''effects_gradient''' - имя .vs файла используемого в этом шейдере&lt;br /&gt;
:: '''effects_gradient_p''' - имя .ps файла соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После этой строки могут быть такие строки (они необязательны)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': blend		( true, blend.srcalpha, blend.one )''' - настройка блендинга для текстур с альфой, например, полупрозрачные текстуры без применения этой строки будут выглядеть непрозрачными черными в прозрачных местах. Эти методы блендинга соответствуют переключателю в сдк, где варианты ALPHA-ADD, BLEND, SET и так далее. На примере выше блендинг соответствует положению ALPHA-ADD.&lt;br /&gt;
&lt;br /&gt;
:: '''true''' - может быть '''false''' - включение обработки текстур, то есть true - обработка включена, false, соответственно, выключена.&lt;br /&gt;
&lt;br /&gt;
:: '''blend.srcalpha''', '''blend.one''' - соответственно, методы блендинга, могут быть:&lt;br /&gt;
&lt;br /&gt;
 blend.one&lt;br /&gt;
 blend.zero&lt;br /&gt;
 null&lt;br /&gt;
&lt;br /&gt;
Также вот таблица, по которой можно выбрать остальные параметры блендинга, выбирая в таблице по порядку слева направо:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;border: 1px solid #666;&amp;quot; width=&amp;quot;470px&amp;quot; height=&amp;quot;60px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td bgcolor=&amp;quot;#666&amp;quot; width=&amp;quot;2px&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;src&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td bgcolor=&amp;quot;#666&amp;quot; width=&amp;quot;2px&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;color&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td height=&amp;quot;2px&amp;quot; bgcolor=&amp;quot;#666&amp;quot; colspan=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;inv&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td bgcolor=&amp;quot;#666&amp;quot; width=&amp;quot;2px&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;dest&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td bgcolor=&amp;quot;#666&amp;quot; width=&amp;quot;2px&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;alpha&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
то есть:&lt;br /&gt;
&lt;br /&gt;
 blend.srccolor&lt;br /&gt;
 blend.invsrccolor&lt;br /&gt;
 blend.destcolor&lt;br /&gt;
 blend.invdestcolor&lt;br /&gt;
 blend.srcalpha&lt;br /&gt;
 blend.invsrcalpha&lt;br /&gt;
 blend.destalpha&lt;br /&gt;
 blend.invdestalpha&lt;br /&gt;
&lt;br /&gt;
: где '''inv''' - инверсия, '''color''' - цвет, '''alpha''' - альфа (коэффициент прозрачности), '''src''' - параметр берется до шейдера, '''dest''' - параметр берется после шейдера.&lt;br /&gt;
&lt;br /&gt;
* ''': sorting ( 3, false )''' - порядок отрисовки поверхности по отношению к самому объекту, частью которого является поверхность.&lt;br /&gt;
&lt;br /&gt;
:: '''3''' - цифра порядка отрисовки, где 1 - за объектом, 2 - на уровне с объектом, 3 - спереди объекта (ближе к актору). Как правило, при тройке шейдируемая поверхность будет отрисовываться поверх всего, в том числе и оружия.&lt;br /&gt;
&lt;br /&gt;
:: '''false''' - соответствует галочке &amp;quot;srict sorting&amp;quot; в сдк. Пока назначение неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': aref ( false, 2 )''' - функция переключает режим тестирования пикселей по альфе. Первый аргумент - вкл/выкл, второй аргумент - значение альфы, используемое в сравнении альфы пикселей. Если пиксель проверку не прошел, он не будет отрисовываться. Как именно происходит проверка альфы, пока непонятно, функция проверки устанавливается где-то в движке.&lt;br /&gt;
&lt;br /&gt;
* ''': zb ( false, false )''' - устанавливает функцию сравнения пикселей при z-тесте и включает режим записи в z-буфер для текстуры. Первый аргумент - функция сравнения (false - D3DCMP_LESSEQUAL - пиксель проходит тест только, если его z меньше или равно текущему пикселю, true - D3DCMP_ALWAYS - пиксель всегда проходит тест). Второй аргумент - включение записи в z-буфер, тут вкл/выкл.&lt;br /&gt;
&lt;br /&gt;
* ''': fog ( false )''' - отключает освещение текстуры и включает для нее FOG DirectX.&lt;br /&gt;
&lt;br /&gt;
* ''': emissive ( true )''' - применяется в источниках освещения.&lt;br /&gt;
&lt;br /&gt;
* ''': distort ( true )''' - представляет из себя механизм искажений, аналогичный эффекту искажающегося воздуха в некоторых аномалиях, а также &amp;quot;линза&amp;quot; в главном меню над кнопками.&lt;br /&gt;
&lt;br /&gt;
* ''': wmark (true)''' - используется в валлмарках&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''shader : sampler( &amp;quot;s_base&amp;quot; )''' - создание буфера для помещения туда текстуры. Аргумент представляет собой идентификатор, получаемый ps и vs шейдерами, где будет фигурировать как predefined-переменная s_base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Перечисленные ниже параметры могут быть только ниже сэмплерной строки!''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': texture  ( t_base ) ''' - помещение в вышеобъявленный буфер текстуры. Аргумент этой ф-ции представляет собой путь к текстуре, так что вполне можно указать нечто вроде&lt;br /&gt;
&lt;br /&gt;
 : texture  ( &amp;quot;fx\\fx_sun&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
чтобы в буфер воткнуть текстуру '''gamedata/textures/fx/fx_sun.dds'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Следующие функции устанавливают один из режимов адресации текстуры. Режим адресации определяет способ обработки текстурных координат при выходе их за пределы диапазона [0.0,1.0]&lt;br /&gt;
* ''': clamp()''' - режим адресации D3DTADDRESS_CLAMP. Значения текстурных координат, выходящие за рамки [0.0,1.0] обрезаются до 0.0 и 1.0 соответственно. Соответствует галке Texture Clamp в сдк. &lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()''' - режим адресации D3DTADDRESS_WRAP. При выходе значений текстурных координат за пределы [0.0,1.0] от значений отнимается их целая часть. Другими словами, если у вас u,v получились [1.3, 2.5], в этом режиме семплирование текстуры будет происходит по координатам [0.3, 0.5].&lt;br /&gt;
&lt;br /&gt;
* ''': mirror ()''' - режим адресации D3DTADDRESS_MIRROR. При выходе значений текстурных координат за пределы [0.0,1.0] от значений отнимается их целая часть и остаток вычитается из 1.0. Если u,v получились [1.3, 2.6], в этом режиме семплирование текстуры будет происходит по координатам [0.7, 0.4].&lt;br /&gt;
&lt;br /&gt;
Функции установки фильтрации текстур:&lt;br /&gt;
&lt;br /&gt;
* ''': f_none ()''' - точечная фильтрация (то есть по сути, нет фильтрации)&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()''' - линейная фильтрация&lt;br /&gt;
&lt;br /&gt;
* ''': f_bilinear ()''' - билинейная фильтрация&lt;br /&gt;
&lt;br /&gt;
* ''': f_trilinear ()''' - трилинейная фильтрация. На редкость бесполезная функция, потому что семплер по умолчанию создается с трилинейной фильтрацией&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()''' - анизотропная фильтрация.&lt;br /&gt;
&lt;br /&gt;
Помимо этих функций также присутствуют функции для &amp;quot;тонкой&amp;quot; настройки фильтрации:&lt;br /&gt;
Настройка magnification filter&lt;br /&gt;
&lt;br /&gt;
* ''': fmag_none ()''' - без фильтрации&lt;br /&gt;
&lt;br /&gt;
* ''': fmag_point ()''' - точечная фильтрация&lt;br /&gt;
&lt;br /&gt;
* ''': fmag_linear ()''' - линейная фильтрация&lt;br /&gt;
&lt;br /&gt;
Настройка minification filter&lt;br /&gt;
&lt;br /&gt;
* ''': fmin_none ()''' - без фильтрации&lt;br /&gt;
&lt;br /&gt;
* ''': fmin_point ()''' - точечная фильтрация&lt;br /&gt;
&lt;br /&gt;
* ''': fmin_linear ()''' - линейная фильтрация&lt;br /&gt;
&lt;br /&gt;
* ''': fmin_aniso ()''' - анизотропная фильтрация.&lt;br /&gt;
&lt;br /&gt;
Настройка mip filter&lt;br /&gt;
&lt;br /&gt;
* ''': fmip_none ()''' - без фильтрации&lt;br /&gt;
&lt;br /&gt;
* ''': fmip_point ()''' - точечная фильтрация&lt;br /&gt;
&lt;br /&gt;
* ''': fmip_linear ()''' - линейная фильтрация&lt;br /&gt;
&lt;br /&gt;
Разные функции:&lt;br /&gt;
&lt;br /&gt;
* ''': project()''' - функция выставляет флаг D3DTTFF_PROJECTED для преобразования текстурных координат перед растеризатором. При выставленном флаге все компоненты текстурных координат делятся на w-компоненту. Актуально только для ffp (R1, ps_1_x).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также в папке с шейдерами лежат еще файлы .s (именно такого имени - точка и эс), которые являются для всех *.s-файлов своеобразными заголовочными файлами, функции из файла .s доступны из файлов *.s . На данный момент там имеются функции printf, и закомментированные во втором рендере ф-ции l_point и l_spot, которые отвечают за создание точечного и неточечного источников света соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Статья создана участником cjayho, отредактировал ошибки Sергей][akaMoonlight'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>217.15.199.231</name></author>	</entry>

	</feed>