通常而言, 对于不支持TextureArray 的设备(D3D9 是完全不支持的), 渲染omni light shadow 通常的做法是.

shadow generation:for (int face = 0; face <6; ++face)
{push shadow render target(2D Texture)setup frustum's projection matrix draw frustum's shadow caster.
}render shadow :

draw light volume [Sphere]for (int face = 0; face <6; ++face)
{render shadow frustum volume[Cone or frustum ].
}

在D3D11中, 基于TextureArray 可以方便地实现one-pass 渲染. 这就引发了一个问题, 那就是我长久以来不愿意抛弃的D3D9, 或者那些不支持GL_EXT_texture_array的设备能不能做到呢?

2天的尝试后, 发现是可行的. 先抛出结果:

上图中是Hardware PCF 渲染出来的.

思路:

1. 对任一需要产生阴影的点光源, 渲染shadow map 的时候, 打包到一张纹理中. 最多是需要6张,因此, 我用了一个3X2的分割.  [这里有一个问题, 点光源不是在所有方向都会产生阴影. 很多时候, 点光源往往只有1-2个Frustum会有shadow caster, 所以这里固定分割,会导致浪费]

2. 设置viewport 到3X2个分割的区域, 分别渲染6个Frustum 的shadow map.

在着色阶段.(下面是基于延时渲染的) 将阴影计算和光照放到一个shader 中, 在渲染灯光包围球的时候, 同时完成.

几个关键的要素:

  • World -> Shadow 变换.
  • Projected Texture TexCoord .
  • Fast Shadow map uv address.

传统做法中, 不需要考虑这些. World->Shadow 变换, 无非就是 mul(WorldToShadowMatrix, WorldPos); 然后 tex2Dproj(ShadowMap, ShadowMapCoord); //tex2Dlod

但是我们这里必须要进行变换.

首先最关键的因素是如何将一个pixel 对应的World Position 变换到shadow map 空间? 或者说, 如何确定一个World Position 对应哪个方向上的Frsutum ???? 这里可以武断地确定:

float3 WorldPos; //
float3 LightPos;float3 LightSpacePos = WorldPos - LightPos;
float3 AbsLSP = abs(LightSpacePos );
float Det = max(AbsLSP .x,max(AbsLSP .y,AbsLSP .z)); 

暂时先不考虑到底是哪个Frsutum. 总之, 在任意Frsutum 中, 距离最大的那个肯定就是在LightView Space 中的距离.  很好, 拥有这个, 我们已经距离结果很近了. 起码, 我们确定了在shadow map 空间中的Z.

看看XY. 在上面, 我们获得了LightSpacePos.  要快速映射到一个3X2 2D纹理中的纹理坐标, 呵呵, CUBEMAP. 很自然的方式~~~~这里面有一张图最好了, 等我先发完再来补.

关于构建CUBEMAP 的算法, 其实就是根据渲染阴影时候的视口选择,是一样的. 后面再补.

转载于:https://www.cnblogs.com/lethep/p/3941792.html

rendering omni shadow in one pass.相关推荐

  1. 3DShader之阴影贴图(Shadow Mapping)

    好久没写shader了,一直被实验室要求作java开发,中间准备了一个月雅思,最近又被老师拉到东莞做Hadoop开发.马上面临毕业的问题了,突然人生苦短,趁有生之年多做点自己喜欢的事情吧,所以最近又开 ...

  2. Unity Shader - Planar Shadow - 平面阴影

    文章目录 整体运行效果 思路 Shader 问题 Z-Fighting,解决:按法线方向偏移一丢丢 绘制 Alpha 混合重叠,解决:使用 stencil buffer 来规避 为何出现这个问题 解决 ...

  3. Real-Time Rendering——7.1 Planar Shadows平面阴影7.1.1 Projection Shadows投影阴影

    7.1 Planar Shadows平面阴影 A simple case of shadowing occurs when objects cast shadows onto a planar sur ...

  4. Unity SRP自定义渲染管线 -- 4.Spotlight Shadows

    英文原文:https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/spotlight-shadows/ 渲染并且读取纹 ...

  5. [E]PSM算法简析

    转自: http://www.graphicsgeeks.org/index.php?title=PSM&oldid=153 (图形学极客) 参照:http://www.opengpu.org ...

  6. UE4虚幻引擎开发手机游戏

    该文章来自用户转载 点击阅读原文 UE4虚幻引擎作为游戏开发引擎之一,在很多项目中都会使用到.下面就给大家分享下如何使用UE4开发高品质的手机游戏. 作者介绍 大纲 •介绍 •UE4 针对3A级手游的 ...

  7. Unity中的混合光照

    Unity中的混合光照 Baked Indirect Shadowmask Distance Shadowmask Subtractive Reference Unity支持三种混合光照模式,分别是B ...

  8. (九)unity自带的着色器源码剖析之——————UnityShadowLibrary.cginc文件分析(实时阴影和烘焙阴影、阴影淡化、阴影渗漏处理、PCF阴影过滤解决实时阴影锯齿)

    一.阴影与全局照明系统的关系 Unity3D引擎可以根据宏SHADOWS_SCREEN和LIGHTMAP_ON是否启用决定是否在全局照明系统下对阴影进行混合处理.如果这两个宏同时启用,则HANDLE_ ...

  9. 轻量级渲染管线_轻量级渲染管道:优化实时性能

    轻量级渲染管线 Update: LWRP is now out of preview and production-ready. Get more info in our 2019.1 release ...

最新文章

  1. POJ.3207.Ikki's Story IV-Panda's Trick(2-SAT)
  2. 如何使用'git reset --hard HEAD'恢复到之前的提交? [重复]
  3. 【脑电信号分类】脑电信号提取PSD功率谱密度特征
  4. mysql两台服务器怎么做数据同步_两台mysql服务器实现双机互备配置并测试数据同步...
  5. 正则表达式提取器_C++11新特性7 - 正则表达式
  6. 低代码从技术走向产品,用友发布自动化设计工具“码前”
  7. 最新京东炸年兽活动一键做任务工具v1.4
  8. webApp禁止用户保存图像
  9. ★LeetCode(17)——电话号码的字母组合(JavaScript)
  10. ACM-线段树区间更新+离散化
  11. 跟随我在oracle学习php(27)
  12. python发音翻译-python实现在线翻译
  13. THotKey控件 delphi
  14. 有限域f9的特征是多少_密码学数学基本第十一讲有限域.ppt
  15. Spring Boot整合mybatis报错Invalid bound statement (not found)
  16. 《小猫猫大课堂》1——小喵是如何开启敲代码之路的?
  17. idea关闭当前窗口的快捷键
  18. Ant入门教程之常用命令
  19. cherry-pick多次
  20. 人生的财富不只限于金钱

热门文章

  1. mysql追溯历史性能问题_【踩坑記錄】記一次MySQL主從復制延遲的坑
  2. 安装oracle的口令是,Oracle中口令设置、用户解锁、卸载等问题
  3. redis 用户订单缓存_Redis实战(12)-基于Key失效和定时任务实现订单支付超时自动失效...
  4. java打印字符串引用_Java中的字符串及其中的常用方法
  5. centos8 ssh配置_JumpServer 堡垒机CentOS 8 安装部署(四)
  6. bigdecimal判断等于0_Linux | shell脚本-比较判断和运算语句
  7. 如何搭建高性能视频网站
  8. shell的单引号与双引号
  9. 【虹膜识别】+【开源代码】虹膜识别--步骤讲解及算法复现,虹膜表征:基于虹膜反映点的健康监测
  10. Pytorch中nn.Conv2d的用法