6-6.用HLSL定义点光源

问题

直到现在,你已经用定向光照亮你的场景,它对添加阳光到3D世界很有用。常常,你也将需要一个单点光照,例如手电筒或爆炸。这种光源叫点光源。

方案

从你的XNA项目传递点光源的3D位置到你的XNA effect。为每个顶点,你可以计算出从光源到顶点的方向并使用此方向。

运作

在你的.fx文件,用这行代码替换xLightDirection参数,允许你从XNA项目传递光源的3D位置到HLSL effect:

float3 xLightPosition;

接着,你将为每个顶点计算从光到顶点的方向。一直,从A到B的方向通过B减A得到。记住你需要顶点的最终3D位置,意思是用World矩阵变换原3D位置:

float3 final3DPosition = mul(inPos,xWorld);

float3 lightDirection = final3DPosition – xLightPosition;

lightDirection = normalize(lightDirection);

output.LightFactor = dot(rotNormal,-lightDirection);

因为光源到顶点方向将可能比1大许多,你需要确保它的长度被单位化。一旦你知道这个光方向,你就准备去处理了。

当你运行这个代码,在每个顶点你将计算从光源到该顶点的方向,所以这个方向对每个顶点都不同。

 

衰减距离

要使事情更真实,你可能想要在光源和顶点间距离增大时减少点光源的影响。要这么做,在单位化它之前调用length(lightDirection)得出这个距离。接着,通过这个距离决定LightFactor;这将导致光的强度在光源和顶点间的距离增长时减少:

float3 final3DPosition = mul(inPos,xWorld);

float3 lightDirection = final3DPosition – xLightPosition;

float distance = length(lightDirection);

lightDirection = normalize(lightDirection);

Output.LightFactor = dot(rotNormal,-lightDirection);

Output.LightFactor /= distance;

转载于:https://www.cnblogs.com/XNAconglele/archive/2009/09/22/1571502.html

6-6.用HLSL定义点光源相关推荐

  1. 6-8.用HLSL定义聚光灯

    6-8.用HLSL定义聚光灯 问题 你想定义一个聚光灯,它的行为很像点光源,但它照亮一个光锥,如6-10. 方案 在像素着色器,确定当前像素是否在照明锥中.可以求光的方向和锥方向间的点积. 运作 从上 ...

  2. OpenGL_17_点光源

    1, (环境光,漫射光和镜面反射光),这三种模型都是基于平行光的.平行光只是通过一个向量来表示,没有光源起点,因此它不会随着距离的增大而衰减 点光源:它有光源起点而且有衰减效果,距离光源越远光线越弱. ...

  3. 《高级着色语言HLSL入门》系列文章

    此系列文章由 博客园 天行健 归纳整理,此处仅作收藏与共享之用! 如欲转载该系列文章,需按如下方式于文章起始位置显式标明文章作者以及原文出处,以示尊重!! 文章作者:天行健 君子当自强而不息 原文出处 ...

  4. 高级着色语言HLSL入门(5)

    高级着色语言HLSL入门(5) 16.4关键字.语句和强制转换 16.4.1 关键字 为便于参考,这里给出一个HLSL定义的关键字列表: asm        bool        compile  ...

  5. 高级着色语言HLSL入门

    http://www.bullock.cn/blogs/geeker/archives/68700.aspx 高级着色语言HLSL入门(1) 在我们写的程序里顶点和像素是很小的对象,它们由GPU来执行 ...

  6. Unity3d轻量渲染管线(LWRP)民间文档

    转载:https://blog.csdn.net/weixin_42163773/article/details/84317223 近日在学习Unity3d的SRP,由于官方未正式发布,故几乎没有文档 ...

  7. DirectX11 With Windows SDK--36 延迟渲染基础

    前言 随着图形硬件变得越来越通用和可编程化,采用实时3D图形渲染的应用程序已经开始探索传统渲染管线的替代方案,以避免其缺点.其中一项最流行的技术就是所谓的延迟渲染.这项技术主要是为了支持大量的动态灯光 ...

  8. unity urp内置lit材质源码解析(上)

    之前我发布过一篇对urp的内置shader lit的结构解析,发现自己说的也不完善,这次直接对源码进行一个解析,并提升一下自己的记忆. 如果你找不到这个shader,那么就有可能你不是urp渲染管线. ...

  9. 绘制可伸缩矢量图形(SVG)

    1.SVG概述 可伸缩矢量图形(Scalable Vector Graphics,SVG)使用XML格式在Web上定义基于矢量的图形.矢量图形是根据几何特性来绘制的图形,矢量(Vector)可以是一个 ...

最新文章

  1. 处理 react_【学习教程】React 中阻止事件冒泡的问题
  2. 当你使用微信和 QQ 的时候,请不要忘记 ICQ 这个伟大的公司!
  3. Selenium Web 自动化 - Selenium常用API
  4. Ubuntu 14.04下 Redis MongoDB安装及使用
  5. i3处理器_十代酷睿i3-10100F配GTX1650S组装机配置清单
  6. 项目奖金一般有多少_全年一次性奖金如何进行纳税筹划?
  7. 转:Google论文之三----MapReduce
  8. php mysql 日期查找_PHP / MySQL存储和搜索日期
  9. 调用别人服务器运行本地文件方法
  10. 出现梯度消失与梯度爆炸的原因以及解决方案
  11. 利用CPUID 汇编指令(转载)
  12. 设计师和程序员-拓展知识关系网
  13. 【算法】LeetCode算法题-Length Of Last Word
  14. PS基础操作之图像处理(三)
  15. java excel 加边框_java通过poi来设置表格边框
  16. 可行性分析与需求分析
  17. java寻秦 皇陵的诅咒_掌盟网游有一款游戏叫古墓寻秦,主角是个女的,她父亲是个教授...
  18. 用计算机亩换算成平方,平方换算成亩怎么算(平方米换算亩计算器)
  19. 插画惯用风格_2020年最佳插画家的10种鼓舞人心的插画风格
  20. 微信如何保存文件?企业微信如何下载文件?

热门文章

  1. 小规模网络数据公开数据_大规模的在线公开课程曾经是100%免费的。 但是他们没有那样做。...
  2. git克隆 不带目录_Git 系统学习笔记
  3. 中科院 工程硕士专业课 复试考试前的辅导安排
  4. 《Java编程思想》笔记13.字符串
  5. [设计模式]外观模式
  6. Java架构演进之路
  7. linux实战考试题:批量创建用户和密码(不能使用循环)
  8. OSPF中的frame-relay(3) 点到多点非广播
  9. Linux下查找nginx配置文件路径
  10. Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服务