转载请注明出处:http://blog.csdn.net/tianhai110

点光源光照模型:

公式:

I = Icolor*attenuation;                        attenuation表示衰减值

Attenuation = 1-d*d;                                       d为光源到该点的距离

通常我们用一个r来做点光源的衰减范围

及 attenuation = 1 - mul(Light/r, Light/r);

对Phong光照的例子进行修改

  1. vecLightDir 改名为 vecLightPos 表示光源位置,而不是光的方向; 设置其值如下:

  

  2. 修改vertex shader;

  1. float4x4 matViewProjection;
  2. float4x4 matWorld;
  3. float4   vecLightPos;
  4. float4   vecEye;
  5. struct VS_INPUT
  6. {
  7. float4 Position : POSITION0;
  8. float3 Normal   : NORMAL0;
  9. float2 Texcoord : TEXCOORD0;
  10. };
  11. struct VS_OUTPUT
  12. {
  13. float4 Position : POSITION0;
  14. float2 Texc     : TEXCOORD0;
  15. float3 Light    : TEXCOORD1;
  16. float3 Norm     : TEXCOORD2;
  17. float3 View     : TEXCOORD3;
  18. };
  19. VS_OUTPUT vs_main( VS_INPUT Input )
  20. {
  21. VS_OUTPUT Output;
  22. Output.Position = mul( Input.Position, matViewProjection );
  23. float3 posWorld = normalize(mul(Input.Position, matWorld));
  24. Output.Light = vecLightPos - posWorld;
  25. Output.View = vecEye - posWorld;
  26. Output.Norm = mul(Input.Normal, matWorld);
  27. Output.Texc = Input.Texcoord;
  28. return( Output );
  29. }

主要就是 把outPut.Light 由原来直接传个方向,变成每次都要计算该点到光源的向量;

  3. 修改 pixel shader;

  1. sampler2D baseMap;
  2. float4 ps_main( float2 Texc:TEXCOORD0, float3 Light:TEXCOORD1,
  3. float3 Norm:TEXCOORD2, float3 View:TEXCOORD3) : COLOR0
  4. {
  5. float4 ambient = { 0.3686f, 0.3686f, 0.3686f, 1.0f};
  6. float4 diffuse = { 0.88f, 0.88f, 0.88f, 1.0f};
  7. float3 Normal = normalize( Norm);
  8. float3 LightDir = normalize( Light);
  9. float3 ViewDir = normalize( View);
  10. float4 diff = saturate( dot( Normal, LightDir));
  11. float3 Reflect = normalize( 2 * diff * Normal - LightDir);
  12. float4 shadow = saturate(4*diff);
  13. float4 fvBaseColor      = tex2D( baseMap, Texc );
  14. float4 specular = pow(saturate(dot(Reflect, ViewDir)), 25);
  15. float4 color = fvBaseColor * (shadow * diff + ambient) + shadow * specular;
  16. float4 attenuation = mul(Light/64.0, Light/64.0);
  17. return color*(1-attenuation);
  18. }

主要是 加入衰减值 float4 attenuation = mul(Light/64.0, Light/64.0);

  4. 运行效果如下:

  

一步一步学RenderMonkey(4)--点光源光照模型 【转】的更多相关文章

  1. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

  2. 一步一步学ROP之linux_x86篇

    一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 ​ 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...

  3. (转载)一步一步学Linq to sql系列文章

    现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...

  4. 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计

    本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...

  5. 一步一步学android控件(之十五) —— DegitalClock & AnalogClock

    原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...

  6. 一步一步学Remoting系列文章

    转自:http://www.cnblogs.com/lovecherry/archive/2005/05/24/161437.html (原创)一步一步学Remoting之一:从简单开始(原创)一步一 ...

  7. 一步一步学android控件(之十六)—— CheckBox

    根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...

  8. 一步一步学Python(2) 连接多台主机执行脚本

    最近在客户现场,每日都需要巡检大量主机系统的备库信息.如果一台台执行,时间浪费的就太冤枉了. 参考同事之前写的一个python脚本,配合各主机上写好的shell检查脚本,实现一次操作得到所有巡检结果. ...

  9. 【DG】[三思笔记]一步一步学DataGuard

    [DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...

随机推荐

  1. HDU-5281

    Senior's Gun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  2. Excel Sheet Column Title&&Excel Sheet Column Number

    Excel Sheet Column Title Given a positive integer, return its corresponding column title as appear i ...

  3. Pychram------更改编辑区域的字体大小和背景颜色

    如上设置完成即可看到如下的效果设置完成.

  4. 197. Rising Temperature

    Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to ...

  5. 前端读者 | 关于存储及CSS的一些技巧

    @羯瑞 HTML5存储 cookies 大小限制4K 发送在http请求头中 子域名能读取主域名的cookies 本地存储 localStorage sessionStorage 大小限制5M(注意超 ...

  6. Linux打包压缩

    zip: 打包:zip something.zip something (目录请加 -r 参数) 解包:unzip something.zip 指定路径:-d 参数 tar: 打包:tar -zcvf ...

  7. 2.Spark Streaming运行机制和架构

    1 解密Spark Streaming运行机制 上节课我们谈到了技术界的寻龙点穴.这就像过去的风水一样,每个领域都有自己的龙脉,Spark就是龙脉之所在,它的龙穴或者关键点就是SparkStreami ...

  8. BZOJ 4873 寿司餐厅(最大权闭合图 网络流)

    寿司餐厅 时间限制: 1 Sec  内存限制: 512 MB提交: 6  解决: 3[提交][状态][讨论版] 题目描述 Kiana 最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序 ...

  9. BZOJ 3669 [Noi2014]魔法森林(贪心+LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3669 [题目大意] 给出一张图,每条边上有两个值ai和bi,现在需要求出一条1到N的路 ...

  10. BZOJ 1116 [POI2008]CLO(并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1116 [题目大意] Byteotia城市有n个towns,m条双向roads.每条ro ...