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

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

Страницы: 15 6 7 810 Следующая »
#75
19:04, 28 мар. 2005

cppguru
из приведенной формулы я делаю вывод, что вектор источника не учитывается вообще,
в шейдере он стоит здесь - dot(R,L),
так где же истина - в шейдере или в теории?

поясните ламеру, пожалуйста =)


#76
23:15, 28 мар. 2005

Вот это -- specular по Фонгу, истина в последней инстанции:

    R     =reflect(–norm(V), N)
    speс =ks*Is*pow(dot(L, R), n);

Причём здесь V и L можно поменять местами. Разницы нет.

#77
15:03, 29 мар. 2005

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

надеюсь на продолжение =)

#78
15:15, 29 мар. 2005

/\AMEP
ну я в статье поправил ряд опечаток. Пришлите мне письмо с коррективами, я поправлю.

#79
15:30, 30 мар. 2005

обязательно пришлю, как только разберусь в вопросе окончательно =)
пока заметил только приведенную формулу, хорошо бы ее поправить, как написал cppguru,
и вот этот многострадальный кусок -

D3DVERTEXELEMENT9 decl[]=
{
//stream, offset, type, method, semantic type
{0,0, D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0},
{0,12,D3DDECLTYPE_FLOAT<2> ,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,  0},
{0,24,D3DDECLTYPE_FLOAT<3> ,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TEXCOORD,0},
{0,36,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TANGENT, 0},
D3DDECL_END()
};
почему то нормали - float2, а текстурные координаты float3?

а этот кусок (вторая декларация) вообще посылает -

D3DVERTEXELEMENT9 decl2[]=
{
{0,0, D3DDECLTYPE_FLOAT<4>,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0},
{0,<12>,D3DDECLTYPE_FLOAT2,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,   0},
{0,24,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TEXCOORD, 0},
{0,36,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TANGENT,  0},
D3DDECL_END()
};
может вместо 12 - надо 16 (вроде offset считается как n*sizeof(type))?, нормали опять 2, координаты текстуры 3

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

мой код (жирным помечены измененные места) -

D3DVERTEXELEMENT9 decl[]=
{
//stream, offset, type, method, semantic type
{0,0, D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0},
{0,12,D3DDECLTYPE_FLOAT<3>,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,  0},
{0,24,D3DDECLTYPE_FLOAT<2>,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TEXCOORD,0},
{0,<32>,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TANGENT, 0},
D3DDECL_END()
};
...
D3DVERTEXELEMENT9 decl2[]=
{
{0,0, D3DDECLTYPE_FLOAT4,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0},
{0,<16>,D3DDECLTYPE_FLOAT<3>,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,   0},
{0,28,D3DDECLTYPE_FLOAT<2>,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TEXCOORD, 0},
{0,36,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TANGENT,  0},
D3DDECL_END()
};

упс, жирным не выделяется, пометил сомнительные места в коде скобками <>

#80
20:30, 8 апр. 2005

Привет всем.
Разобрался со всеми шейдерами в статье, прикольно.
Попробовал сделать модель Земли, Но возникла маленькая проблемка:
при ambient + diffuse освещении работает всё ок
но когда я добовляю refl - то контур материков стаёт какбы тёмным,
вот кусок шейдера

float3 reflect_vec=reflect(inp.light, norm);
float4 refl = tx_base*max(pow(max(0.1,dot(reflect_vec, inp.view)),8), 0.0f);

tx_base = max( sky, tx_base ) + z * sky;

// Calculate ambient model
float4 ambient = tx_base * 0.1;
// Calculate diffuse model
float4 diffuse = tx_base * 0.5 * max(dot(norm,-inp.light),0.0);
//float4 diffuse = tx_base * 0.5 * max(saturate(dot(norm,-inp.light)),0.0);
//float4 diffuse = tx_base *  0.5 * sqrt(clamp(dot(norm,-inp.light), 0.0f, 1.0f));

return Light * refl + ambient + diffuse;

а вот и результат

Изображение удалено

(это Мексика - для справки)

Не подскажите как с этим бороться

#81
21:31, 8 апр. 2005

OLEG'us
можно rfx или fx? поскольку так тяжело понять, что конкретно затемняет, наверное, там где max и возведение в 8 степень.

#82
19:21, 9 апр. 2005

Иннокентий
>> можно rfx или fx?
Ни то и не другое не использую, пишу всё сам - ручками.

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

Мне каца из-зи ентой ерунды
float3 reflect_vec=reflect(inp.light, norm);
у меня резкий переход высот на границе с морем,
вернее я строил текстуру высот из текстуры где материки белые а моря чёрные.
Я попробовал сделать более плавный переход
9x9  и вродебы тучше стало.
Изображение удалено

#83
6:47, 13 апр. 2005

>Но возникла маленькая проблемка:
>при ambient + diffuse освещении работает всё ок
>но когда я добовляю refl - то контур материков стаёт какбы тёмным
Ну а зачем ты к диффузному рефлекшн добавляешь...

