нет, сатурэйт ничего кроме артефактов не дал, думаю дело в векторах, что-то неправильно считается
TheGrayWolf
> нет, сатурэйт ничего кроме артефактов не дал,
какие артефакты ?
innuendo
> какие артефакты ?
у тебя есть макака? словами сложно описать
доп. сверил всё с боресковым, всё правильно делаю, не пойму где косяк
TheGrayWolf
> доп. сверил всё с боресковым
где у борескова ашикмин ?
TheGrayWolf
> у тебя есть макака?
это ты на кого намекаешь ? :)
innuendo
> где у борескова ашикмин ?
тут, ниже середины
innuendo
> это ты на кого намекаешь ? :)
Да на манки я ссылаюсь
TheGrayWolf
> > где у борескова ашикмин ?
> тут, ниже середины
ужось, не заметил :)
вектор взгляда так считается?
float3 v = normalize( view_pos.xyz - IN.pos_in_vs );
TheGrayWolf
> вектор взгляда так считается?
ну если в одном пространстве - да
Что-то наш тред подзатянулся, давай лучше покурим код :)
... float4 ps_main( vert2frag IN ) : COLOR0 { // Make sure the interpolated inputs and // constant parameters are normalized float3 n = normalize( IN.normal_dir ); float3 l = normalize( -light_dir ); float3 v = normalize( view_pos.xyz - IN.pos_in_vs ); float3 h = normalize( l + v ); // Define the coordinate frame float3 tangent = normalize( IN.tangent_dir ); float3 bitangent = normalize( IN.binorm_dir ); // Generate any useful aliases float VdotN = saturate( dot( v, n )); float LdotN = saturate( dot( l, n )); float HdotN = saturate( dot( h, n )); float HdotL = saturate( dot( h, l )); float HdotT = dot( h, tangent ); float HdotB = dot( h, bitangent ); float3 Rd = cDiffuse.rgb; float3 Rs = 0.3f; float Nu = fAnisotropy.x; float Nv = fAnisotropy.y; // Compute the diffuse term float3 Pd = (28.0f * Rd) / ( 23.0f * 3.14159f ); Pd *= (1.0f - Rs); Pd *= (1.0f - pow(1.0f - (LdotN / 2.0f), 5.0f)); Pd *= (1.0f - pow(1.0f - (VdotN / 2.0f), 5.0f)); // Compute the specular term float ps_num_exp = Nu * HdotT * HdotT + Nv * HdotB * HdotB; ps_num_exp /= (1.0f - HdotN * HdotN); float Ps_num = sqrt( (Nu + 1) * (Nv + 1) ); Ps_num *= pow( HdotN, ps_num_exp ); float Ps_den = 8.0f * 3.14159f * HdotL; Ps_den *= max( LdotN, VdotN ); float3 Ps = Rs * (Ps_num / Ps_den); Ps *= ( Rs + (1.0f - Rs) * pow( 1.0f - HdotL, 5.0f ) ); // Composite the final value: return float4( Pd + Ps, 1.0f ); }
ничего необычного не видишь?
TheGrayWolf
> давай лучше покурим код
прямо сейчас не могу, скрипты правлю
TheGrayWolf
не спасло галактику ?
я тут извратился немного и придумал вот что.
vnN - единичный вектор нормали в точке.
vnL - единичный вектор направления на источник света.
vnV - единичный вектор направления на камеру (наблюдателя).
colorL - цвет источника света. [0..1]
200.0 - яркость источника цвета.
colorS - окружающий цвет.
colorD - цвет объекта.
alfa = acos( max( dot( normalize(vnL+vnV), vnN ), 0.0 ) );
s = exp(-alfa*alfa*11.111 )*0.064;
color = log( ( s*(exp(colorL)-1.0)*200.0+(exp(colorS)-1.0) )*(exp(colorD)-1.0) +1.0 );
susageP, ого, а как хотя бы примерно расшифровывается сия формула?
Синий Дракон
> Синий Дракон
считается что поверхность состоит и микроскопических зеркал.
для каждой точки задано вероятность направления этих микроскопических зеркал.
alfa = acos( max( dot( normalize(vnL+vnV), vnN ), 0.0 ) );
где
normalize(vnL+vnV) нормаль микрозеркала чтобы луч отразился в наблюдателя.
alfa - угол между микрозеркалом и нормалью к поверхности.
s = exp(-alfa*alfa*11.111 )*0.064;
упрощенно сколько зеркал находиться под углом alfa - сколько света отразиться в направление смотрящего.
константы это просто неровность забита...
color = log( ( s*(exp(colorL)-1.0)*200.0+(exp(colorS)-1.0) )*(exp(colorD)-1.0) +1.0 );
тут просто считаю только не линейно, а в exp...
аналог
color = (s*colorL+colorS)*colorD;
susageP
> s = exp(-alfa*alfa*11.111 )*0.064;
распределение
susageP
> сколько света отразиться в направление смотрящего.
обычно fresnel для этих целей прикручивают
ну а чем Ward\CT не устроили ?
Тема в архиве.