博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
rendering omni shadow in one pass.
阅读量:5154 次
发布时间:2019-06-13

本文共 1650 字,大约阅读时间需要 5 分钟。

 通常而言, 对于不支持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

你可能感兴趣的文章
SQL Server数据库漏洞评估了解一下
查看>>
gdb打印STL和boost容器
查看>>
HDU4790
查看>>
MySQL安装相关
查看>>
其他——[转]从实现iPhone的OAuth封装看国内互联网和开放平台
查看>>
[LeetCode] Remove Element 分析
查看>>
编译安装httpd-2.4.12
查看>>
Worker Thread
查看>>
vuejs解析url地址
查看>>
nodejs服务器部署教程一
查看>>
MyEclipse 2017 CI 10 发布(附下载)
查看>>
SQL SERVER 2008筛选时报错 无法为该请求检索数据
查看>>
Oracle审计--AUD$占用空间较大处理方案
查看>>
搭建高性能计算环境(七)、应用软件的安装之MS
查看>>
ASP.NET判断是否为手机登录
查看>>
离别的回忆
查看>>
4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(远程升级WIFI内部程序)
查看>>
关于Keil4 转到 Keil5以后的一些错误解决
查看>>
推荐一个很棒的JS绘图库Flot
查看>>
uni-app,v-for时 block 和 view 的使用
查看>>