<?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=80.93.126.66&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=80.93.126.66&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/80.93.126.66"/>
		<updated>2026-04-29T21:05:43Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B,_%D0%BD%D0%B5_%D0%BF%D1%80%D0%B8%D0%B2%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B5_%D0%BA_%D0%B2%D1%8B%D0%BB%D0%B5%D1%82%D0%B0%D0%BC_%D0%B8_%D0%B1%D0%BE%D1%8E_%D1%81%D0%B5%D0%B9%D0%B2%D0%BE%D0%B2_(%D1%87%D0%B0%D1%81%D1%82%D1%8C_2)</id>
		<title>Как писать скрипты, не приводящие к вылетам и бою сейвов (часть 2)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B,_%D0%BD%D0%B5_%D0%BF%D1%80%D0%B8%D0%B2%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B5_%D0%BA_%D0%B2%D1%8B%D0%BB%D0%B5%D1%82%D0%B0%D0%BC_%D0%B8_%D0%B1%D0%BE%D1%8E_%D1%81%D0%B5%D0%B9%D0%B2%D0%BE%D0%B2_(%D1%87%D0%B0%D1%81%D1%82%D1%8C_2)"/>
				<updated>2011-09-07T10:19:08Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
[[Как писать скрипты, не приводящие к вылетам и бою сейвов|Начало в первой части статьи]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Как безопасно использовать коллбэки и таймерные события =&lt;br /&gt;
&lt;br /&gt;
В скриптовом движке есть удобный способ реакции на события - использование коллбэков - процедурных вызовов, привязанных к определённым событиям в жизни игрового объекта - получению повреждений, спавну, смерти и т.д. и т.п. Это hit_callback, death_callback из xr_motivator и многие другие... Все моддеры очень широко и совершенно спокойно пользуются ими, совершенно забывая при этом о таком важном факте, что это - обработки реального времени, как и таймерные события. Что это значит? А собственно вот что... Возьмём для примера коллбэк смерти неписей, мою головную боль последнего времени:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xr_motivator.script -&lt;br /&gt;
function motivator_binder:death_callback(victim, who)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это функция обрабатывает смерть неписей. Когда вызывается этот коллбек он начинает по очереди вызывать внутренние функции, расположенные в других модулях. Они разрегистрируют умершего непися в гулагах, спавнят в него лут, обновляют статистику, отключают его от доп. схем логики и т.д.&lt;br /&gt;
&lt;br /&gt;
Так вот, обычно, когда в функциях возникает конфликт параметров, бесконечный цикл, попытка индексации nil и т.д., функция вылетает со стандартным логом. '''Но только не в случае, когда она находится внутри коллбэка. Если функция внутри него, то в случае возникновении в ней любой нештатной ситуации, коллбэк наглухо виснет.''' Это происходит из-за того, что функции вызываются строго друг за другом, и каждая из них вызывается только тогда, когда её предшественница вернула управление коллбэку. В случае с death_callback опознать такого непися очень просто - в его трупе окажется фонарик, КПК и возможно ещё немного разных &amp;quot;мусорных&amp;quot; вещей, что говорит о том, что обработка его смерти повисла не дойдя даже до спавна лута. В подобной ситуации можно быть на 100% уверенным, что труп этот не был корректно разрегистрирован, и игра всё ещё считает его живым неписем. Кроме того, зависший коллбэк не освобождает стек (а он у Луа-подсистемы единый на все скрипты), что '''в итоге приводит к вылетам игры с переполнением памяти (вот она, реальная причина этих &amp;quot;родных&amp;quot; вылетов).''' Но было бы слишком хорошо, если бы всё ограничивалось этим... однако тут всё намного хуже... такие &amp;quot;зависшие&amp;quot; коллбэки, особенно если их произошло несколько подряд, очень серьёзно влияют на работу а-лайфа. В лучшем случае они, забивая, стек, мешают нормально работать схемам логики, в худшем вызывают зависания самого  а-лайфа (этот эффект, кстати, производят и сами трупы таких неписей, так как они, как мы помним, не разрегистрировались корректно). '''Основной итог таких событий - бой сейвов, сделанных после возникновения таких ситуаций.''' Если повис один коллбэк, то такие сейвы ещё через раз загружаются, если же несколько, и остановилась работа а-лайфа - всё, сейвы бьются наглухо и реанимации не подлежат.&lt;br /&gt;
&lt;br /&gt;
Поэтому, чтобы избежать такого развития событий, каждый раз, когда вы вносите в коллбэк новую функцию - проверьте её самым тщательным образом. Она не должна содержать никаких рекурсивных циклов, в ней обязательно должны быть проверки на валидность обрабатываемых объектов и значений, и обязательно должна быть обработка нештатных ситуаций - т.е. функция должна обязательно, в абсолютно любой ситуации вернуть управление коллбэку, так или иначе. В самом наихудшем случае - делайте как делали разработчики игры - вставляйте принудительный вылет на рабстол функцией abort - она позволяет передавать отладочное сообщение, и это всяко лучше чем незаметный бой сейвов. Если обработка оборвалась в самом начале, а ф-ция обязательно должна вернуть значение - заведите ей &amp;quot;безопасное&amp;quot; возвращаемое значение по-умолчанию, которое она будет выдавать, если всё пошло плохо. И никогда не пренебрегайте пошаговой отладкой коллбэков с выводом в лог, особенно когда пишете схемы логики - это критически важно для стабильности вашего мода.&lt;br /&gt;
&lt;br /&gt;
== Основные внутриигровые признаки зависания коллбэков типа hit_callback, death_callback ==&lt;br /&gt;
&lt;br /&gt;
1. В трупах попадаются фонарики, КПК, разный мусор и общий лут слишком богат.&lt;br /&gt;
&lt;br /&gt;
2. Частые вылеты во время интенсивных боёв с логами типа&lt;br /&gt;
    Sheduler tried to update object...&lt;br /&gt;
    smart_terrain:1145(1146)&lt;br /&gt;
    LUA: out of memory&lt;br /&gt;
    любой_модуль_логики:любая_cтрока - stack overflow&lt;br /&gt;
&lt;br /&gt;
3. Частые &amp;quot;родные&amp;quot; вылеты в момент смерти непися или попадания по нему&lt;br /&gt;
&lt;br /&gt;
4. Произвольно бьются сейвы во время сражений, выброса и других насыщенных действиями событий&lt;br /&gt;
&lt;br /&gt;
= Использование защищённого кода в LUA =&lt;br /&gt;
&lt;br /&gt;
Периодически случаются такие ситуации, когда мы можем получить вылет при проверке аргумента, и не можем его адекватно заизолировать с помощью предварительной проверки на валидность значения. Вот простой пример: когда я отлаживал '''death_callback''' неписей, я периодически сталкивался с тем, что обращение к методу '''smart_terrain_id()''' при смерти непися иногда вызывало вылет &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;smart_terrain:1143 &amp;quot;attempt to index a nil value&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- хотя это свойство является родным методом объекта, и отсутствовать напрочь никак не может. В итоге я пришёл к выводу, что его просто иногда не успевает отработать движок, так как вылет этот проявлялся в основном в интенсивных боях и совершенно произвольно.&lt;br /&gt;
&lt;br /&gt;
Вот код, в котором происходил вылет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;function on_death( obj_id )&lt;br /&gt;
--	printf( &amp;quot;on_death obj_id=%d&amp;quot;, obj_id )&lt;br /&gt;
&lt;br /&gt;
	local sim = alife()&lt;br /&gt;
&lt;br /&gt;
	if sim then&lt;br /&gt;
		local obj     = sim:object( obj_id )&lt;br /&gt;
		local strn_id = obj:smart_terrain_id()  --- вылет происходит тут&lt;br /&gt;
&lt;br /&gt;
		if strn_id ~= 65535 then&lt;br /&gt;
			sim:object( strn_id ).gulag:clear_dead(obj_id)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это кусок родного кода из версии 1,0005 игры. Я долго пытался разными способами отсечь этот вылет, вводя предварительные проверки, однако это совершенно ничего не давало - вылет всё равно периодически случался, так как проверки эти сами его вызывали. Тогда я зарылся в документацию по Lua и обнаружил замечательную родную базовую функцию, введённую ещё с первых версий Lua, которой почему-то не пользовались ни разработчики игры, ни моддеры (хотя сама она в Lua сталкера присутствует, и работает отлично, без каких-либо нареканий). Вот она:&lt;br /&gt;
&lt;br /&gt;
'''pcall (f, arg1, ···)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Вызывает функцию f с указанными через запятую аргументами в защищённом режиме. Это означает, что любая ошибка, даже критическая, внутри вызванной функции, не передаётся наружу - вызывавшей подсистеме. Вместо этого '''pcall''' перехватывает ошибку и возвращает код статуса. Первая возвращаемая переменная это сам код, (true или false) и если всё прошло хорошо, он равен true. В этом случае '''pcall''' сразу после статуса возвращает все результаты от работы защищённой им функции. Если же в защищённой функции произошла ошибка, то '''pcall''' вернёт false и затем сообщение об ошибке. (Обратите внимание, обработка ошибки присходит БЕЗ вылета! Вместо вылета вы получите вполне адекватную строку с ошибкой, которую можно вывести в лог для последующей обработки)&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я настоятельно советую пользоваться этой функцией в случаях, когда из коллбэков вызываются сложные комплексные обработки, вроде обработки из менеджера вооружений AI-пака. Это позволяет предотвратить как вылеты, так и зависания обработок, и в итоге позволяет хорошо стабилизировать игру.&lt;br /&gt;
&lt;br /&gt;
Возвращаясь к нашим смарттеррейнам... вот как в итоге я подавил вылет типа smart_terrain:1143 с помощью pcall:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;--- эта функция пытается проверить св-во smart_terrain_id объекта. Именно её мы вызовем в защищённом режиме.&lt;br /&gt;
function prot_smt_td(obj)&lt;br /&gt;
	if IsStalker(obj) or IsMonster(obj) then&lt;br /&gt;
		return obj:smart_terrain_id()&lt;br /&gt;
	else	&lt;br /&gt;
		return 65535&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function on_death( obj_id )&lt;br /&gt;
--	printf( &amp;quot;on_death obj_id=%d&amp;quot;, obj_id )&lt;br /&gt;
	local sim = alife()&lt;br /&gt;
	if sim then&lt;br /&gt;
		local obj = sim:object( obj_id )&lt;br /&gt;
		if obj then&lt;br /&gt;
			local strn_id = 65535  --- предварительно проинитим переменную, на &lt;br /&gt;
						--- случай если у нас prot_smt_td выдаст ошибку&lt;br /&gt;
			local result, smt_id = pcall(prot_smt_td,obj)	--- вызываем prot_smt_td в защищённом режиме &lt;br /&gt;
									--- и сразу присваиваем его вывод переменным&lt;br /&gt;
			if result then --- если pcall выдало true&lt;br /&gt;
				strn_id = smt_id  --- тогда применяем полученное значение&lt;br /&gt;
			end&lt;br /&gt;
			--- если же обработка выдаст ошибку, то strn_id останется неизменным...&lt;br /&gt;
			if strn_id ~= 65535 then&lt;br /&gt;
				sim:object(strn_id).gulag:clear_dead(obj_id)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В других местах это делается совершенно аналогично. Подробнее об этой и многих других функция для контроля кода, незаслуженно игнорируемых большинством моддеров, можно почитать тут: http://lua-users.org/wiki/FinalizedExceptions - на английском правда, но захотите - разберётесь, там всё просто. &lt;br /&gt;
&lt;br /&gt;
Настоятельно советую вам изучить работу кода в таких условиях и научиться его правильно применять - этим вы сильно облегчите жизнь как себе, так и тем, кто после вас будет рыться в вашем коде или импортировать его в свои разработки.&lt;br /&gt;
&lt;br /&gt;
= Скрытые критические проблемы в обработке вылетов игрой =&lt;br /&gt;
&lt;br /&gt;
Ведя на днях отладку, выяснил в чём проблема с периодическим боем сейвов и многими другими заморочками как в оригинале игры, так и во многих модах... дело, как выяснилось, далеко не всегда в кривых руках. Есть такая стандартная ф-ция '''abort''' - предназначенная для выкидывания из игры, если что-то пошло не так. И как оказалось, она срабатывает далеко не всегда. Выяснилось это следующим образом:&lt;br /&gt;
&lt;br /&gt;
В одном из логов нашего бета-тестера я увидел '''стандартное сообщение о вылете внутри рабочего лога'''... да-да, то самое которое '''FATAL ERROR''' и дальше по тексту. При этом игра у него НЕ вылетала, это сообщение об ошибке мы обнаружили позже, по случайности. Я заподозрил, что что-то не в порядке, и вставил внутрь этой ф-ции контрольную метку, кидавшую в консоль сообщение, в котором содержался паттерн сообщения об ошибке и само сообщение. Так вот, оказалось, что эта самая функция '''abort''' вызывается в игре с завидным постоянством (вы удивитесь насколько часто), когда возникают исключения в схемах логики, звука и т.д., но игра от этого вылетает на рабочий стол '''максимум только 3 раза из 10 вызовов'''. Вылет НЕ происходит обычно, когда функции передан паттерн ошибки, а остальные параметры пустые, такое бывает, и частенько. И если не сделать внутри этой функции особой метки для вывода в лог, как сделал это я, её вызовы проходят совершенно незаметно, и '''игра после критических ошибок продолжается как ни в чём ни бывало.''' А приводит это вот к чему... Внутри '''xr_logic''' в процедуре записи пстора (хранилища логики и флагов) неписей есть вызовы этого самого аборта в случае если на запись в пстор передана некорректная величина. Ну а так как аборт периодически вообще не срабатывает, то часто попадается ситуация, что неписям в пстор пишется полный ахтунг: куски кода из ОЗУ, всякая муть из лтх-ов, куски аллспавна, всё что угодно. Происходит это оттого, что кодер, писавший эту функцию ('''xr_logic.pstor_store(obj, varname, val)'''), явно и думать не думал что '''abort''' может не сработать. У него запись в пстор стояла после проверки, а не внутри неё (very bad idea), и если abort не срабатывал, игра писала в пстор мусор совершенно спокойно и незаметно для игрока. Потом вся эта хрень попадала прямо в сейвы. Вот проблемный код для наглядности:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;function pstor_store(obj, varname, val)&lt;br /&gt;
	local npc_id = obj:id()&lt;br /&gt;
	if db.storage[npc_id].pstor == nil then&lt;br /&gt;
		db.storage[npc_id].pstor = {}&lt;br /&gt;
	end&lt;br /&gt;
	local tv = type(val)&lt;br /&gt;
	if not pstor_is_registered_type(tv) then&lt;br /&gt;
		abort(&amp;quot;xr_logic: pstor_store: not registered type '%s' encountered&amp;quot;, tv) --- вот тут мы должны если что вылететь&lt;br /&gt;
	end&lt;br /&gt;
	db.storage[npc_id].pstor[varname] = val -- а если не вылетели, всё, получим запись в пстор левой мути&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разумеется игра этим пстором в итоге давится, и сейвы сделанные после такой милой записи практически лопаются. Результат - &amp;quot;битые&amp;quot; (на самом деле подлежат реанимации) сейвы. Происходит это потому, что игра из сейва грузит неписям псторы сплошным чтением по словам, пока они не закончатся. В случае же если в псторе обнаруживается записанный ранее мусор, то обработка либо вылетает сразу, либо наглухо виснет, пытаясь запихать эдак с миллион слов в пстор особо отличившегося непися. Как вам например непись с размером пстора в 1697451 слова? В результате попытки его обработать игра просто на стадии синхронизации выжрала всю доступную ОЗУ и повисла. &lt;br /&gt;
&lt;br /&gt;
Решение этой проблемы оказалось достатоно простым: во-первых я предположил максимальный размер полезной части пстора неписей в 20 слов r_u32() (пока ориентировочно, я ещё уточняю эту величину), и соответственно сделал остановку цикла загрузки пстора для неписей через 20 итераций. Там же, где в цикле стояла проверка на валидность записываемых данных (кстати тоже с вылетом в случае провала проверки), я сделал так, что если параметр не относится к валидному типу данных, то запись параметра в пстор не производится совсем. Это необходимо для того, чтобы если вдруг в сейве обнаружится мусор, то он был бы просто отброшен обработкой. Практика показала, что в итоге такие неписи вполне адекватны и в дальнейшем никаких проблем не вызывают, так как начало их пстора, с нормальными данными, обычно не повреждается - мусор дописывается после них, а не вместо них. &lt;br /&gt;
&lt;br /&gt;
Ну и во-вторых модифицировал запись параметров в пстор, просто убрав запись под основание if-else так, чтобы если параметр неверен, он не записывался совсем. Теперь кстати, очень интересно, сохранились ли те же заморочки с ф-цией '''abort''' в Чистом Небе, и если да, то останутся ли в Зове Припяти?&lt;br /&gt;
&lt;br /&gt;
------------&lt;br /&gt;
&lt;br /&gt;
== Необходимые для стабилизации игры правки в модулях ==&lt;br /&gt;
&lt;br /&gt;
'''Эта правка предотвращает запись в пстор если не сработал аборт:'''&lt;br /&gt;
&lt;br /&gt;
''xr_logic.script''&lt;br /&gt;
&lt;br /&gt;
'''Было:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;function pstor_store(obj, varname, val)&lt;br /&gt;
	local npc_id = obj:id()&lt;br /&gt;
	if db.storage[npc_id].pstor == nil then&lt;br /&gt;
		db.storage[npc_id].pstor = {}&lt;br /&gt;
	end&lt;br /&gt;
	local tv = type(val)&lt;br /&gt;
	if not pstor_is_registered_type(tv) then&lt;br /&gt;
		abort(&amp;quot;xr_logic: pstor_store: not registered type '%s' encountered&amp;quot;, tv)&lt;br /&gt;
	end&lt;br /&gt;
	db.storage[npc_id].pstor[varname] = val&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Стало:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;function pstor_store(obj, varname, val)&lt;br /&gt;
	if not obj then return end&lt;br /&gt;
	local npc_id = obj:id()&lt;br /&gt;
	if db.storage[npc_id].pstor == nil then&lt;br /&gt;
		db.storage[npc_id].pstor = {}&lt;br /&gt;
	end&lt;br /&gt;
	local tv = type(val)&lt;br /&gt;
	if not pstor_is_registered_type(tv) then&lt;br /&gt;
		dgblog(&amp;quot;xr_logic: pstor_store: not registered type encountered - write in pstor_store cancelled&amp;quot;)&lt;br /&gt;
		-- abort убран, так как один хрен не работает. Пусть тогда хотя бы в лог что-то валится.&lt;br /&gt;
	else&lt;br /&gt;
		db.storage[npc_id].pstor[varname] = val&lt;br /&gt;
		-- вот так и только так. Если значение не валидно, ничего не происходит.&lt;br /&gt;
	end	&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''А эта правка выкинет из пстора весь мусор при загрузке сейва, если он как-то в него попал'''&lt;br /&gt;
&lt;br /&gt;
'''Было:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;function pstor_load_all(obj, reader)&lt;br /&gt;
	local npc_id = obj:id()&lt;br /&gt;
	local pstor = db.storage[npc_id].pstor&lt;br /&gt;
	if not pstor then&lt;br /&gt;
		pstor = {}&lt;br /&gt;
		db.storage[npc_id].pstor = pstor&lt;br /&gt;
	end&lt;br /&gt;
	local ctr = reader:r_u32()&lt;br /&gt;
	for i = 1, ctr do&lt;br /&gt;
		local varname = reader:r_stringZ()&lt;br /&gt;
		local tn = reader:r_u8()&lt;br /&gt;
		if tn == pstor_number then&lt;br /&gt;
			pstor[varname] = reader:r_float()&lt;br /&gt;
		elseif tn == pstor_string then&lt;br /&gt;
			pstor[varname] = reader:r_stringZ()&lt;br /&gt;
		elseif tn == pstor_boolean then&lt;br /&gt;
			pstor[varname] = reader:r_bool()&lt;br /&gt;
		else&lt;br /&gt;
			abort(&amp;quot;xr_logic: pstor_load_all: not registered type N %d encountered&amp;quot;, tn)&lt;br /&gt;
		end&lt;br /&gt;
		printf(&amp;quot;_bp: pstor_load_all: loaded [%s]='%s'&amp;quot;, varname, utils.to_str(pstor[varname]))&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Стало:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;function pstor_load_all(obj, reader)&lt;br /&gt;
	local npc_id = obj:id()&lt;br /&gt;
	local pstor = db.storage[npc_id].pstor&lt;br /&gt;
	if not pstor then&lt;br /&gt;
		pstor = {}&lt;br /&gt;
		db.storage[npc_id].pstor = pstor&lt;br /&gt;
	end&lt;br /&gt;
	local ctr = reader:r_u32()&lt;br /&gt;
	if tonumber(ctr) &amp;gt; 20 and tostring(obj:name()) ~= &amp;quot;single_player&amp;quot; and npc_id ~= db.actor:id() then&lt;br /&gt;
		-- максимум 20 итераций - это число ещё уточняется, возможно понадобится больше&lt;br /&gt;
                -- если у вас в пстор что-то свое пишется, ориентируйтесь на свои значения&lt;br /&gt;
		-- и обязательно убираем из проверки актора - у него очень толстый пстор, и к тому же&lt;br /&gt;
                -- если уж поврежденным будет его пстор, то тут точно уже ничего не поможет&lt;br /&gt;
		dgblog(&amp;quot;ОБНАРУЖЕН ОБЪЕКТ С ПОВРЕЖДЕННЫМ PSTOR: &amp;quot;..tostring(obj:name())..&lt;br /&gt;
&amp;quot; БУДЕТ ПРОИЗВЕДЕНА ПОПЫТКА ВОССТАНОВЛЕНИЯ&amp;quot;)&lt;br /&gt;
		ctr = 20 &lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, ctr do&lt;br /&gt;
		local varname = reader:r_stringZ()&lt;br /&gt;
		local tn = reader:r_u8()&lt;br /&gt;
		if tn == pstor_number then&lt;br /&gt;
			pstor[varname] = reader:r_float()&lt;br /&gt;
		elseif tn == pstor_string then&lt;br /&gt;
			pstor[varname] = reader:r_stringZ()&lt;br /&gt;
		elseif tn == pstor_boolean then&lt;br /&gt;
			pstor[varname] = reader:r_bool()&lt;br /&gt;
		else&lt;br /&gt;
			-- не надо пытаться вылетать - просто не пишем поврежденные данные&lt;br /&gt;
			-- при этом обязательно удалять саму переменную - в результате записи&lt;br /&gt;
 			-- мусора в пстор одно только ее название может повесить загрузку&lt;br /&gt;
			pstor[varname] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эти примеры приведены для чистой игры. Единственное в чем не уверен пока, это в том, что максимум полезного размера - 20 слов. Возможно нужно выделить больше, это надо будет проверить ещё экспериментальным путем...&lt;br /&gt;
&lt;br /&gt;
Кроме этого, советую ещё внутрь ф-ции abort вставить отладочные метки, чтобы точно знать когда она вызывалась. Настоятельно советую сделать это даже если вы матёрый моддер со стажем - гарантирую, будете неприятно удивлены.&lt;br /&gt;
&lt;br /&gt;
Я это сделал вот так:&lt;br /&gt;
&lt;br /&gt;
''_g.script''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- Крешнуть игру (после вывода сообщения об ошибке в лог)&lt;br /&gt;
function abort(fmt, msg)&lt;br /&gt;
	local message = tostring(msg)&lt;br /&gt;
	dbglog(&amp;quot;ERROR PATTERN: &amp;quot;..tostring(fmt))&lt;br /&gt;
	dbglog(&amp;quot;ERROR REASON: &amp;quot;..message)&lt;br /&gt;
	local reason = string.format(fmt, message)&lt;br /&gt;
	assert(&amp;quot;ERROR: &amp;quot; .. reason)&lt;br /&gt;
	printf(&amp;quot;ERROR: &amp;quot; .. reason)&lt;br /&gt;
	dbglog(&amp;quot;%s&amp;quot;, reason)&lt;br /&gt;
	printf(&amp;quot;%s&amp;quot;)&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По поводу частичной неработоспособности ф-ции '''abort''' я беседовал с Колмогором, и он пришёл к выводу, что видимо вылет игры должен был бы производиться при обработке функции '''printf(&amp;quot;%s&amp;quot;)''' - ей тут передаётся заведомо отсутствующий оператор и она по уму должна бы сразу крашить игру. Однако в релизе функция printf фактически не работает(она реализована в _g.script через вырезанную функцию log). В результате игра не крашится. Но что поделать, в итоге мне пришлось модифицировать его таким образом, чтобы вылет при его срабатывании был гарантирован:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- Крешнуть игру (после вывода сообщения об ошибке в лог)&lt;br /&gt;
function abort(fmt, msg)&lt;br /&gt;
	local message = tostring(msg)&lt;br /&gt;
	dbglog(&amp;quot;ERROR PATTERN: &amp;quot;..tostring(fmt))&lt;br /&gt;
	dbglog(&amp;quot;ERROR REASON: &amp;quot;..message)&lt;br /&gt;
	local reason = string.format(fmt, message)&lt;br /&gt;
	assert(&amp;quot;ERROR: &amp;quot; .. reason)&lt;br /&gt;
	printf(&amp;quot;ERROR: &amp;quot; .. reason)&lt;br /&gt;
	dbglog(&amp;quot;%s&amp;quot;, reason)&lt;br /&gt;
	printf(&amp;quot;%s&amp;quot;)&lt;br /&gt;
	local crash&lt;br /&gt;
	local ooops = 1/crash&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вылет происходит при попытке произвести арифметическую операцию с неинициализированной переменной crash.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Дополнение от cjayho (ecb team):&amp;lt;/b&amp;gt; Вообще крэшить игру ошибкой в скриптовом коде - далеко не самое очевидное решение. В windows-подобных системах статус, возвращаемый программой после ее выполнения, не имеет ни малейшего смысла, поэтому корректно ли мы выключим игру или некорректно - разницы не будет никакой. Поэтому есть смысл сделать крэш игры более очевидным и стопроцентно работающим способом: использовать консольную команду &amp;lt;b&amp;gt;quit&amp;lt;/b&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- Крешнуть игру (после вывода сообщения об ошибке в лог)&lt;br /&gt;
function abort(fmt, msg)&lt;br /&gt;
	local message = tostring(msg)&lt;br /&gt;
	dbglog(&amp;quot;ERROR PATTERN: &amp;quot;..tostring(fmt))&lt;br /&gt;
	dbglog(&amp;quot;ERROR REASON: &amp;quot;..message)&lt;br /&gt;
	local reason = string.format(fmt, message)&lt;br /&gt;
	assert(&amp;quot;ERROR: &amp;quot; .. reason)&lt;br /&gt;
	printf(&amp;quot;ERROR: &amp;quot; .. reason)&lt;br /&gt;
	dbglog(&amp;quot;%s&amp;quot;, reason)&lt;br /&gt;
	get_console:execute( 'quit' )&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А для тех кто задается вопросом: &amp;lt;i&amp;gt;почему разработчики не сделали так изначально?&amp;lt;/i&amp;gt; отвечу: вероятнее всего ошибка в скрипте была не очень очевидным заклинанием по призыву волшебного зеленого жука, которое после выпуска не-дебаг версии потеряло свой изначальный сакральный смысл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Лечение зависаний алайфа при смерти персонажей ==&lt;br /&gt;
&lt;br /&gt;
Недавно, отлаживая проблемы с зависанием алайфа, мне удалось найти причину этого периодически во всех модах всплывающего сбоя, приводящего к порче сейвов и сильно мешающего нормально играть. Сбой этот возникает при смерти некоторых NPC, обычно квестовых. В частности в моём случае изолировать и отладить это зависание удалось на Юрике, новичке со Свалке, учавствующем в сцене с гоп-стопом. Причина оказалась в обработке посмертной отрегистрации NPC из гулагов, причём сбой там был настоящей матрёшкой, составной из нескольких частей. Правок в итоге было совсем немного, но чтобы сделать их мне пришлось несколько часов распутывать клубок из кросс-вызовов между скриптами smart_terrain и xr_gulag. Итак, начнём с самого начала. Работая над OGSE 069 и 0691 я периодически сталкивался с зависаниями и вылетами в посмертных обработках неписей. Один из таких вылетов - всем хорошо знакомый вылет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;smart_terrain:1143 &amp;quot;attempt to index a nil value&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Происходящий в функции '''smart_terrain.on_death( obj_id )''' - я тогда его заблокировал вызовом его внутри безопасного кода функцией '''pcall''', однако, как теперь выяснилось, этого оказалось недостаточно - баг тут состоит из нескольких частей, и этот вылет указывает только на одну из них. Вот исходный код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;function on_death( obj_id )&lt;br /&gt;
--	printf( &amp;quot;on_death obj_id=%d&amp;quot;, obj_id )&lt;br /&gt;
&lt;br /&gt;
	local sim = alife()&lt;br /&gt;
&lt;br /&gt;
	if sim then&lt;br /&gt;
		local obj     = sim:object( obj_id )&lt;br /&gt;
		local strn_id = obj:smart_terrain_id()  --- первый вылет/зависнаие алайфа происходит тут&lt;br /&gt;
&lt;br /&gt;
		if strn_id ~= 65535 then&lt;br /&gt;
			sim:object( strn_id ).gulag:clear_dead(obj_id) -- а вот в этой обработке происходит зависание алайфа. Она очень комплексная, и её сложно распутывать.&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Во-первых выяснилось, что изредка вызов '''obj:smart_terrain_id()''' вызывает зависание алайфа даже когда он производится изнутри защищённого кода. Тогда я решил избавиться от использования этой функции в данном месте совсем. После нескольких экспериментов выяснилось, что самым простым, быстрым и вылетобезопасным способом будет считать нетпакет существа в таблицу и выудить идентификатор смарттеррейна из неё. Для этого можно написать свою обработку, однако я, как весьма ленивый программист, не склонен изобретать велосипеды, поэтому я воспользовался уже проверенной у нас и активно используемой в OGSE библиотекой функций для работы с нетпакетами '''m_net_utils''' Артоса. Кроме того, я сразу сделал более безопасным вызов обработки на отрегистрацию в гулагах. Вот, собственно, что в итоге получилось:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;function on_death( obj_id )&lt;br /&gt;
--	printf( &amp;quot;on_death obj_id=%d&amp;quot;, obj_id )&lt;br /&gt;
	local sim = alife()&lt;br /&gt;
	if sim then&lt;br /&gt;
		local obj = sim:object( obj_id )&lt;br /&gt;
		if (obj and obj.smart_terrain_id) then&lt;br /&gt;
			local strn_id = 65535  -- значение по умолчанию&lt;br /&gt;
			&lt;br /&gt;
			local t = nil -- сюда запихнём табличку из пакета&lt;br /&gt;
			if IsStalker(obj) then t = m_net_utils.get_stalker_data(obj) elseif IsMonster(obj) then t = m_net_utils.get_monster_data(obj) end &lt;br /&gt;
			-- вызываем парсинг пакета для неписей и монстров отдельно&lt;br /&gt;
			&lt;br /&gt;
			-- print_table_inlog(t)&lt;br /&gt;
			if t.smtrid then&lt;br /&gt;
				strn_id = tonumber(t.smtrid) -- получаем идентификатор смарта, если его нету даже в пакете, хрен с ним, будет 65535&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if strn_id ~= 65535 then -- если сняли идентификатор, попробуем отрегать...&lt;br /&gt;
				local gulag = sim:object(strn_id)&lt;br /&gt;
				if gulag and gulag.gulag then -- ...но сначала выясним если вообще такой гулаг и инициализирован ли он&lt;br /&gt;
					sim:object(strn_id).gulag:clear_dead(obj_id)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом сделаю отсупление и предупрежу об одном очень странном сбое с которым я столкнулся редактируя эту функцию. Так вот, всё нормально работает только тогда когда у ф-ции этой есть строго определённая структура. '''Стоит только добавить пару строк, убрать закомментированную и сдвинуть пару условий, просто в тексте сдвинуть, не меняя внутренней логики, как игра начинает вылетать, причём ещё до загрузки сейва, при кэшировании (!) и с очень странными логами, хотя код написан синтаксически безупречно! Например с таким:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Description: xr_gulag:1035 value not found ObjectJobPathName[obj_id]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Вернёшь строки на место, перестроишь текст - работает снова. Совершенная чертовщина, шаманил я над этой функцией около получаса, перестраивая текст таким образом чтобы игра нормально запускалась.''' Имейте это в виду когда в неё полезете и если что не пугайтесь если игра начнёт так вылетать - в этом случае пошаманьте немного над ней, меняя её форматирование. О причинах такого поведения я не могу даже догадываться - то ли движок её вызывает по смещению внутри файла вручную, то ли это какой-то баг Lua-парсера, но факт фактом.&lt;br /&gt;
&lt;br /&gt;
Итак, теперь проблема с получением идентификатора смарта разрешилась, однако алайф всё равно зависал! Простая трассировка показала, что теперь зависание происходило внутри обработки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;sim:object(strn_id).gulag:clear_dead(obj_id)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И мне пришлость распутывать её по частям, доискиваясь до причины. Обработка честно говоря мерзкая, размазана по smart_terrain и xr_gulag, при этом взаимные вызовы идут не менее десятка раз, в следующем стиле: ф-ция в смарте вызывает ф-цию в гулаге, которая вызывает фцию в смарте, которая обрабатывает параметр фцией в гулаге, который передётся ф-цией в логике, которая получает её из смарта. Нечто подобное. Опуская все нецензурные выражения, употребленные мной при трассировке, я лучше расскажу что собственно вышло в итоге. А в итоге я вышел вот на этот код в xr_gulag, именно в нём при отрегистрации некоторых мёртвых неписей происходит зависание алайфа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- освободить объект от работы и переинициализировать логику.&lt;br /&gt;
-- если сталкер в онлайне и начал работу, то сбросить его схему поведения&lt;br /&gt;
-- как будто он только что загрузился&lt;br /&gt;
function gulag:free_obj_and_reinit( obj_id )&lt;br /&gt;
	self:free_obj(obj_id)&lt;br /&gt;
&lt;br /&gt;
	local t = self.Object[obj_id]&lt;br /&gt;
	if t ~= nil and t ~= true and self.Object_begin_job[obj_id] then&lt;br /&gt;
		xr_logic.initialize_obj( t, nil, false, db.actor, self:get_stype( obj_id ) ) -- вот эта обработка вешает алайф&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я, честно говоря, ни разу не понимаю, на кой чёрт нужно переконфигурировать схемы логики и выбирать из них активную '''трупу, который лежит себе спокойно и никого не трогает.''' Может быть в это есть некий высший смысл, или это было продиктовано неким аккуратизмом, однако одно я могу сказать однозначно - подобная переинициализация у некоторых трупов неписей приводит к глухому зависанию алайфа. При этом если для трупов эту обработку заблокировать, то трупы разрегистрируются вполне нормально и спокойно лежат с нетронутой логикой, не вызывая никаких проблем. Итоговый код после правок выглядит вот так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- освободить объект от работы и переинициализировать логику.&lt;br /&gt;
-- если сталкер в онлайне и начал работу, то сбросить его схему поведения&lt;br /&gt;
-- как будто он только что загрузился&lt;br /&gt;
function gulag:free_obj_and_reinit( obj_id )&lt;br /&gt;
	self:free_obj(obj_id)&lt;br /&gt;
	local t = self.Object[obj_id]&lt;br /&gt;
	if t ~= nil and t ~= true and self.Object_begin_job[obj_id] then&lt;br /&gt;
		if check_game() then -- тут проверяется, запущена ли игра, если ли актор и жив ли он. Если да, делаем по новому.&lt;br /&gt;
			local s_obj = alife():object(obj_id) -- проверим есть ли у цели разрегистрации валидный серверный объект&lt;br /&gt;
			if s_obj and (IsStalker(s_obj) or IsMonster(s_obj)) and s_obj:alive() then -- если есть, он жив и сталкер или монстр&lt;br /&gt;
				xr_logic.initialize_obj( t, nil, false, db.actor, self:get_stype( obj_id ) ) -- только тогда инициализируем логику&lt;br /&gt;
			end&lt;br /&gt;
		else -- а если игра не запущена, то как раньше. Это нужно для того, чтобы обработка запуска игры нормально работала.&lt;br /&gt;
			xr_logic.initialize_obj( t, nil, false, db.actor, self:get_stype( obj_id ) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Проверка, запущена ли игра&lt;br /&gt;
function check_game()&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этих поправок зависания алайфа при смерти неписей удалось побороть окончательно. Решение с отрезанием реинита логики для трупов несколько грубовато, но честно говоря, у меня нет ни малейшего желания трассировать и разбирать на части функцию xr_logic.initialize_obj, выясняя, чем же ей так данный конкретный труп не приглянулся. Если хотите - займитесь, найдёте причину - дополните данную статью. Я же успокоился на том, что заблокировал баг, периодически убивающий людям игру, так как многие пользователи, игнорируя предупреждения, играют на одном-двух сейвах, а то и вовсе на квиксейвах всю игру.&lt;br /&gt;
&lt;br /&gt;
= Другие частые проблемы =&lt;br /&gt;
&lt;br /&gt;
Спустя некоторое время я обнаружил причины ещё нескольких часто встречающихся вылетов, и решил записать их описание сюда - эта информация наверняка ещё много кому пригодится.&lt;br /&gt;
&lt;br /&gt;
== Вылеты при удалении объектов из игры ==&lt;br /&gt;
&lt;br /&gt;
При использовании для удаления объектов родной движковой функции '''alife():release(alife():object(id), true)''' возможен целый ворох разнообразнейших вылетов, обычно - безлоговых, что сильно затрудняет их отладку. Вот из-за чего они возникают:&lt;br /&gt;
&lt;br /&gt;
1) Вылет при удалении непися или монстра, находящегося в онлайне.&lt;br /&gt;
   Решение: с помощью alife():release '''можно удалять только мёртвые объекты'''. Поэтому если вам нужно удалить с её помощью непися или монстра, который жив и находится в онлайне, его нужно убить любым доступным методом, хотя бы нанеся ему hit() с любым запредельным уроном по вкусу.&lt;br /&gt;
&lt;br /&gt;
2) Вылет при удалении оружия или артефакта.&lt;br /&gt;
   Решение: такая проблема часто встречается в случае если объект неудачно расположен или находится в руках у непися. Для того чтобы не произошло вылета, убедитесь что объект доступен как серверный перед удалением. Вот так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;	local obj = alife():object(i)&lt;br /&gt;
	if obj then&lt;br /&gt;
		alife():release(obj, true)&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эту конструкцию вообще желательно использовать всегда, когда вы так удаляете объекты.&lt;br /&gt;
