Advanced Volumetric Obscurance (1)

Advanced Volumetric Obscurance (1)

这两天花时间改进了Volumetric Obscurance的算法,并取得了一些成果。暂时先把改进后的算法称为Advanced Volumetric Obscurance。 原VO论文提出了一个非常好的概念 – Line Sample。可惜论文本身却有不少不严谨的推导和错漏,甚至里面给出的关于Line Sample的数学结论也是不严谨的,只是因为多次取样的缘故,效果上的误差变小了而已。另外,在采样次数较少的情况下(比如4 samples),原VO论文的方法在处理高复杂度的场景时效果惨不忍睹(特别是down-sample之后)。所幸从一开始就没有按照论文给出的结论来,只是借鉴了Line Sample这个概念,所以前一篇博文里面得到效果才比较对(其实也有问题)。 这里先贴几张图,具体分析和改进细节待续。

Volumetric Obscurance

Volumetric Obscurance

Screen Space Ambient Occlusion的改进方法。总结来讲,是对取样统计AO的计算过程做改进,屏幕空间依然做多次取样,但每次取样都在深度方向上直接计算解析解,因此可以用更少的Sample达到比普通SSAO更好的效果。据说CryEngine3也用到了这种方法。 用RenderMonkey实现了一下,效果非常明显,4个Sample就能达到普通SSAO 8个Sample的效果,甚至某些细节还要显得更好。

Parallax Mapping

Parallax Mapping

原始的Parallax Mapping在Normal Mapping基础上,通过高度图和视线计算视差,对texcoord做位移,从而更好地表现凹凸感。而后PM发展出多种“改进”方法,大都是通过多次采样,选取最合适位移来达到更精确的效果,甚至可以表现出遮挡关系。但是每个pixel都需要做n次heightmap采样,效率上并不适合实时渲染。Parallax Occlusion Mapping、Distance Mapping都属于这种。

各种Soft Shadow Mapping算法及推导过程

各种Soft Shadow Mapping算法及推导过程

Shadow Mapping已经成为当前3D游戏的标配。传统SM+PCF可以很好地实现日光环境下的Hard Shadow,但如果要实现由昏暗灯光所产生的Soft Shadow,则要么效果过于生硬(sample次数少)要么效率低下(sample次数多)。因此,越来越多的游戏开始使用能够充分利用硬件特性的软阴影算法。 这里主要总结各种Soft Shadow Mapping的算法思想和推导过程,不提及实现上的细节和具体代码,等有空再写写Demo。 本文为原创内容,转载请注明出处。

Spherical Harmonics Lighting (1)

Spherical Harmonics Lighting (1)

近几年来鼎鼎大名的Spherical Harmonics Lighting(球面调和光照)主要用于实时渲染全局光照风格的物体或场景。SH和傅立叶变换一样,是一种数值分析方法,原理上大同小异,不同的地方主要在于基函数的选取。当然,在应用方面则和傅立叶变换完全不同。

Ocean Simulation Demo

Ocean Simulation Demo

刚做完的一则关于海洋模拟的demo,用到了最近在看的Fourier Transform。 具体说明以后补上。数学的魅力只有在实际应用中才能体现出来。 Download FFTWater.rar (2.05MB)

Fourier Transform 傅里叶变换 (4)

Fourier Transform 傅里叶变换 (4)

第四篇主要总结离散傅里叶变换的相关知识。 Discrete Fourier Transform 离散傅里叶变换 数学上,离散傅里叶变换是一种特殊的傅里叶变换,常用于傅里叶分析。它能够将一个函数(通常是时域空间的函数)变换为一个频域空间的函数。由于离散傅里叶变换研究的是有限的一串实数或复数数据,因此非常适合在计算机上编码和实现。 对于N个复数 x0, x1, …, xN-1,可以通过DFT将其变换为另外一组复数 X0, X1, …, XN-1: Xk = ∑N-1n=0xne-(2πi/N)kn (k = 0,1,…,N-1) [...]

Fourier Transform 傅里叶变换 (3)

Fourier Transform 傅里叶变换 (3)

第三篇主要总结傅里叶级数到连续傅里叶变换的推导。 Fourier Transform 傅里叶变换 将傅里叶级数推广到周期为T的情况,得到: cn = (1/T)∫T/2-T/2f(x)e-2πinx/Tdx 当T→∞时,f(x)相当于非周期函数,但此时,1/T→0。 为了推广到非周期函数,将其放大T倍,令ξ=n/T, T→∞,则得到可积函数f(x)的傅里叶变换: F(ξ) = ∫∞-∞f(x)e-2πixξdx

Fourier Transform 傅里叶变换 (2)

Fourier Transform 傅里叶变换 (2)

第二篇主要总结傅里叶级数及其复数形式的推导。 Fourier Series 傅里叶级数 傅里叶级数可以把任意的周期函数或周期信号分解为一组(有限个或无限个)简单振荡函数之和(比如sin和cos函数)。 假设f(x)是关于实数x的一个函数,且f(x)的周期为2π,即f(x+2π)=f(x),如果f(x)在区间[−π, π]上可积,则可以将f(x)表示为傅里叶级数的标准形式: f(x) = a0/2 + ∑∞n=1[ancos(nx) + bnsin(nx)] an和bn称为傅里叶系数,分别为: an = (1/π)∫π-πf(x)cos(nx)dx (n ≥ 0) [...]

Fourier Transform 傅里叶变换 (1)

Fourier Transform 傅里叶变换 (1)

最近在看傅里叶变换相关的东西,在此做个笔记,以备后用。第一篇先总结几个基础概念。 本文为原创内容,转载请注明出处。 Euler’s Formula 欧拉公式 eix = cosx + isinx (式中i为虚数单位,即i2=-1) 公式的推导用到泰勒级数,参照 Wikipedia 从结论上讲,即eix等于半径为1,极角为x的复数。 特别地,当x=π时,欧拉公式转化为欧拉恒等式(Euler’s Identity): eiπ = cosπ + [...]

If you’re stuck using Microsoft Visual C++, these tips may help make the experience more pleasant. I’ve been collecting these little tidbits for a while, and decided to collect them in one spot. I’ve chosen to collect them here because I can’t think of a better spot.

First thing, get yourself a copy of Workspace Whiz. Workspace Whiz gives you a nice GUI interface to Exhuberant CTAGS. It also gives you a handy button to switch between the header and source files. It’s cheap ($10), and makes life better.

Read more »

Intel SSE4 Programming Reference.pdf

SSE4多了不少非常有用的指令,可以进一步优化XNAMath

In high school, we learned that some mathematical operations are logically equivalent, as well as rules for transforming operations into easier-to-solve formats. But as programmers, we know that not all forms of a problem are computationally the same, because some can take advantage of particular programming languages or microprocessor features to reduce the clock cycles required for evaluation.

Read more »

C/C++ optimizing compilers are great–but there *are* a few techniques for hand-tuning your code to run as efficiently as possible on the AMD Athlon64 and Opteron processors, especially when developing DLLs, device drivers, or other performance-bound pieces of code.

Read more »

这两天花时间改进了Volumetric Obscurance的算法,并取得了一些成果。暂时先把改进后的算法称为Advanced Volumetric Obscurance。

原VO论文提出了一个非常好的概念 – Line Sample。可惜论文本身却有不少不严谨的推导和错漏,甚至里面给出的关于Line Sample的数学结论也是不严谨的,只是因为多次取样的缘故,效果上的误差变小了而已。另外,在采样次数较少的情况下(比如4 samples),原VO论文的方法在处理高复杂度的场景时效果惨不忍睹(特别是down-sample之后)。所幸从一开始就没有按照论文给出的结论来,只是借鉴了Line Sample这个概念,所以前一篇博文里面得到效果才比较对(其实也有问题)。

这里先贴几张图,具体分析和改进细节待续。
Read more »

Screen Space Ambient Occlusion的改进方法。总结来讲,是对取样统计AO的计算过程做改进,屏幕空间依然做多次取样,但每次取样都在深度方向上直接计算解析解,因此可以用更少的Sample达到比普通SSAO更好的效果。据说CryEngine3也用到了这种方法。
用RenderMonkey实现了一下,效果非常明显,4个Sample就能达到普通SSAO 8个Sample的效果,甚至某些细节还要显得更好。

原始的Parallax Mapping在Normal Mapping基础上,通过高度图和视线计算视差,对texcoord做位移,从而更好地表现凹凸感。而后PM发展出多种“改进”方法,大都是通过多次采样,选取最合适位移来达到更精确的效果,甚至可以表现出遮挡关系。但是每个pixel都需要做n次heightmap采样,效率上并不适合实时渲染。Parallax Occlusion Mapping、Distance Mapping都属于这种。

Read more »

Shadow Mapping已经成为当前3D游戏的标配。传统SM+PCF可以很好地实现日光环境下的Hard Shadow,但如果要实现由昏暗灯光所产生的Soft Shadow,则要么效果过于生硬(sample次数少)要么效率低下(sample次数多)。因此,越来越多的游戏开始使用能够充分利用硬件特性的软阴影算法。
这里主要总结各种Soft Shadow Mapping的算法思想和推导过程,不提及实现上的细节和具体代码,等有空再写写Demo。
本文为原创内容,转载请注明出处。
Read more »

Pages:1234»