学习了下简单的光照模型
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( );
}
}
效果图:
可以很清楚地看出这种各向异性光照效果。
图形学书查看资料,惊奇的发现,我实践中学到的大部分不甚明了的知识,在书中都有解答。现在明白了,为什么
图形学是基本功,过段时间我得找本好点的图形学圣经,好好看看了。光是畏惧严谨的原理阐述和数学知识是不行得。
还有,学了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( );
}
}
效果图:
可以很清楚地看出这种各向异性光照效果。
相关文章推荐
- 学习了下简单的光照模型
- 学习笔记——基本光照模型简单实现
- 计算机图形学 学习笔记(十二):颜色模型,简单 / 增量 光照模型
- DirectX11 学习笔记8 - 最简单的光照
- 【php框架学习】最简单的php mvc 模型框架实现
- [PHP]CodeIgniter学习手册(三):模型Model的介绍与简单案例
- Directx教程(23) 简单的光照模型(2)
- 小白学习机器学习---第五章:神经网络简单模型python实现
- 《unityshader 入门精要》漫反射光照与高光反射光照模型学习笔记
- 知识汇总二(简单光照模型)
- 【Unity Shaders】学习笔记——SurfaceShader(十一)光照模型
- Android学习系列(5)--App布局初探之简单模型
- Peersim 学习日记 05 关于信任模型(简单的)
- django学习记录-django-1.5中简单地自定义自己的用户模型
- 简单的光照模型
- 第1章学习 简单工厂模型
- netty学习(一)--linux下的网络io模型简单介绍
- TQ2440开发板学习纪实(10)--- 实现多任务处理,最简单OS模型
- (转)【D3D11游戏编程】学习笔记十二:光照模型
- Tensorflow深度学习之十五:VGG16模型的简单自主实现