&lt;br /&gt;
3) Вылет при удалении аномалии.&lt;br /&gt;
   Решение: аномалии - очень капризные при подобном с ними обращении объекты. Они влияют на своё окружение, и если рядом с ними находится непись или монстр, то удаление такой аномалии приведёт к вылету игры. Чтобы этого не произошло, аномалию надо сначала выключить функцией '''disable_anomaly''', и удалять затем ТОЛЬКО тогда, когда она не будет занята влиянием на динамический объект. Для этого нужно получить список мобов на локации, и из их нетпакетов считать идентификаторы действующих на них рестрикторов. Если ваша аномалия будет в этом списке - удалять её нельзя. Дождитесь пока она освободится.&lt;br /&gt;
&lt;br /&gt;
== Вылет при открытии закладки &amp;quot;Контакты&amp;quot; в ПДА ==&lt;br /&gt;
&lt;br /&gt;
Простой безлоговый вылет при открытии закладки &amp;quot;Контакты&amp;quot;. Встречался во всех крупных модах, и никто не знал как его излечить. А лечится он банально - '''его причина - дублирование идентификаторов секций в XML-файле, описывающем иконки неписей для закладки &amp;quot;Контакты&amp;quot;'''. Нужно всего лишь проверить этот файл на наличие дублированных идентификаторов и удалить их. Вылет пропадёт и никогда больше не будет встречаться.&lt;br /&gt;
&lt;br /&gt;
== Вылеты при вызове несуществующих функций из XML ==&lt;br /&gt;
&lt;br /&gt;
В ХML-файлах, используемых для описания инфопоршенов, для многих инфопоршенов прописаны действия, которые игра вызывает при взятии этого инфопоршена. Вот так примерно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;barman_document_have&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;action&amp;gt;dialogs.set_actor_prebandit1&amp;lt;/action&amp;gt;&lt;br /&gt;
		&amp;lt;action&amp;gt;bar_spawn.bandits2&amp;lt;/action&amp;gt;&lt;br /&gt;
		&amp;lt;action&amp;gt;bar_spawn.bandits3&amp;lt;/action&amp;gt;&lt;br /&gt;
		&amp;lt;action&amp;gt;bar_spawn.bandit7&amp;lt;/action&amp;gt;&lt;br /&gt;
		&amp;lt;action&amp;gt;bar_spawn.bandit8&amp;lt;/action&amp;gt;&lt;br /&gt;
	&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так вот, если вы допустите опечатку в названии вызываемой функции или же случайно её удалите - игра будет стабильно вылетать без лога при взятии этого инфопоршена.&lt;br /&gt;
&lt;br /&gt;
== Повреждения сейвов на Радаре и других местах в модах, основанных на OGSM ==&lt;br /&gt;
&lt;br /&gt;
В оригинале ОГСМ и основанных на нём модах часто встречались проблемы с сохранениями на Радаре. Эту проблему долго не удавалось победить, пока наконец благодаря помощи Маландринуса не удалось выявить её первопричину. Как выяснилось, она очень проста - гражданские зомби в моде (монстры) имели в конфиге ту же пропись вида (параметр конфига specie), что и монолитовцы и зомбированные (неписи). И там и тут было проставлено &amp;quot;zombie&amp;quot;, и так оно было ещё с оригинала. Как оказалось, так делать категорически нельзя. Дело в том, что у неписей есть такой функционал, как хитовая память - в ней какое-то время хранятся ссылки на атакующие объекты. У монстров тоже есть остатки этого функционала, но он неработоспособен, и использовать его нельзя. В случае же когда монстры и неписи попадают в один вид, в ситуации когда они находятся рядом в бою, хитовая память монстров автоматически получает от неписей того же вида распространяемую внутри вида информацию об атакующих - а хранить её монстрам нельзя. Если после создания такой ситуации сохраниться - сейв будет вызывать вылет при загрузке. То есть проще говоря, если в бою с монолитовцами рядом оказывались гражданские зомби - и игрок сохранял игру - сейв этот не загружался. Чтобы предотвратить эти проблемы, вполне достаточно создать для гражданских зомби свой отдельный вид, добавив его прописи в конфиг game_relations.&lt;br /&gt;
&lt;br /&gt;
== Застывания NPC после боя / лечения ранения в модах, использующих дополнительные схемы поведения ==&lt;br /&gt;
&lt;br /&gt;
Во многих модах, использующих дополнительные схемы поведения часто можно заметить NPC, которые после боя застывают, прицелившись в одну точку. Аналогично часто это встречается с вылеченными от ранения NPC - они встают и замирают намертво, до тех пор пока их не выведет из этого состояния атаковавший враг. Как правило сейв/загрузка этой проблемы не решают. В ходе работы над OGSE 0.6.9.3 мне удалось выяснить причину таких проблем и успешно её устранить. Причина проблемы заключается в том, что NPC управляются не только скриптовыми схемами, но и движком, и для переключения управления между одним и другим используется скрипт ''state_mgr'' - менеджер состояний. Его директивы имеют наивысший приоритет. Аналогичный же приоритет себе как правило назначают доп. схемы поведения, используя пропись эвалуатора в ''xr_motivatior.addCommonPrecondition(action)''. В итоге при выходе из движковой боевки или при переключении на движковый алайф (это происходит после излечения ранения) доп. схемы поведения вступают с менеджером состояний в конфликт, блокируя смену состояния NPC. Для того чтобы этого не происходило, '''необходимо во всех схемах поведения, использующих принудительное назначение состояния через функцию ''state_mgr.set_state'' сделать блокировку перехвата управления менеджером состояний''', добавив соответствующие прописи в биндер. Вот таким образом, как в этом примере - тут я правил биндер схемы лечения/самолечения ''xrs_medic'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function add_to_binder(object, ini, scheme, section, storage)&lt;br /&gt;
	local operators	= {}&lt;br /&gt;
	local properties  = {}&lt;br /&gt;
