转载请注明出处: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. [你必须知道的.NET]第二十八回:说说Name这回事儿

    发布日期:2009.3.18 作者:Anytao © 2009 Anytao.com ,原创作品,转贴请注明作者和出处. 1 缘起 老赵在谈表达式树的缓存(2):由表达式树生成字符串中提到,在描述Ty ...

  2. ios 安卓 video 取消播放自动全屏 属性

    x-webkit-airplay="true",x5-playsinline="true",webkit-playsinline="true" ...

  3. logrotate日志轮转

    1)基本介绍 适合应用服务日志,系统日志按天切割 如果没有日志轮转,日志文件会越来越大 将丢弃系统中最旧的日志文件,以节省空间 logrotate本身不是系统守护进程,它是通过计划任务crond每天执 ...

  4. PL/SQL 11.6 注册码

    PL/SQL Developer 下载地址:Download PL/SQL Developer 11.0.6 注册码 Product Code:4t46t6vydkvsxekkvf3fjnpzy5wb ...

  5. Java中分拣存储的demo

      //Letter.java package yzhou.map; /** * * @author 洋 * */ public class Letter { private String name; ...

  6. python 自定义过滤器

    文件目录结构: 新建文件并且命名为“templatetags” , 然后复制 __init__.py文件,拷贝到templatetags文件夹里, __pycache__文件夹可以忽略哈,那是程序运行 ...

  7. zabbix报警-邮件-钉钉

    安装zabbix的时候已经配置了zabbix_server的脚本目录 AlertScriptsPath=/opt/app/zabbix/script 所以把邮件.钉钉.微信相关的脚本都放在/opt/z ...

  8. tomcat服务器上web项目日志存放位置

    1.找到log日志的配置文件:log.xml,或者log.property,找到rollingFile标签,该标签的fileName属性就是更新的日志文件的存放位置.(相对于tomcat的bin目录)

  9. HDOJ(HDU) 3949 XOR

     Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  10. [Codeforces-div.1 494C] Helping People

    [Codeforces-div.1 494C] Helping People 试题分析 不难注意到题目所给的性质是一棵树,所以肯定是树形dp. 那么期望没有办法合并,我们还有一种最笨的方法就是求出概率 ...