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

Specular Map (карта отражения) (комментарии) (9 стр)

Страницы: 18 9 10 11 12 Следующая »
#120
14:51, 17 июня 2011

нет, сатурэйт ничего кроме артефактов не дал, думаю дело в векторах, что-то неправильно считается

#121
15:00, 17 июня 2011

TheGrayWolf
> нет, сатурэйт ничего кроме артефактов не дал,

какие артефакты ?

#122
15:09, 17 июня 2011

innuendo
> какие артефакты ?
у тебя есть макака? словами сложно описать

доп. сверил всё с боресковым, всё правильно делаю, не пойму где косяк

#123
15:13, 17 июня 2011

TheGrayWolf
> доп. сверил всё с боресковым

где у борескова ашикмин ?

TheGrayWolf
> у тебя есть макака?

это ты на кого намекаешь  ? :)

#124
15:17, 17 июня 2011

innuendo
> где у борескова ашикмин ?
тут, ниже середины
innuendo
> это ты на кого намекаешь ? :)
Да на манки я ссылаюсь

#125
15:18, 17 июня 2011

TheGrayWolf
> > где у борескова ашикмин ?
> тут, ниже середины

ужось, не заметил :)

#126
15:18, 17 июня 2011

вектор взгляда так считается?

 float3 v = normalize( view_pos.xyz - IN.pos_in_vs );
#127
15:30, 17 июня 2011

TheGrayWolf
> вектор взгляда так считается?

ну если в одном пространстве - да

#128
15:35, 17 июня 2011

Что-то наш тред подзатянулся, давай лучше покурим код :)

...

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 );
}

ничего необычного не видишь?

#129
16:05, 17 июня 2011

TheGrayWolf
> давай лучше покурим код

прямо сейчас не могу, скрипты правлю

#130
17:35, 17 июня 2011

TheGrayWolf

не спасло галактику ?

#131
20:35, 18 июня 2011

я тут извратился немного и придумал вот что.
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 );

#132
22:11, 20 июня 2011

susageP, ого, а как хотя бы примерно расшифровывается сия формула?

#133
22:29, 20 июня 2011

Синий Дракон
> Синий Дракон

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

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;

#134
22:39, 20 июня 2011

susageP
> s = exp(-alfa*alfa*11.111 )*0.064;

распределение

susageP
> сколько света отразиться в направление смотрящего.

обычно fresnel для этих целей прикручивают

ну а чем Ward\CT не устроили ?

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

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