http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=52FCE20899526C5E8C5A3EA5D70E4681?doi=10.1.1.146.177&rep=rep1&type=pdf
http://research.edm.uhasselt.be/~tmertens/slides/csm.ppt
这哥们是作者之一,非常喜欢这哥们,主页在此,很多不错的文章
http://developer.download.nvidia.com/presentations/2008/GDC/GDC08_SoftShadowMapping.pdf
bungie的一个paper:SIGGRAPH09_LightingResearch.pptx
都从不同侧面描述了esm,很不错。
overview:
convolution sm和exponential sm和variance shadow map属于一类的shadow map,统称prefilter shadow map。
解决的问题和pcf一样是soft shadow的问题,只是效率更高。
走的流程是在shadow map construction pass输出的时候不是单纯的depth,而是进行了一些数学处理,比如exponential sm,
- 在shadow map depth pass输出depth的exp(另外带一些参数)操作,
- 然后做blur的操作,
- 在render shadow的时候用这个blur过的结果,通过一些exp和乘积操作得到shadow的权重(0--1)也就是影子有全影和半影之分了。
对比下pcf:
- shadow map depth pass输出depth值
- render shadow时候是一camera space point A,根据pcf filter的选择做偏移(可能是4,9,16点),反算到lighting space中,根据xy取shadow map中的light space depth,然后和A的lighting space z值对比得出是否在shadow里面,几个值(4,9,16)做一个带权值相加。
两者异同:
- 都是通过从多个点取shadow信息,加权相加得到软阴影,实际效果上也不相上下
- 只是convolution系列是从中间输出的buffer上做blur得到多点信息,texture的读取和alu计算少太多了
detail:数学推导
一些列数学推导来说明为什么这样一顿搞之后会以低得多的代价拿到pcf一样的quality。
基本思路是先把soft shadow的数学建模做出来,然后进行分解和算式合并。
shadow map的数学建模:
---公式1
对camera space里面x点来说,d(x)为light view中的z值,z(p)为x映射到light view之后的xy从shadowmap sample出来的depth,那么这两个信息可以得出shadow的值,比如最简单的就是:
- if(d(x)>z(p)) s(x)=0;
- else s(x)=1;
这样的一个阶梯函数。
这个结果是一个要么有要么无的,也就是一个“硬阴影”,我们要的是soft shadow所以要做一些“blur”的工作。
blur在digital processing里面有一个对应的操作是卷积(convolution)
gaussian blur就是graphics programming里面用的很多的convolution。
convolution的公式为:
---公式2
对比熟悉的高斯blurV:
- N为做卷积操作的neighborhood,gaossian blur中为中心点左右各6一共13点这个范围
- w为kernel,就是每个周围点的权值,远的话可能就比较小,近的话比较大
- g为被convolution的函数,blur中为被blur的texel
当然gaussianblur只是convolution的一个instance。
这么看来pcf其实也是类似卷积的一个操作,只是正规卷积应该是在点偏移的时候,在公式1中的d(x),z(p)都是偏移的才对,pcf只是z(p)偏移了,d(x)没有偏移。
公式1代入公式2为:---公式3
把公式另一种形式写一下,方便后面继续推导:----公式4
下一步本身是csm原始的一个傅立叶展开的一堆sin,cos函数,因为这个完全没有使用价值,所以直接跳到exponential shadow map:
把shadow函数用幂函数来建模:
----公式5
这个和完全准确的阶梯函数不完全一样,是一种近似,所以esm有bleeding的情况,但是这个却满足我们渴望的可以prefilter的特性。
这里假设在convolution kernel里面d(x)为一个恒定值,那么可以:
----公式6
这里就完成了最关键的把d(x)和z(p)分离并进行convolution的工作。
w*exp(cz)这部分就是对shadow map做blur的操作了。
问题:
图中可以看到红的是标准shadow数学建模的阶梯函数,黑的是esm的数学模型,是一个近似的关系,但是在d(x),z(p)差距很小的时候会有比较大的偏差,也就导致了light bleeding的情况。
这个情况halo的处理方法是:在很近的地方做一个darken处理,解决的还不错。
还有一个正常的话esm这种softshadow的处理方法和cascaded shadow map是正交的,彼此之间不会影响,但是实际上在交界处还是会有问题,bungie给出了解法,直接看就好了,代码都有了。
分享到:
相关推荐
卷积阴影(CSMs)原论文,ESMs也是起源于CSMs,比较有参考价值。
卷积指数流和广义Sylvester流 示例代码。 下面是一个实现卷积指数的例子。 请注意,非常简单的属性是inv_conv_exp是通过简单地否定内核来计算的。 有关更详细的代码,请参见。 import torch ....
各种图像滤镜(超过50种,如Color,HSL Color space,YCbCr Color space,Binarization,Morphology,Convolution & Correlation……………… 等等,不一一列举)! 还包括:超帅VisualStudio多文档风格界面!打印...
Active Convolution Learning the Shape of Convolution for Image ClassificationActive Convolution Learning the Shape of Convolution for Image ClassificationActive Convolution Learning the Shape of ...
ConvolutionNd层(Convolution 层)1
FFT based convolution
matlab开发-convolution。符号数学卷积
Invariant Scattering Convolution Networks卷积网络的pdf论文,很详细
Convolution arithmetic tutorialConvolution arithmetic tutorialConvolution arithmetic tutorial
Gait recognition using multichannel convolution neural networks。步态识别
basic image convolution example for matlab
UFLDL Exercise: Convolution and Pooling 卷积和池化 matlab代码 只需下载训练集和测试集就可以直接运行
convolution filter application
# Deep Convolution Generative Adversarial Networks This example implements the paper [Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks]...
用来实现卷积运算,可以代替系统的内建的卷积函数。很好用哦
关于correlation和convolution介绍的文章,英文版,很容易看懂。
coursera 吴恩达 -- 第四课 卷积神经网络 :第一周 Convolution model - Application - v1 包含训练数据集合测试数据集 全
4.1 Convolution as a matrix operation . . . . . . . . . . . . . . . . . 19 4.2 Transposed convolution . . . . . . . . . . . . . . . . . . . . . . . 19 4.3 No zero padding, unit strides, transposed . ....
微软 CVPR 2020 Oral 论文,提出了动态卷积,能够在不增加网络深度或宽度的情况下增加模型的表达能力(representation capacity)。其基本思路是根据输入图像,自适应地调整卷积参数