&lt;br /&gt;
	local manager = object:motivation_action_manager()&lt;br /&gt;
&lt;br /&gt;
	operators[&amp;quot;medic&amp;quot;]			= actid_medic&lt;br /&gt;
	operators[&amp;quot;self_medic&amp;quot;]		= actid_self_medic&lt;br /&gt;
&lt;br /&gt;
	properties[&amp;quot;medic&amp;quot;]			= evid_medic&lt;br /&gt;
	properties[&amp;quot;self_medic&amp;quot;]	= evid_self_medic&lt;br /&gt;
	&lt;br /&gt;
	local state_mgr_to_idle_combat = xr_actions_id.state_mgr + 1 ---&amp;lt; Это переключение на движковую боевку, но оно тут не использовано&lt;br /&gt;
	local state_mgr_to_idle_alife = xr_actions_id.state_mgr + 2 ---&amp;lt; Это переключение на движковый алайф&lt;br /&gt;
	local state_mgr_to_idle_off = xr_actions_id.state_mgr + 3   ---&amp;lt; Это переключение в статичное состояние&lt;br /&gt;
&lt;br /&gt;
	local zombi=object:character_community()==&amp;quot;zombied&amp;quot; or object:character_community()==&amp;quot;trader&amp;quot; or&lt;br /&gt;
		  object:character_community()==&amp;quot;arena_enemy&amp;quot; or object:name()==&amp;quot;mil_stalker0012&amp;quot; or object:name()==&amp;quot;yantar_ecolog_general&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	if zombi then&lt;br /&gt;
		manager:add_evaluator (properties[&amp;quot;medic&amp;quot;], property_evaluator_const(false))&lt;br /&gt;
		manager:add_evaluator (properties[&amp;quot;self_medic&amp;quot;], property_evaluator_const(false))&lt;br /&gt;
	else&lt;br /&gt;
		manager:add_evaluator (properties[&amp;quot;medic&amp;quot;], evaluator_medic(&amp;quot;medic&amp;quot;, storage))&lt;br /&gt;
		manager:add_evaluator (properties[&amp;quot;self_medic&amp;quot;], evaluator_self_medic(&amp;quot;self_medic&amp;quot;, storage))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local action = action_medic (object,&amp;quot;medic&amp;quot;, storage)&lt;br /&gt;
	action:add_precondition(world_property(stalker_ids.property_alive, true))&lt;br /&gt;
	action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base, false))&lt;br /&gt;
	action:add_precondition	(world_property(properties[&amp;quot;medic&amp;quot;], true))&lt;br /&gt;
	action:add_effect (world_property(properties[&amp;quot;medic&amp;quot;], false))&lt;br /&gt;
	manager:add_action (operators[&amp;quot;medic&amp;quot;], action)&lt;br /&gt;
	&lt;br /&gt;
	local action = action_self_medic (object,&amp;quot;self_medic&amp;quot;, storage)&lt;br /&gt;
	action:add_precondition(world_property(stalker_ids.property_alive, true))&lt;br /&gt;
	action:add_precondition(world_property(stalker_ids.property_enemy,false))	&lt;br /&gt;
	action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base, false))&lt;br /&gt;
	action:add_precondition	(world_property(properties[&amp;quot;medic&amp;quot;], false))&lt;br /&gt;
	action:add_precondition	(world_property(properties[&amp;quot;self_medic&amp;quot;], true))&lt;br /&gt;
	action:add_effect (world_property(properties[&amp;quot;self_medic&amp;quot;], false))&lt;br /&gt;
	manager:add_action (operators[&amp;quot;self_medic&amp;quot;], action)&lt;br /&gt;
		&lt;br /&gt;
	action = manager:action (stalker_ids.action_alife_planner)	&lt;br /&gt;
	action:add_precondition	(world_property(properties[&amp;quot;medic&amp;quot;], false))&lt;br /&gt;
	action:add_precondition	(world_property(properties[&amp;quot;self_medic&amp;quot;], false))&lt;br /&gt;
	&lt;br /&gt;
	action = manager:action(state_mgr_to_idle_alife)&lt;br /&gt;
	action:add_precondition	(world_property(properties[&amp;quot;self_medic&amp;quot;], false)) ---&amp;lt; Блокируем попытки переключиться на движковый алайф пока работает самолечение&lt;br /&gt;
