6-8.用HLSL定义聚光灯

问题

你想定义一个聚光灯,它的行为很像点光源,但它照亮一个光锥,如6-10.

方案

在像素着色器,确定当前像素是否在照明锥中。可以求光的方向和锥方向间的点积。

运作

从上一节的代码开始。因为聚光灯比点光灯更专用,你将添加这些额外的XNA-HLSL变量到你的.fx文件:

float xLightStrength;     // 光强度

float3 xConeDirection;  // 光锥方向

float3 xConeAngle;       // 光锥角

float3 xConeDecay;       // 光锥衰减

第一个变量允许你增加/减少光的强度。这对其他类型的光也是有用的,并且当你的场景中有多个光源时也是必要的。接着,你可以调整聚光灯的光锥的中心方向,以及光锥的宽度。最后,你可以指定朝着光锥的边缘要减少多少光强度。

除此之外,您需要稍微扩展您的像素着色器。通常,你将做的和每像素点光源类似,但你将添加一个检查证实像素是否在光的光锥中:

SLPixelToFrame SLPixelShader(SLVertexToPixel PSIn) : COLOR0

{

SLPixelToFrame Output = (SLPixelToFrame)0;

float4 baseColor = float4(0,0,1,1);

float3 normal = normalize(PSIn.Normal);

float3 lightDirection = normalize(PSIn.LightDirection);

float coneDot = dot(lightDirection, normalize(xConeDirection));

float shading = 0;

if (coneDot > xConeAngle)

{

float coneAttenuation = pow(coneDot, xConeDecay);

shading = dot(normal, -lightDirection);

shading *= xLightStrength;

shading *= coneAttenuation;

}

Output.Color = baseColor*(shading+xAmbient);

return Output;

}

一旦你单位化法线和光方向,你应该发现当前像素是否在光锥中。要做到这一点,你要检查两个方向间的夹角:

当前像素和光源间的方向

光锥中心方向

第一个方向是lightDirection,而第二个在xConeDirection变量中规定。只有如果这个角度低于某一阈值,像素才被照亮。

快速的检查方法是求两个方向的点积。如果值接近1表示两个方向的夹角很小,值越小,角越大。

要决定角是否不会太大,你检查点积是否不小于存在xConeAngle中的某一阈值。如果像素在锥中,你计算光照因子,叫做shading。要削弱接近锥的边界的照明效果,你求coneDot变量指定xConeDecay次方的结果。结果,离光锥中心方向很远的像素的coneDot值等于或小于1。

光锥外边的像素的着色值为0,所以光不影响这些像素。

转载于:https://www.cnblogs.com/XNAconglele/archive/2009/09/25/1573711.html

6-8.用HLSL定义聚光灯相关推荐

  1. 6-6.用HLSL定义点光源

    6-6.用HLSL定义点光源 问题 直到现在,你已经用定向光照亮你的场景,它对添加阳光到3D世界很有用.常常,你也将需要一个单点光照,例如手电筒或爆炸.这种光源叫点光源. 方案 从你的XNA项目传递点 ...

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

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

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

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

  4. 高级着色语言HLSL入门

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

  5. OpenGL教程翻译 第二十一课 聚光灯

    第二十一课 聚光灯 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) 背景 聚光灯是第三个也是最后一个我们将要介绍的光源类型(至少在一段时间内).他比平行光和 ...

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

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

  7. 通用渲染管线(URP)_学习笔记

    通用渲染管道概述 通用渲染管线 (Universal Render Pipeline, URP) 是由Unity制作的预构建可编程渲染管线 (Scriptable Render Pipeline).U ...

  8. OpenGL进阶(十三) - GLSL光照(Lighting)

    提要 在上一篇文章中,我们介绍了简单的Shading,同时提出了一个光照模型,模拟了一个点光源,但是,关于光的故事还没有结束... 今天要学习的是方向光源(Directional Light),聚光灯 ...

  9. 交互式计算机图形学总结:第五章 光照和明暗绘制

    第五章 光照和明暗绘制 光照的一些概念 –从光源照射到物体的光传递了反射(Reflective)光[包括漫反射(Diffuse)和镜面(Specular)反射],透明(Transparent)光和吸收 ...

最新文章

  1. 在RHEL5.0中用YUM解决RPM包的依赖关系
  2. Socket的getInputStream()方法
  3. linux的基础知识——shell语法
  4. Redis学习-string数据类型
  5. Mysql5.6.x版本半同步主从复制的开启方法
  6. 电子表格控件Aspose.Cells V17.4.0发布 | 新增重要功能
  7. wpf之代码给grid添加内容
  8. 电脑计算机不见桌面,桌面上我的电脑(计算机)不见了怎么办?【图】
  9. 在计算机网络中通常所说的wlan是指,在计算机网络中,通常所说的WLAN是指()。 - 问答库...
  10. Hive MetaStore 配置
  11. fastble找不到手机_Android蓝牙库FastBle的基础入门使用
  12. vue+webpack实现一个todolist
  13. [学习笔记]2020年win10最常用dos命令以及win+R即可运行的命令(使用命令打开自己想要的内容,总比找不到更好,赶快收藏)
  14. 供应商层次分析法判断矩阵(文末附软件)
  15. 分享 上班族兼职项目——存着慢慢看很有用
  16. mfc简易的学生管理系统
  17. Web安全学习系列(1)
  18. 数据分析师前景怎样?为什么企业每年都会在数据分析技术上“砸钱”?
  19. 示波器分析IIC波形图
  20. 数学和算法之---排列组合

热门文章

  1. Linux常用命令——find命令大全
  2. 揭秘淘宝上那些删差评不为人知的套路!
  3. python接口自动化面试题_接口自动化面试题,建议收藏!
  4. 一天入门Java快速入门
  5. MySQL 常用函数的使用
  6. matlab他励直流电动机机械特性、效率与损耗分析
  7. 安装解压版MySQL时弹框报错提示:缺少 MSVCR120.dll、MSVCP120.dll、vcruntime140.dll等库的终极解决方案
  8. html中一段文字行间距设置,CSS如何设置文字行间距?
  9. iOS 加载第三方字体
  10. “智汇新算力,众启Z力量”惠普发布全新一代Z系列工作站,共赢算力黄金时代