• Добро пожаловать на Quest3D - Русскоязычное сообщество.
 

"Крутизна и реализьм" - тема про шейдеры

Автор KBECT0MAH, 25 декабря 2007, 04:18:22

« назад - далее »

BROTHERMECHANIC

искать человека понимающего в програмировании

Я уверен, на форуме есть такие, просто еще видимо не увидели нашу тему. ;)

Mental Mill надо подчинить!

TOXin

Скажите, пожалста, у всех нормально работает ShaderFX 2.09 на 3dsMax 2009 SP1, или тока у меня какие-то глюки с UV координатами?

Den_ya


BROTHERMECHANIC


Den_ya

пока что нет новостей :-\,я решил отдохнуть пока от этого дела,а то я человек такой если начинаю ковырятся то уже не остановиться,а у меня еще дел по горло(много нужно еще смоделировать и самое занудное сделать раскладку UVW),нужно малехо мозги остудить,и тем более "хорошая мысля,приходит опосля"

dfx

>>не хочет этот свет привязываться и все тут

Шейдер не знает источников света как таковые, ему важен вектора их позиций в мире, на основе чего он считает освещение.
Есть два способа транслировать вектора позиции ИС
1. У HLSL группы есть входы для значений, векторов и матриц, в шейдере можно их подключать кодом,
для векторов это:
float3 "Имя_переменной" :CHANNELVECTOR0;
Т.е. если прилинковать вектор позиции ИС к первому входу(для CHANNELVECTOR0) для векторов, а потом использовать при расчётах, то должно работать.

2.Второй способ более простой и шейдер реагирует автоматом на подключенные ИС в сцене.
объявляем:

#define MAX_LIGHTCOUNT 8

float4 lightPos[MAX_LIGHTCOUNT] : LIGHTPOS; // вектора позиций
float4 lightColor[MAX_LIGHTCOUNT] :LIGHTCOLOR; // вектора цвета.

Далее в коде вертексного шейдера...

float3 Позиция_Первого_ИС = float3(lightPos[0].x,lightPos[0].y,lightPos[0].z);
float3 Позиция_Второго_ИС = float3(lightPos[1].x,lightPos[1].y,lightPos[1].z);
float3 Позиция_Третьего_ИС = float3(lightPos[2].x,lightPos[2].y,lightPos[2].z);
и т.д. до [7] (ограничение - 8 штук).

так же с цветом:
float3 Цвет_Первого_ИС = float3(lightColor[0].x,lightPos[0].y,lightPos[0].z);
float3 Цвет_Второго_ИС = float3(lightColor[1].x,lightPos[1].y,lightPos[1].z);
float3 Цвет_Третьего_ИС = float3(lightColor[2].x,lightPos[2].y,lightPos[2].z);
соответственно...

Если ИС в сцене, например один, а шейдер работает с 4, то вектора позиции и цвета, несуществующих ИС, будут возвращать нули...

Den_ya

#81
не все так просто под луной ;) :D :D :D
Цитироватьfloat3 "Имя_переменной" :CHANNELVECTOR0;
я ставил CHANNELVECTOR0 - свет действительно куда то убегает только не привязывается,
дело в том что код
Цитировать#define MAX_LIGHTCOUNT 8

float4 lightPos[MAX_LIGHTCOUNT] : LIGHTPOS; // вектора позиций
float4 lightColor[MAX_LIGHTCOUNT] :LIGHTCOLOR; // вектора цвета.

Далее в коде вертексного шейдера...

float3 Позиция_Первого_ИС = float3(lightPos[0].x,lightPos[0].y,lightPos[0].z);
float3 Позиция_Второго_ИС = float3(lightPos[1].x,lightPos[1].y,lightPos[1].z);
float3 Позиция_Третьего_ИС = float3(lightPos[2].x,lightPos[2].y,lightPos[2].z);
и т.д. до [7] (ограничение - 8 штук).