&lt;br /&gt;
	action = manager:action(state_mgr_to_idle_off)&lt;br /&gt;
	action:add_precondition	(world_property(properties[&amp;quot;self_medic&amp;quot;], false)) ---&amp;lt; Блокируем попытки переключиться статичное состояние пока работает самолечение&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вставка этих директив в биндеры всех схем, которые меняют состояния принудительно устраняет конфликты, и NPC больше не виснут при смене схем.&lt;br /&gt;
&lt;br /&gt;
== Зависания алайфа из-за ошибок в конфигах торговли ==&lt;br /&gt;
&lt;br /&gt;
Очень частая проблема у начинающих модостроителей. Обнаруживается боем сейвов в радиусе алайфа от торговца с некорректным конфигом. Обычно главная и единственная причина этой проблемы - наличие в секции ''buy_supplies'' секций, у которых не прописан один или оба параметра, или же наличие записей вида &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
novice_outfit				;NO TRADE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запомните - в секции ''buy_supplies'' конфига торговли таких записей быть не должно вообще. Если вы хотите убрать вещь из общего ассортимента - удалите её строку из ''buy_supplies''.&lt;br /&gt;
&lt;br /&gt;
--[[Участник:Kamikazze|KamikaZze (OGSE Team)]] 11:04, 31 марта 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Как писать скрипты, не приводящие к вылетам и бою сейвов|Начало в первой части статьи]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Авторы =&lt;br /&gt;
Статья создана: [[Участник:Kamikazze|Kamikazze]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>80.93.126.66</name></author>	</entry>

	<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-04-17T21:27:37Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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>80.93.126.66</name></author>	</entry>

	<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-04-15T00:46:33Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-15T00:46:16Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-15T00:45:39Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-15T00:40:40Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;
&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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-15T00:39:57Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;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;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;&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;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;
&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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-15T00:39:39Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;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;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;&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;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;
&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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-15T00:39:11Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;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;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;&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;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;
&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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-15T00:38:32Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;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;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;&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;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;
&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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-14T11:22:02Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;
:::: blend.srcalpha&lt;br /&gt;
:::: blend.invsrcalpha&lt;br /&gt;
:::: blend.srccolor&lt;br /&gt;
:::: blend.destcolor&lt;br /&gt;
:::: null&lt;br /&gt;
&lt;br /&gt;
::: Вероятнее всего также существуют директивы&lt;br /&gt;
&lt;br /&gt;
:::: blend.destalpha&lt;br /&gt;
:::: blend.invdestalpha&lt;br /&gt;
:::: blend.invsrccolor&lt;br /&gt;
:::: blend.invdestcolor.&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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-14T11:21:01Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;
:::: blend.srcalpha&lt;br /&gt;
:::: blend.invsrcalpha&lt;br /&gt;
:::: blend.srccolor&lt;br /&gt;
:::: blend.destcolor&lt;br /&gt;
:::: null&lt;br /&gt;
&lt;br /&gt;
::: Вероятнее всего также существуют директивы&lt;br /&gt;
&lt;br /&gt;
:::: blend.destalpha&lt;br /&gt;
:::: blend.invdestalpha&lt;br /&gt;
:::: blend.invsrccolor&lt;br /&gt;
:::: blend.invdestcolor.&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;
----&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;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-14T11:16:36Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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;
:::: blend.srcalpha&lt;br /&gt;
:::: blend.invsrcalpha&lt;br /&gt;
:::: blend.srccolor&lt;br /&gt;
:::: blend.destcolor&lt;br /&gt;
:::: null&lt;br /&gt;
&lt;br /&gt;
::: Вероятнее всего также существуют директивы&lt;br /&gt;
&lt;br /&gt;
:::: blend.destalpha&lt;br /&gt;
:::: blend.invdestalpha&lt;br /&gt;
:::: blend.invsrccolor&lt;br /&gt;
:::: blend.invdestcolor.&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;
----&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;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_none ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-01T00:29:27Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha, blend.srccolor, blend.destcolor и null&lt;br /&gt;
&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;
----&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;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_none ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-01T00:28:31Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha, blend.srccolor и null&lt;br /&gt;
&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;
----&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;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_none ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wmark (true)''' - используется в валлмарках&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>80.93.126.66</name></author>	</entry>

	<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-04-01T00:23:24Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha, blend.srccolor и null&lt;br /&gt;
&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;
----&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;
* ''': 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;
Также в папке с шейдерами лежат еще файлы .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>80.93.126.66</name></author>	</entry>

	<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-03-31T22:18:05Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha, blend.srccolor и null&lt;br /&gt;
&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;
----&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;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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>80.93.126.66</name></author>	</entry>

	<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-01-17T16:19:51Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
----&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;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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>80.93.126.66</name></author>	</entry>

	<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-01-17T16:17:06Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
----&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 отвечает] на этот вопрос не менее туманно чем в примере выше, но так же по псевдокоду становится понятно что шкала приращения значений разворачивается в обратную сторону, и если на входе значение 255, то на выходе 0, если 200 - на выходе 55. и так далее - если на входе 0 то на выходе 255.&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;
&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>80.93.126.66</name></author>	</entry>

	<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-01-17T16:16:10Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
