Вы находитесь на странице: 1из 1

Главная 3D 2D Engines Web Stereo Sound

Официальный сайт Написание пользовательских шейдеров для объекта оболочки каркаса


Обзор Объект оболочки каркаса поставляется с полным набором предопределенных шейдеров
для визуализации наиболее обычных типов поверхностей.
Документация
Используя скриптинг, Вы можете писать дополнительные пользовательские шейдеры на
ЧАВО
языке HLSL.
Обзор редактора
Код HLSL для каждого шейдера в Вашем скрипте должен находится внутри раздела,
Начало определенного тэгами "/*HLSLSTART name" и "HLSLEND*/". Вы можете определить до 256
шейдеров в коде Вашего скрипта.
Добавление камеры
Для рабочего примера, пожалуйста, запустите 3D Rad, нажмите Ctrl+O, и откроете проект
Визуальные аспекты ShaderDemo.3dr. Дважды щелкните на элементе Script: shader code в списке объектов для
того, чтобы увидеть код шейдера.
Группировка
Демонстрационный шейдер визуализирует поверхность оболочки каркаса с технологией,
Импорт
подобной шейдеру, установленному по умолчанию, но с дополнительным параметром,
Аддоны который определяет глобальную прозрачность визуализированной оболочки каркаса.

Реклама Код демонстрационного скрипта (смотрите раздел Main()) применяет шейдер к оболочке
каркаса при запуске (вызов функции iShaderSet()) и затем, во время исполнения
Шейдеры программы, просто изменяет параметр прозрачности (альфа), чтобы сделать оболочку
каркаса постепенно исчезающей.
Функции редактора
Примечание: опция Использовать пользовательский шейдер должна быть установлена в
CamChase диалоговом окне свойств оболочки каркаса прежде, чем пользовательский шейдер может
быть применен к оболочке каркаса.
SketchUp

3DS Max Рекомендации

Lightwave При написании Ваших собственных шейдеров для 3D Rad, первое правило заключается в
том, чтобы помнить о том, что ваш код HLSL должен включать технологии визуализации и
Мультиплеер для оболочечных (скелетно анимированных), и для необолочечных (статических)
каркасов.
События
В скрипте примера Вы можете видеть, что есть два отдельных объявления технологии,
Устойчивость называемых technique Skinning и technique NoSkinning. Эти объявления должны
присутствовать в Вашем разделе кода HLSL.
Основы AngelScript

Справка программы Вы можете определить минимальную модель шейдера (аппаратного), необходимую для
обработки Вашего шейдера, используя синтаксис compile vs_X_X для вершинного
шейдера, и синтаксис compile ps_X_X для пиксельного шейдера.

"X_X" - это версия модели шейдера. В примере я использовал "1_1", что значит, что
шейдер потребует по меньшей мере, видеокарты, поддерживающей модель шейдера 1.1.
Это делает мой шейдер работающим практически на любом компьютере потому, что
модель шейдера 1.1 поддерживается практически всеми видеокартами.

Помните о том, что набор функций HLSL, который Вы можете использовать в Вашем коде
шейдера, будет изменяться, когда Вы будете изменять версию модели шейдера. Так,
например, при программировании для шейдера модели "1_1", у Вас есть ограниченный
набор функций HLSL по сравнению с программированием для модели шейдера "2_0" или
"3_0".

Очевидно, что написание шейдера "3_0" приведет к сбою визуализации Вашей оболочки
каркаса на компьютере, который поддерживает, например, только модель шейдера до 2.0.

Однако, так как Вы можете добавить несколько разделов HLSL к Вашему скрипту
(определить несколько шейдеров в одном скрипте), Вы можете написать разный шейдер
для каждой различной модели шейдера (аппаратной), на которую Вы хотите нацелится.

Затем, в Вашем скрипте, Вы можете использовать функции iVertexShaderVersion() и


iPixelShaderVersion() для определения версии модели шейдера, поддерживаемой
компьютером, на котором запущен Ваш проект, и применить правильный шейдер к Вашей
оболочке каркаса с использованием функции iShaderSet(). Пожалуйста, смотрите справку
по API скрипта для подробностей.

Параметры шейдера

Обычно шейдер предполагает, что некоторые параметры, определенные в коде HLSL


(подобные параметру fAlpha в примере), будут установлены скриптом во время
выполнения программы в функцииvoid Main().

Для того, чтобы сделать это, Вы можете использовать функции iShaderFloatSet() и


iShaderTextureSet(). В примере я использовал функцию iShaderFloatSet() для
динамической установки параметра прозрачности (альфа). Пожалуйста, смотрите справку
по API скрипта для подробностей о функциях iShader...().

Обратите внимание на то, что 3D Rad всегда динамически устанавливает некоторые


