<?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=94.51.157.208&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=94.51.157.208&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/94.51.157.208"/>
		<updated>2026-04-29T19:32:08Z</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>2011-07-12T06:51:16Z</updated>
		
		<summary type="html">&lt;p&gt;94.51.157.208: орфография&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Редактируя любую модель, многие в свойствах поверхностей замечали графу shader, в которой указывается нечто вроде models/model или подобные.&lt;br /&gt;
Как правило, эти шейдеры упакованы в shaders.xr и shaders_xrlc.xr, которые представляют собой своеобразную базу данных шейдеров, собранных по определенным шаблонам.&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;
 function normal( shader, t_base, 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;
 &lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Разберем его по косточкам:&lt;br /&gt;
&lt;br /&gt;
* '''function normal''' - объявление стандартной функции шейдерного скрипта. В некоторых шейдерах есть еще функции '''l_spot''', '''l_point''' и '''l_special''' аналогичного содержания, но явно просчитывающие поведение этого шейдера в условиях освещения&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;
:: '''false''' - включение/выключение данной функции.&lt;br /&gt;
&lt;br /&gt;
:: '''2''' - сам альфа-референс объекта&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': zb ( false, false )''' - манипуляции с z-буфером, где первый аргумент соответствует галке z-test в сдк, второй - галке z-write.&lt;br /&gt;
&lt;br /&gt;
* ''': fog ( false )''' - действие представляет собой превращение текстуры в черно-белую и применение к ней функции calc_fogging в common.h шейдеров соответствующего рендера.&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;
* ''': clamp()''' - соответствует галке Texture Clamp в сдк. Википедия [http://en.wikipedia.org/wiki/Clamping_%28graphics%29 отвечает] на этот вопрос весьма туманно. &lt;br /&gt;
&lt;br /&gt;
* ''': project()''' - используется в шейдере отрисовки неточечного источника света, и предположительно используется для проектирвоания текстуры сэмплера на те объекты которые находятся в пределах сектора сферы.&lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()''' - Википедия [http://en.wikipedia.org/wiki/Wrapping_%28graphics%29 отвечает] на этот вопрос не менее туманно, чем в примере выше.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ниже представлены еще три оператора, используемые с сэмплером, назначение которых неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_none ()'''&lt;br /&gt;
&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'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>94.51.157.208</name></author>	</entry>

	</feed>