так же с цветом:
float3 Цвет_Первого_ИС = float3(lightColor[0].x,lightPos[0].y,lightPos[0].z);
float3 Цвет_Второго_ИС = float3(lightColor[1].x,lightPos[1].y,lightPos[1].z);
float3 Цвет_Третьего_ИС = float3(lightColor[2].x,lightPos[2].y,lightPos[2].z);
соответственно...
совершенно не такой, который делает Mentall Mill
у него например: LIGHTPOS; // вектора позиций - это float3
а :LIGHTCOLOR; // вектора цвета - это уже float4 , и в Mentall Mill-ком коде вообще не воспринимаются квадратные скобки -[0]- - сразу же пишется ошибка
замена string Space = "View" на string Space = "World" тоже результатов не дало
вообщем вот готовая сценка 6.35 Мб,может быть получится разобраться

и еще вопрос:
- нужно ли выставлять точки координат света квеста и света шейдера например свет квеста например  на 0,0,0 и свет шейдера на 0,0,0 или все должно зацепится автоматом?

dfx

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

Цитироватья ставил CHANNELVECTOR0 - свет действительно куда то убегает только не привязывается

Ответ:
ЦитироватьЕсли прилинковать вектор позиции ИС к первому входу(для CHANNELVECTOR0)...
канала HLSL Object...
Смотри, что прилинковано hlsl-каналу. Если первый линк для векторов занят, надо использовать другие CHANNELVECTOR1, CHANNELVECTOR2 и т.д.

Цитироватьсовершенно не такой, который делает Mentall Mill
Какя разница, что делает Mentall Mill? Я, так понимаю, надо, что бы в квесте работало!?!

Цитировать- нужно ли выставлять точки координат света квеста и света шейдера например свет квеста например  на 0,0,0 и свет шейдера на 0,0,0 или все должно зацепится автоматом?

Ответ:
ЦитироватьЕсли ИС в сцене, например один, а шейдер работает с 4, то вектора позиции и цвета, несуществующих ИС, будут возвращать нули...
Т.е. позиция в мире - 0.0.0, и цвет 0.0.0.0(чёрный).
Если ИС существует(Т.е. прилинкованные ИС кканалу Render), то автоматом берется его позиция и цвет.

dfx

To Den_ya.

Посмотрел сцену с чайником... В общем простой шейдер с кубомапным отражением - преломлением + цвет + блик. Поддерживается всего один ИС. Но его текст плохо воспринимаем и его(текст) можно было бы сократить раза в 4, хотя бы для улучшения восприятия. :)

Проблема не в линковании позиции и т.д., а в расчетах внутри шейдера. Копай в нём. Видимо в программе генерации ,что то отличается от квестового - вот и глючит.

Могу привести пример - Шейдер написаный под 3ДМАХ в квесте даже после правки симантик будет глючить, т.к. в максе оси X и Y в отличии от квеста перевёрнуты и что бы всё работало надо учитывать, что в максе
worldNorm.xYZ = worldNorm.xZY...

Удачи.

BROTHERMECHANIC

#84
dfx, СПАСИБО ЗА ПОМОЩЬ!!!
По второму способу никак не получается, выходят ошибки
http://picthost.ru/images/edwz1e2zjgqsl5ui8bnc.jpg
вот архив с искаверканным мною шейдером
http://rapidshare.com/files/167934458/No_lit_SHADER.rar.html

По первому - все путем!!!!!!!!!!!!!!!!!!!!!!!!
http://picthost.ru/images/g0tz41eurlpzps48gb.jpg
(непонял только что подключать на fallof exponent и т.д., но это мелочи)
И еще; непеределывая синематики шейдер реагирует на "виртуальный" источник в ценре мира
http://picthost.ru/images/xzetey6svp97wuwscvu.jpg

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

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

Const_47