----&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 отвечает] на этот вопрос не менее туманно чем в примере выше, но так же по псевдокоду становится понятно что шкала приращения значений разворачивается в обратную сторону, и если на входе значение 255, то на выходе 0, если 200 - на выходе 55. и так далее - если на входе 0 то на выходе 255.&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;
&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>80.93.126.66</name></author>	</entry>

	<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-01-17T16:13:58Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
----&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/Clamping_%28graphics%29 отвечает] на этот вопрос не менее туманно чем в примере выше, но так же по псевдокоду становится понятно что шкала приращения значений разворачивается в обратную сторону, и если на входе значение 255, то на выходе 0, если 200 - на выходе 55. и так далее - если на входе 0 то на выходе 255.&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;
&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>80.93.126.66</name></author>	</entry>

	<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-01-17T16:13:02Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
----&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/Clamping_%28graphics%29 отвечает] на этот вопрос не менее туманно чем в примере выше, но так же по псевдокоду становится понятно что шкала приращения значений разворачивается в обратную сторону, и если на входе значение 255, то на выходе 0, если 200 - на выходе 55. и так далее - если на входе 0 то на выходе 255.&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;
&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>80.93.126.66</name></author>	</entry>

	<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>2010-12-14T22:25:03Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
----&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;
&lt;br /&gt;
Ниже представлены еще три оператора используемые с сэмплером, назначение которых неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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;/div&gt;</summary>
		<author><name>80.93.126.66</name></author>	</entry>

	<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>2010-12-14T22:15:42Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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_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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