параметры (подобные матрицам трансформации вершин, текстурам, параметрам,
специфическим для эффектов, и т.д.). Они являются теми, которые требуются
предопределенным шейдерам, Выбранным Вами в диалоговом окне свойств объекта
оболочки каркаса.

Параметры всегда управляются 3D Rad, когда в диалоговом окне оболочки каркаса


выбран установленный по умолчанию шейдер, как показано здесь:

------------------------------------------------------------

float4x3 amPalette[MATRIX_PALETTE_SIZE_DEFAULT];

float4x4 mxWorld : WORLD;


float4x4 mxWorldIT : amPalette;
float4x4 mxViewProj : VIEWPROJECTION;

float4 lightDir : DIRECTION = {0.0f,0.0f,-1.0f,1.0f};


float4 lightColor : DIFFUSE = {1.0f,1.0f,1.0f,1.0f};
float4 lightAmbient : AMBIENT = {0.1f,0.1f,0.1f,1.0f};

float4 materialDiffuse : DIFFUSE = {0.8f,0.8f,0.8f,1.0f};


float4 materialSpecular : SPECULAR = {1.0f,1.0f,1.0f,1.0f};
float materialSpecularPower : SPECULARPOWER = 30.0f;

float3 worldEyePos = {0.0f,0.0f,0.0f);

texture diffuseMap;

int boneCount = 2;

------------------------------------------------------------

Вы можете видеть все из них объявленными и использованными в скрипте примера.


Обратите внимание на то, что определенным пользователем параметром в примере
является только fAlpha. Этот параметр управляется скриптом примера, не 3D Rad, как
сказано.

Примечание: значения, назначенные переменным, являются просто установленным по


умолчанию кодом HLSL, который будет использоваться, если 3D Rad или скрипт дадут
сбой в установке параметра.

Дополнительные параметры, автоматически управляемые 3D Rad, когда Вы выбираете


другой предопределенный шейдер в диалоговом окне оболочки каркаса, перечислены
ниже. Пожалуйста, помните о том, что они могут управляться или не управляться в
зависимости от настроек диалогового окна оболочки каркаса.

------------------------------------------------------------

float ambient = 0.5f;

texture environmentMap;
float environmentMapBlend = 0.25;

texture normalMap;
float bumpScale = 1.0f;

float4 pointLightPos01 = {0.0f,0.0f,-1.0f,1.0f};


float4 pointLightPos02 = {1.0f,0.0f,-1.0f,1.0f};
float4 pointLightPos03 = {-1.0f,0.0f,-1.0f,1.0f};
float4 pointLightPos04 = {-1.0f,0.0f,1.0f,1.0f};
float4 pointLightColor01 = {1.0f,1.0f,1.0f,1.0f};
float4 pointLightColor02 = {1.0f,0.0f,0.0f,1.0f};
float4 pointLightColor03 = {0.0f,1.0f,0.0f,1.0f};
float4 pointLightColor04 = {0.0f,0.0f,1.0f,1.0f};

float3 fogColor = {1.0f,1.0f,1.0f};


float fogStart = 1;
float fogEnd = 25;

------------------------------------------------------------

Эти дополнительные параметры не используются в примере. Я все равно объявил их для


Вашего удобства, просто на случай того, что Вы захотите использовать их.

Использование инструментов для написания шейдеров

Вы можете использовать инструменты, подобные RenderMonkey и FX Composer, но, в


порядке успешного портирования шейдера в 3D Rad, Вам нужно понимать, как шейдер в
этих инструментах использует параметры инструмента, являющиеся автоматически
управляемыми.

Пожалуйста, помните о том, что для программирования пользовательских шейдеров для


3D Rad, требуется некоторое знание программирования HLSL.

Шейдеры постпроцессинга

Набор функция iShader...() также может быть использован для применения созданных
пользователем шейдеров постпроцессинга к любому объекту следящей камеры в Вашем
проекте.

Все, что Вам нужно сделать, как только Вы написали должный шейдер постпроцессинга
внутри тегов "/*HLSLSTART name" и "HLSLEND*/" - это вызвать iShaderSet() и все другие
функции iShader...(), передав дескриптор на объект следящей камеры в качестве первого
параметра, вместо оболочки каркаса.

Для примера использования, пожалуйста, смотрите демонстрационный проект,


называемый PostProcessShader.3dr.

Дополнитепльно, используя функцию iShaderStack(), Вы также можете создать


расширенные эффекты постпроцессинга путем комбинирования (укладывания в стек)
нескольких шейдеров простпроцессинга, которые будут выполняться один за другим.

Для примера использования, пожалуйста, смотрите демонстрационный проект,


называемый PostProcessStacked.3dr.

Олег Широколава, e-mail: shyrokolava@mail.ru