В отличии от Квеста, МенталМил игнорирует мировую матрицу
То есть, если Квест преобразовывает вершину в пространство
отсечения mul(vertex,WorldViewProjection) то ментал делает это так mul(vertex,ViewProjection), ну и все последствия из этого выходящие. В ментале камера является центром мира, и когда мы "бегаем" все обекты вертятся около камеры, а сама камера неподвижна:))). Вот поэтому и непонятки ваши со светом,
он ведь передается в шейдер квестом в мировой системе координат.   

&Brothermechanic
Напиши что ты конкретно хочеш от шейдера, техническое задание.
Может в моем архивчике найдеться подходящий;)

Den_ya

Const_47
если чесно то это не ответ
мы с Brothermechanic две страници накатали здесь про пример из Mentall Mill-ла про простенький пример demo_step_1
,разобрались в настройках кроме света,дело не в том что он нужен,а в том как одоптировать шейдеры которые можно слепить в Mentall Mill,да да же не надо ничего придумывать,хотябы сделать та чтобы шейдеры из библиотеки NVIDIA работали в Квесте
так кто нить может сделать чтобы свет в demo_step_1 стал работать или нет,или хотябы сказать что это сделать нельзя чтобы время зря не тратить

BROTHERMECHANIC

#87
Привет всем.
По первому способу DFX-а шейдер из милла РЕАГИРУЕТ на ИС. Но это как-то "неудобно" (подключать к каждому обьекту линки всех значений ИС), даже в стремном SFX есть "автоопределение" ИС :)

Const_47, спасибо за отклик!!!!!
Дело в том что хочется самому лепить шейдеры, это дает большее пространство для творчества, да и часто нужен специфический (Н:миксованный) эффект.
Опыта пока мало и как применить твою подсказку я незнаю, но замечал разницу вматрицах SFX и MM шейдеров но не придавал значения, наверно это как-то связанно.

SFX

float4x4 wvp : WorldViewProjection < string UIWidget = "None"; >; 
float4x4 worldI : WorldInverse < string UIWidget = "None"; >; 

float4x4 worldIT : WorldInverseTranspose < string UIWidget = "None"; >; 

float4x4 viewInv : ViewInverse < string UIWidget = "None"; >; 
float4x4 world : World < string UIWidget = "None"; >;

MM

float4x4 __object_to_ndc : WorldViewProjection<   string UIWidget = "none";>;
float4x4 __world_to_object : WorldInverse<   string UIWidget = "none";>;
float4x4 __object_to_world : World<   string UIWidget = "none";>;
float4x4 __camera_to_world : ViewInverse<   string UIWidget = "none";>;

float4 __scene_ambient : Ambient
<
   string UIName = "Scene Ambient";
   string UIWidget = "color";
> = float4(0.00,0.00,0.00,0.00);


Если как-то добавить в код мила 

float4x4 worldIT : WorldInverseTranspose < string UIWidget = "None"; >;

тогда блик заработает?

И..., если нетрудно, посмотри этот шейдер, что там надо изменить?
http://rapidshare.com/files/167934458/No_lit_SHADER.rar.html

Const_47

Парни, в теме по Адаптации шейдеров
https://guest3d.wohlnet.ru/forum/index.php?topic=426.0
Я выложил пример адаптации шейдеров NVIDIA, и будет это
для вас просто, или нет зависит только от вашего уровня подготовки. На следующий раз, я напишу о адаптации шейдеров MM, пусть на примере demo_step_1. Я не хочу говорить, что это будет завтра, или после завтра. У меня сейчас такая ситуация, что работать приходится по 12 часов в сутки, или около того.
Я надеюсь что материал появится через несколько дней.

&Brothermechanic
Вот я смотрю на ту матрицу которую ты привел от MM
float4x4 __object_to_ndc : WorldViewProjection ;
и думаю что мое утверждение выше ошибочно,наверное спутал с RenderMonky

Я посмотрю на твой шейдер.

Den_ya

Const_47
спасибо большое!буду разбираться