>float3 reflect_vec=reflect(inp.light, norm);
>float4 refl = tx_base*max(pow(max(0.1,dot(reflect_vec, >inp.view)),8), 0.0f);

А почему вектор отражение равен reflect(inp.light, norm) ??
правильно будет reflect(-inp.light,norm) - вот отражение, поэтому может и тупит.
>float4 diffuse = tx_base * 0.5 * max(dot(norm,-inp.light),0.0);
А это что за чудо ??? -inp.light - почему ?, ламберт считается как
n.l епть.

Light * refl + ambient + diffuse; - самагонка...

#84
20:14, 14 апр. 2005

И ТАК, ПОЕХАЛИ ПО ПОРЯДКУ:

>Ну а зачем ты к диффузному рефлекшн добавляешь...
чтоб яркое отражение было от морей и акеанов,
отсель и Light * refl, т.к. Light - это карта где на месте моря 1,
а на мести материка 0.

>А это что за чудо ??? -inp.light - почему ?, ламберт считается как
>n.l епть.
Вот из статьи строки (кое что ненужное убрал)
    float4 reflect_vec = reflect(nrmd_view,nrmd_light);
    float4 n_dot_l    = dot(tx_bump,nrmd_light);
    float4 r_dot_v    = dot(reflect_vec,nrmd_view);

    float4 ambient = tx_base * m_vAmbient;
    float4 diffuse = tx_base * m_vDiffuse * max(N_dot_L,0.0f);

теперь замещаем, тоесть убираем временные переменные

    float4 ambient = tx_base * m_vAmbient;
    float4 diffuse = tx_base * m_vDiffuse * max( dot(tx_bump,nrmd_light) ,0.0f);

а вот и моя строчка
    float4 diffuse = tx_base * 0.5 * max(dot(norm,-inp.light),0.0);
где m_vDiffuse = 0.5, а norm - есть tx_bump
и при чём здесь " n.l епть. "
или в статье неправильно написано

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

Та кчто еть ли у кого-нибудь предложения по решению проблемы???

Прошло более 8 месяцев
#85
1:39, 13 дек. 2005

да кстати, а какие значения принемают
float4 specular_color;
float4 specular_intensity;

в статье про бликовое освещение

#86
2:47, 13 дек. 2005

вот тут кроется ещё одна очепятка серьёзная

D3DXMATRIXA16 mat_temp,mat_view_inverse;
D3DXVECTOR4  view_pos;
mat_temp = mat_world * mat_view;
D3DXMatrixInverse(&mat_view_inverse,NULL,&mat_temp);
D3DXVec4Transform(&view_pos,(D3DXVECTOR4*)&D3DXVECTOR4(0.0f,0.0f,0.0f,1.0f));

#87
22:18, 17 янв. 2006

OLEG'us
Если еще непофиксил, дай шедер поглядим :)

Drebot
Помоему такие:
specular_color = specular_color * saturate(pow(dot(nrm, eye), exponent)) + specular_intensity.

>вот тут кроется ещё одна очепятка серьёзная:

D3DXMATRIXA16 mat_temp;
D3DXMATRIXA16 mat_view_inverse;
D3DXVECTOR4  view_pos;
mat_temp = mat_world * mat_view;
D3DXMatrixInverse(&mat_view_inverse, NULL, &mat_temp);
D3DXVec4Transform(&view_pos, (D3DXVECTOR4*)&D3DXVECTOR4(0.0f,0.0f,0.0f,1.0f), &mat_view_inverse);
Хм, что-то я невижу :)
#88
14:35, 19 фев. 2006

cppguru
Проверил, и убедился, что данный пример в ряде случаев берет лишний arythmetic slot. (хотя и работает).
Постарайтесь использовать Phong Specular так, как он рекомендован в "The Cg Tutorial" Randima Fernando & Mark J. Kilgard
стр 111 и 125

...
float3 V = normalize(eyePosition - P);
float3 H = normalize(L + V);
float specularLight = pow (max ( dot (N,H), 0 ), shininess);

При этом IN.viewDirect и IN.lightDirectionS.xyz должны быть заранее нормализованы, но если они поступили из векторного шейдера, то результаты все равно хороши: возможно что на резких скачках и появятся провалы яркости, я их никогда не видел. Также убрав  max, я все равно получал отличные результаты.
Так что этот "гуру" в кавычках, поспешил употребить заклинание "истина в конечной инстанции": "быстрый фонг" делается без "reflect".

В модели ps_3 вы едва ли увидите разницу, но я работаю строго в ps_2_0, поэтому каждый слот на счету.

#89
17:19, 19 фев. 2006

Очень интересно, только не удобно открывать 100 страниц.
Ват, надо подумать над тем, шоп сделать контрол, позволяющий выбирать сколько постов или страниц загружать.
Я сделаю такое скоро в своём сайте и покажу тебе.

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

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