----&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;
&lt;br /&gt;
Ниже представлены еще три оператора используемые с сэмплером, назначение которых неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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;/div&gt;</summary>
		<author><name>80.93.126.66</name></author>	</entry>

	<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>2010-12-14T22:15:04Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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_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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
----&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;
&lt;br /&gt;
Ниже представлены еще три оператора используемые с сэмплером, назначение которых неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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;/div&gt;</summary>
		<author><name>80.93.126.66</name></author>	</entry>

	<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>2010-12-14T22:14:47Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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_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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
----&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;
&lt;br /&gt;
Ниже представлены еще три оператора используемые с сэмплером, назначение которых неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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;/div&gt;</summary>
		<author><name>80.93.126.66</name></author>	</entry>

	<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>2010-12-14T22:10:36Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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_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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
&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;
&lt;br /&gt;
Ниже представлены еще три оператора используемые с сэмплером, назначение которых неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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;/div&gt;</summary>
		<author><name>80.93.126.66</name></author>	</entry>

	<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>2010-12-14T22:09:48Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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_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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''shader : sampler( &amp;quot;s_base&amp;quot; )''' - создание буфера для помещения туда текстуры. Аргумент представляет собой идентификатор, получаемый функцией main в шейдерах, где будет фигурировать как 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;
&lt;br /&gt;
Ниже представлены еще три оператора используемые с сэмплером, назначение которых неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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;/div&gt;</summary>
		<author><name>80.93.126.66</name></author>	</entry>

	<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>2010-12-14T22:06:38Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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_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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''shader : sampler( &amp;quot;s_base&amp;quot; )''' - создание буфера для помещения туда текстуры. Аргумент представляет собой идентификатор, получаемый функцией main в шейдерах, где будет фигурировать как 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;
&lt;br /&gt;
Ниже представлены еще три оператора используемые с сэмплером, назначение которых неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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;/div&gt;</summary>
		<author><name>80.93.126.66</name></author>	</entry>

	<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>2010-12-14T20:42:59Z</updated>
		
		<summary type="html">&lt;p&gt;80.93.126.66: &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_special''' аналогичного содержания, но явно просчитывающая поведение этого шейдера в условиях освещения (пока на данный момент неизвестно какого именно, предположительно - hemi )&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''' - соответственно методы блендинга, могут быть blend.one, blend.zero, blend.srcalpha, blend.invsrcalpha и null&lt;br /&gt;
&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;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''shader : sampler( &amp;quot;s_base&amp;quot; )''' - создание буфера для помещения туда текстуры. Аргумент представляет собой идентификатор, получаемый функцией main в шейдерах, где будет фигурировать как 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;
&lt;br /&gt;
Ниже представлены еще три оператора используемые с сэмплером, назначение которых неизвестно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''': f_linear ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': wrap ()'''&lt;br /&gt;
&lt;br /&gt;
* ''': f_anisotropic ()'''&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;/div&gt;</summary>
		<author><name>80.93.126.66</name></author>	</entry>

	</feed>