您的位置:首页 > 其它

学习了下简单的光照模型

2010-11-01 21:42 363 查看
龙书和SDK光照的例子也看到几个了,今天看《GPU 编程与CG 语言之阳春白雪下里巴人》系统的学了学,也能写写shader练练手了。1个月前让我抱着一本图形学书死啃的话,我肯定读不出来个所以然,因为那时才刚刚学完固定流水线,对3D还处于混沌的状态。今天学习光照模型,所以特意翻开了
图形学书查看资料,惊奇的发现,我实践中学到的大部分不甚明了的知识,在书中都有解答。现在明白了,为什么
图形学是基本功,过段时间我得找本好点的图形学圣经,好好看看了。光是畏惧严谨的原理阐述和数学知识是不行得。

还有,学了shader这么些天,看倒是看得明白,今天自己写简单的shader,发现问题真是不少,看来真是纸上得来终觉浅,绝知此事要躬行啊。

编程,就是要多动手实验,测试,才能练出真功夫。

1。Lambert光照模型,也就是漫反射光照模型。它考虑的是ambient光和diffuse光对物体的综合影响。

下面是我写的shader程序:

代码

matrix WorldMatrix;
matrix ViewMatrix;
matrix ProjMatrix;
matrix WorldMatrix_IT; //世界矩阵的逆再转置,为了把顶点法向量变换到世界空间
float3 g_LightPos = float3( -3, 0, -10);
float3 g_ambient = float3(0.3f, 0.3f ,0.3f);
float3 g_LightColor = float3(1.0f, 1.0f, 1.0f);
float g_shininess =20.0f;
float4 g_eyePos;

//顶点着色器入口函数
void VS_MAIN ( float4 inPos : POSITION,
float3 inNormal : NORMAL,
out float4 oPos : POSITION,
out float3 worldPos : texcoord0,
out float3 worldNormal : texcoord1 )
{
float4 wPos = mul( inPos, WorldMatrix);

worldPos = wPos.xyz;
oPos = mul(wPos, ViewMatrix);
oPos = mul(oPos, ProjMatrix);

worldNormal = normalize( mul( inNormal, ( float3x3 )WorldMatrix_IT ) );
}

//像素着色器入口函数
float4 PS_MAIN( float3 worldPos : texcoord0,
float3 worldNormal : texcoord1) : color0
{
float3 N = worldNormal;
//计算入射光方向
float3 L = normalize( g_LightPos - worldPos );
//计算视线方向
float3 V = normalize( g_eyePos.xyz - worldPos );
//计算漫反射光强
float3 diffuse = g_LightColor * saturate (dot( L, N) ) + g_ambient;

float3 specular = float3(0.0f, 0.0f, 0.0f );
bool back = ( dot( L, N ) ) && ( dot( N, V ) >0 );
//若不满足条件则高光为0
if(back)
{
//计算顶点切向量
float3 T = normalize( cross( N, V ) );
float3 LT = dot( L, T );
float3 VT = dot( V, T );
float3 a = sqrt( 1- pow( LT, 2.0f ) ) * sqrt( 1- pow( VT, 2.0f ) ) - LT * VT;
specular = pow( a, g_shininess );
}
//计算总光强
float4 color;
color.xyz = diffuse * float3(0.6f, 0.6f, 0.6f) + specular ;
color.w =1;
return color;
}

technique LightAndTexture
{
pass P0
{
VertexShader = compile vs_2_0 VS_MAIN( );
PixelShader = compile ps_2_0 PS_MAIN( );
}
}

效果图:


可以很清楚地看出这种各向异性光照效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: