Войти
ПрограммированиеФорумГрафика

Программирование шейдеров на HLSL. (Комментарии к статье) (8 стр)

Страницы: 15 6 7 8 9 10 Следующая »
#105
20:40, 13 мая 2008

Barbar1an
Для конвейера это просто числа, ему всё равно, нормали там, текстурные координаты или рандом.


#106
21:39, 9 окт. 2008

4 страница внизу. Я так и не смог отладить этот шейдер. Рисуется бредовая сеточка и все(

#107
1:17, 23 окт. 2008

застрял еще на модели бликового освещения. Код, приведеный в статье, не работает в принципе - ошибка cannot map expression to pixel shader instruction set.Че только не пробывал - все зря.
разложил итоговое выражение на составляющие, ошибка возникает при возведении в степень и нормализации координат вида.Третий день сижу(((

#108
15:41, 23 окт. 2008

если кому не трудно, подскажите что не так делаю

#109
7:23, 24 окт. 2008

Ukrainec
>если кому не трудно, подскажите что не так делаю

Ты неправильно описал проблему. Дай хоть кусок кода, к которому приписывается ошибка.


Правка:
Праывки нет. : )

#110
20:59, 26 окт. 2008

PS_OUTPUT MainPS(PS_INPUT input)
{
  PS_OUTPUT output = (PS_OUTPUT)0;
  float power = 16.0f;
  float3 ReflVec = reflect(-normalize(input.view), input.normal);
  float k = dot(ReflVec, input.light);
  output.color = SpecularMtrl*pow(k,power);
  return output;
}
операции reflect, normalize(только в этом контексте), иногда dot не воспринимает.

#111
7:20, 27 окт. 2008

Какая версия шейдера? Давай целиком исходник.

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

#112
16:36, 27 окт. 2008

matrix WorldViewProj;
matrix View;
matrix World;
vector CamPos;
vector CamLook;
vector SpecularMtrl;
vector SpecularIntensity;
vector Light;
struct VS_INPUT
{
  vector pos : POSITION;
  vector normal : NORMAL;
};
struct VS_OUTPUT
{
  vector pos : POSITION;
  float3 light : TEXCOORD0;
  float3 view : TEXCOORD1;
  float3 normal : TEXCOORD2;
};
struct PS_INPUT
{
  float3 light : TEXCOORD0;
  float3 view : TEXCOORD1;
  float3 normal : TEXCOORD2;
};
struct PS_OUTPUT
{
  vector color : COLOR;
};
VS_OUTPUT MainVS(VS_INPUT input)
{
  VS_OUTPUT output = (VS_OUTPUT)0;
  output.pos = mul(input.pos,WorldViewProj);
  output.light = Light;
  output.view = CamLook-CamPos;
  output.normal = normalize(mul(input.normal,World));
  return output;
}

PS_OUTPUT MainPS(PS_INPUT input)
{
  PS_OUTPUT output = (PS_OUTPUT)0;
  float power = 16.0f;
  float3 ReflVec = reflect(-normalize(input.view), input.normal);
  float k = dot(ReflVec, input.light);
  output.color = SpecularMtrl*pow(k,power);
  return output;
}

technique SpecLight
{
  pass P0
  {
    vertexShader = compile vs_1_1 MainVS();
    pixelShader  = compile ps_1_4 MainPS();

  }
}
вот, собственно. Да, мне тоже так кажется, что он хочет более позднюю версию. Если кому нетрудно - откомпилировать этот же эффект по 1.4PS

#113
13:55, 6 ноя. 2008

"откомпилировать этот же эффект по 1.4PS"
некомпилит, с 2.0 норм...

#114
18:21, 6 ноя. 2008

отписался

#115
7:03, 7 ноя. 2008

Отписываюсь. Надоела некрофилия.

Прошло более 7 месяцев
#116
16:01, 24 июня 2009

Дорвался до статьи. Ща буду комментировать. Сразу предупреждаю что в шейдерах я не профи, так что если что не так

отпишу, то обязательно укажите что плз, что и как должно быть.

По ходу изучения тамошнего освещения сразу задумался на пункте
2. Диффузная модель освещения.

зачем передвавать через текстурные координаты:
Out_struct.light    = vec_light;
если можно сразу тупо в пиксельный шейдер констаной. Все равно от вершины результат Out_struct.light не зависит.

далее:
mul(mat_mvp,In_struct.position); и
mul(mat_world,In_struct.normal);
Ребят, у кого так работает я не знаю... вы перед тем как в шейдер запихнуть транспонируете матрицы? Лично у меня ни

рендерманки ни моя прога не захотели цивилизованно работать с этим пока я не поменял местами множетели.


А дальше вообще сумбур... не знаю как у вас, у меня да, итак мы подошли к:
3.Бликовая модель освещения.
Тут ахтунг.

Во-первых не понравилось что отражаем мы не луч света, а вектор взгляда. Как то не интуитивно понятно... Луч света

отразить - логичнее, да и по операциям это тоже самое выходит. Ну да ладно. Это пустяки.

Теперь график, который подписан: Зависимость яркости свечения от угла β:
Ну ведь нихрена неверные подписи по осям. Вы уж простите, что выразился. Каким боком cos(β) зависит от n? Не стал

напрягать извилины чтобы понять что от чего на графике зависит. Может прояснит кто. Добрался до шейдера:

Out_struct.view = vec_eye - vec_view_pos; - опять непонятно зачем все это едет в текстурные координаты, если в такой

ситуации можно просто передать константой в пиксельный шейдер. Более того, такой подход в целом не правильный,

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

и незаметна. Но вот что произойдет если сделать как описано в шейдере:
Изображение
У нас засвечена вся плоскость. Я так и представляю, вы значит подходите к стене, попадает в зону блика, и хлоп. Вся

стена светится... Нельзя использовать такой подход. По этому поводу у меня в шейдере:
OUT.Look = normalize(eye_pos - mul(IN.mPosition, mat_world)); - где OUT.Look и есть этот вектор взгляда. Теперь

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

Ну в общем то вершинный шейдер проскочили. Далее - пиксельный.
Особое внимание на эту строку:
  return specular_color*specular_intensity*pow(dot(reflect_vec, In.light),power);
Так вот. Если вы могли заметить, то на предыдущем скрине есть странный блик в нижнем левом углу. Я чуть перенес

свет. Теперь он светит под другим углом, и вот этот самый блик воочию:
Изображение
Откуда это? Как там может быть блик? На самом деле очень просто. dot(reflect_vec, In.light) с радостью дает на

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

пришлось поставить clamp на скалярное произведение. Теперь мы имеем:
return specular_color*specular_intensity*pow(clamp(dot(reflect_vec, In.light),0,1),power);
Изображение
Cовершенно "здоровый" скриншот.
Все скрины, которые тут представлены сделаны комбинацией бликового + диффузного освещения. Так сказать я несколько

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

конус. Кстати непонятно как был получен скрин того тора с бликовым освещением. Не похоже на шейдер с которым он

предоставлен.

Далее. Про свет. Есть как известно источники света направленные, и точечные. В примерах используются направленные

источники света. Направление света всегда одинаково для любой точки системы. Интенсивность постоянна. Для точечного

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

точечного источника свои собственные. Иногда просто необходимо использовать точечное освещение, а не направленное.

Например внутри команты. И тут уже надо рассчитывать это. Для этого как раз и подойдет возможность передачи через

текстурныне координаты в вершинный шейдер. Пока что я в вершинный шейдер дописал такие вот строчки:
struct TPointLight
{
  float4 Color;    //цвет источника света
  float3 Position; //позиция источника света
  float  EndLight; //дистанция, за которой интенсивность света 0
};
//... код код код
TPointLight light[3];    //источники света
//... код код код


VS_OUTPUT main(const VS_INPUT IN)
{
//... код код код
  float d;
  float k;
  float3 ldir;
  ldir = IN.mPosition-light[0].Position;
  d = length(ldir);
  k = clamp(1-d/light[0].EndLight,0,1); 
  OUT.Light1 = normalize(ldir)*k;
//... код код код
}

тут d - расстояние от вершины до источника света. k - интенсивность освещения (зависит от расстояния). ldir -

направление луча, попадающего в данную вершину. Избавляться от лишних переменных и оптимизировать математику буду

позже. Пока это работает как надо.


Далее прочел:
Модификация бликового освещения по Блинну.
Сделал, аж удивился... с первого раза получил бликовость. Но к сожалению освещение мне непонравилось. Не гибкое по

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

более гибкое классичесткое освещение через отражение.


Ускорение вычисления яркости свечения. - ниасилил вообще, да и не хотелось как то...


Теперь:
Комбинирование компонентов освещения.
Либо я сильно уже отошел от того ужоса бликового, который должен был у меня по статье получится, либо я чего то

недогоняю. Если лично я умножаю диффузную интенсивность на бликовую, то получаю ужос. Собственно понятно почему я

получаю ужос. Потому что диффузную составляющую вижу только в бликовой области. Что помоему неправильно. На мой

взгляд диффузная составляющая должна складываться с бликовой. Вон те скриншоты выше, как раз результат сложения

диффузной с бликовой. А вот результат умножения:
Изображение
Неочень как то. Да?


По поводу:
Реалистичное освещение на основе Кука-Торренса
Почитал, учет шероховатостей и все такое. Полукастрированный шейдер который прилагается в примере вообще не понятно

как работает (рендерманки отказался что либо показывать мне в ответ на предоставленный шейдер. никакие шаманства над

шейдером не помогли). Подозреваю что автор выдрал эти кусочки строк из своего шейдера по бампу, оставив в этих

кусчках мусор и удалив нужные строки. Реализовывать такое реалистичное освещение сам не стал, имхо - достаточно того

что уже получается.

Сейчас докомбинирую ambient и emissive освещение, и собственно перехожу к бампу. Так что ожидайте моих комментов по

поводу бампа, ну и собственно жду попаравок к моим комментам.

#117
16:19, 24 июня 2009

с тем с чем сталкивался сам - согласен
нада как-то поправки вносить

Прошло более 1 года
#118
22:35, 12 окт. 2010

Всё это очень замечательно, доступно, понятно. А как же всё это дело вставлять в программу основную? Было бы просто супер, если бы хоть кто-нибудь и хоть где-нибудь это толком описал.
Во втором примере уже текстурные координаты используются, следовательно, как-то текстуру нужно загружать, откуда, куда, чё делть потом с ней. Переменные какие передавать, как объявлять. Вобщем, про HLSL хорошо написано, а про то как его использовать на деле, ни слова. Где можно посмотреть? Подскажите пожалуйста.

#119
23:32, 27 окт. 2010

если это кто-то читает
напишите(для новичков) что порядок применения мировой видовой и проекционной матриц важен

Страницы: 15 6 7 8 9 10 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.