您的位置:首页 > 其它

用Shader实现标准光照模型

2012-09-07 07:01 399 查看
http://www.cppblog.com/sunicdavy/archive/2010/06/01/116895.html



DXSDK里光照模型的讲解依然停留在DX9的固定管线时代;DX10及DX11的文档里只是API文档,居然一点基于Shader的光照模型讲解文章都未见,失望.

无奈,打开NV官网,找到这样一篇文章,基于Cg语言的Shader标准光照模型讲解,Bingo!

了解标准光照基础知识后,就不会面对MAX的材质系统,Maya的NodeBasedMaterialSystem感到陌生.

这里贴下这组光照模型的Cg代码



float4x4matViewProjection;



float3GlobalAmbient;

float3LightColor;

float3LightPosition;

float4EyePosition;

float3Ke;

float3Ka;

float3Kd;

float3Ks;

floatShininess;

voidvs_main(

infloat4InPosition:POSITION,

infloat3InNormal:NORMAL,

outfloat4OutPosition:POSITION,

outfloat4OutColor:COLOR0

)


{


OutPosition=mul(InPosition,matViewProjection);


float3P=InPosition.xyz;

float3N=InNormal;


//Computetheemissiveterm

float3Emissive=Ke;


//Computetheambientterm

float3Ambient=Ka*GlobalAmbient;



//Computethediffuseterm

float3L=normalize(LightPosition-P);

floatDiffuseLight=max(dot(N,L),0);

float3Diffuse=Kd*LightColor*DiffuseLight;


//Computethespecularterm

float3V=normalize(EyePosition-P);

float3H=normalize(L+V);

floatSpecularLight=pow(max(dot(N,H),0),Shininess);


if(DiffuseLight<=0)SpecularLight=0;


float3Specular=Ks*LightColor*SpecularLight;

OutColor.xyz=Emissive+Ambient+Diffuse+Specular;

OutColor.w=1;

}


float4ps_main(float4OutColor:COLOR0):COLOR0

{

return(OutColor);


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: