6-6.用HLSL定义点光源
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定义点光源相关推荐
- 6-8.用HLSL定义聚光灯
6-8.用HLSL定义聚光灯 问题 你想定义一个聚光灯,它的行为很像点光源,但它照亮一个光锥,如6-10. 方案 在像素着色器,确定当前像素是否在照明锥中.可以求光的方向和锥方向间的点积. 运作 从上 ...
- OpenGL_17_点光源
1, (环境光,漫射光和镜面反射光),这三种模型都是基于平行光的.平行光只是通过一个向量来表示,没有光源起点,因此它不会随着距离的增大而衰减 点光源:它有光源起点而且有衰减效果,距离光源越远光线越弱. ...
- 《高级着色语言HLSL入门》系列文章
此系列文章由 博客园 天行健 归纳整理,此处仅作收藏与共享之用! 如欲转载该系列文章,需按如下方式于文章起始位置显式标明文章作者以及原文出处,以示尊重!! 文章作者:天行健 君子当自强而不息 原文出处 ...
- 高级着色语言HLSL入门(5)
高级着色语言HLSL入门(5) 16.4关键字.语句和强制转换 16.4.1 关键字 为便于参考,这里给出一个HLSL定义的关键字列表: asm bool compile ...
- 高级着色语言HLSL入门
http://www.bullock.cn/blogs/geeker/archives/68700.aspx 高级着色语言HLSL入门(1) 在我们写的程序里顶点和像素是很小的对象,它们由GPU来执行 ...
- Unity3d轻量渲染管线(LWRP)民间文档
转载:https://blog.csdn.net/weixin_42163773/article/details/84317223 近日在学习Unity3d的SRP,由于官方未正式发布,故几乎没有文档 ...
- DirectX11 With Windows SDK--36 延迟渲染基础
前言 随着图形硬件变得越来越通用和可编程化,采用实时3D图形渲染的应用程序已经开始探索传统渲染管线的替代方案,以避免其缺点.其中一项最流行的技术就是所谓的延迟渲染.这项技术主要是为了支持大量的动态灯光 ...
- unity urp内置lit材质源码解析(上)
之前我发布过一篇对urp的内置shader lit的结构解析,发现自己说的也不完善,这次直接对源码进行一个解析,并提升一下自己的记忆. 如果你找不到这个shader,那么就有可能你不是urp渲染管线. ...
- 绘制可伸缩矢量图形(SVG)
1.SVG概述 可伸缩矢量图形(Scalable Vector Graphics,SVG)使用XML格式在Web上定义基于矢量的图形.矢量图形是根据几何特性来绘制的图形,矢量(Vector)可以是一个 ...
最新文章
- 处理 react_【学习教程】React 中阻止事件冒泡的问题
- 当你使用微信和 QQ 的时候,请不要忘记 ICQ 这个伟大的公司!
- Selenium Web 自动化 - Selenium常用API
- Ubuntu 14.04下 Redis MongoDB安装及使用
- i3处理器_十代酷睿i3-10100F配GTX1650S组装机配置清单
- 项目奖金一般有多少_全年一次性奖金如何进行纳税筹划?
- 转:Google论文之三----MapReduce
- php mysql 日期查找_PHP / MySQL存储和搜索日期
- 调用别人服务器运行本地文件方法
- 出现梯度消失与梯度爆炸的原因以及解决方案
- 利用CPUID 汇编指令(转载)
- 设计师和程序员-拓展知识关系网
- 【算法】LeetCode算法题-Length Of Last Word
- PS基础操作之图像处理(三)
- java excel 加边框_java通过poi来设置表格边框
- 可行性分析与需求分析
- java寻秦 皇陵的诅咒_掌盟网游有一款游戏叫古墓寻秦,主角是个女的,她父亲是个教授...
- 用计算机亩换算成平方,平方换算成亩怎么算(平方米换算亩计算器)
- 插画惯用风格_2020年最佳插画家的10种鼓舞人心的插画风格
- 微信如何保存文件?企业微信如何下载文件?
热门文章
- 小规模网络数据公开数据_大规模的在线公开课程曾经是100%免费的。 但是他们没有那样做。...
- git克隆 不带目录_Git 系统学习笔记
- 中科院 工程硕士专业课 复试考试前的辅导安排
- 《Java编程思想》笔记13.字符串
- [设计模式]外观模式
- Java架构演进之路
- linux实战考试题:批量创建用户和密码(不能使用循环)
- OSPF中的frame-relay(3) 点到多点非广播
- Linux下查找nginx配置文件路径
- Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服务