Spherical-Harmonic

本文深入探讨了基于物理的渲染方程,特别是球谐函数在全局照明中的作用。通过球谐函数,可以近似还原复杂的球面光照方程。在Unity中,3阶球谐被用于实现光照探针,简化了光照计算并提供了基本的全局光照效果。文章还介绍了球谐函数的数学原理,并展示了其在实时渲染中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GI

  • 图片来自 Snaps Art HD | School
  • 读本文前请确认掌握了足够的基础
  • 至少达到了入门水平,或者像我一样踏进来半只脚,我是菜逼顺带一提 =_=
  • 上 篇(本文)主要讲解基于与计算辐射度传输技术的全局照明效果,也就是SH
  • 这篇文章很蹩脚,但比上篇好一点,给美术写教程让我感觉我是傻逼
  • 中、下篇有时间会写,写什么再说,但早晚会出
  • 感谢熊大lao

基于物理的渲染方程

  1. 祖传的渲染方程:
    L 0 = L e + ∫ Ω f r ⋅ L i ⋅ ( w i ⋅ n ) ⋅ d w i L_0 = L_e + \int_\Omega f_r \cdot L_i \cdot (w_i \cdot n) \cdot dw_i L0=Le+ΩfrLi(win)dwi
    L 0 L_0 L0 L e L_e Le f r f_r fr L i L_i Li 分别是p点的出射光亮度、发出的光亮度、入射方向到出射方向的反射比例、入射光亮度;
    ( w i ⋅ n ) (w_i \cdot n) (win) 是入射角带了的入射光衰减;
    ∫ Ω . . . d w i \int_\Omega ...dw_i Ω...dwi 是入射方向半球的积分;
  2. 现在,以辐射度的角度重新看一下这个方程
    L ( x , w o ) = L e ( x , w o ) + ∫ s f r ( x , w i → w o ) ⋅ L ( x ′ , w i ) ⋅ G ( x , x ′ ) ⋅ V ( x , x ′ ) ⋅ d w i L(x,w_o) = L_e(x,w_o) + \int_s f_r(x,w_i \rarr w_o) \cdot L(x \rq,w_i) \cdot G(x,x \rq) \cdot V(x,x \rq) \cdot dw_i L(x,wo)=Le(x,wo)+sfr(x,wiwo)L(x,wi)G(x,x)V(x,x)dwi
    L ( x , w o ) L(x,w_o) L(x,wo)表示在位置 x x x上,方向为 w o w_o wo的光线的辐射度;
    L e ( x , w o ) L_e(x,w_o) Le(x,wo)表示位置 x x x上,自发射防线为 w o w_o wo的光线的辐射度;
    f r ( x , w r → w o ) f_r(x,w_r \rarr w_o) fr(x,wrwo)表示位置 x x x上, w i w_i wi(入射方向)到 w o w_o wo(出射方向)的反射比例;
    L ( x ′ , w i ) L(x \rq,w_i) L(x,wi)表示其他物体位置 x ′ x \rq x处,沿 w i w_i wi方向照射过来的光线辐射度;
    G ( x , x ′ ) G(x,x \rq) G(x,x)表示位置 x x x x ′ x \rq x之间的几何关系;
    V ( x , x ′ ) V(x,x \rq) V(x,x)表示位置 x x x x ′ x\rq x之间是否存在遮挡。
    那么,只要能解出入射辐射度值的立体角微分在半球球面上的积分的结果,就可以得到出射辐射度值。
    但是,实时算球面每个点的出射辐射度现在的硬件水平几乎不可能。

球谐函数

  1. 因为光具有波粒二象性的特点,可以将光视为一种电磁波。
    对于各向同性的在均匀介质中传递的电磁波,可以麦克斯韦方程组中推导出波速、电场强度、磁场强度三者建立联系的波动方程。
    { v = 1 u ε ∇ 2 E − 1 v 2 ∂ 2 E ∂ t 2 = 0 ∇ 2 H − 1 v 2 ∂ 2 H ∂ t 2 = 0 \begin{cases} v = \cfrac{1}{\sqrt {u \varepsilon}} \\ \nabla ^2 E - \cfrac{1}{v^2} \cfrac{\partial ^2 E}{\partial t^2} = 0 \\ \nabla ^2 H - \cfrac{1}{v^2} \cfrac{\partial ^2 H}{\partial t^2} = 0 \\ \end{cases} v=uε 12Ev21t22E=02Hv21t22H=0
    因为是近似,再加上磁场的作用比电场弱的多,可以进一步砍成:
    { v = 1 u ε ∇ 2 E − 1 v 2 ∂ 2 E ∂ t 2 = 0 \begin{cases} v = \cfrac{1}{\sqrt {u \varepsilon}} \\ \nabla ^2 E - \cfrac{1}{v^2} \cfrac{\partial ^2 E}{\partial t^2} = 0 \\ \end{cases} v=uε 12Ev21t22E=0

  2. 现在,电场强度矢量 E E E用符号 f f f表示;因为咱们是在球面坐标系算,所以先将拉普拉斯方程转换到球面坐标。
    1 r 2 ∂ ∂ r ( r 2 ∂ f ∂ r ) + 1 r 2 s i n θ ∂ ∂ θ ( s i n θ ∂ f ∂ θ ) + 1 r 2 s i n 2 θ ∂ 2 f ∂ φ 2 = 0 \cfrac{1}{r^2} \cfrac{\partial }{\partial r}(r^2 \cfrac{\partial f}{\partial r}) + \cfrac{1}{r^2 sin \theta} \cfrac{\partial }{\partial \theta}(sin \theta \cfrac{\partial f}{\partial \theta}) + \cfrac{1}{r^2 sin ^2 \theta} \cfrac{\partial ^ 2 f}{\partial \varphi ^ 2} = 0 r21r(r2rf)+r2sinθ1θ(sinθθf)+r2sin2θ1φ22f=0
    利用分离变量法可以分解成多个常微分方程,即使 f ( r , θ , φ ) = R ( r ) Φ ( θ ) Φ ( φ ) f(r,\theta,\varphi) = R(r)\Phi(\theta)\Phi(\varphi) f(r,θ,φ)=R(r)Φ(θ)Φ(φ)
    两边同时乘 r 2 Y R \cfrac{r^2}{YR} YRr2,可以得到
    1 R d d r ( r 2 d R d r ) = − 1 Y s i n θ ∂ ∂ θ ( s i n θ ∂ Y ∂ θ ) − 1 Y s i n 2 θ ∂ 2 Y ∂ φ 2 = l ( l + 1 ) \cfrac{1}{R} \cfrac{d }{d r}(r^2 \cfrac{d R}{d r}) = - \cfrac{1}{Y sin \theta} \cfrac{\partial }{\partial \theta}(sin \theta \cfrac{\partial Y}{\partial \theta}) - \cfrac{1}{Y sin ^2 \theta} \cfrac{\partial ^ 2 Y}{\partial \varphi ^ 2} = l(l+1) R1drd(r2drdR)=Ysinθ1θ(sinθθY)Ysin2θ1φ22Y=l(l+1)
    我们利用常数项将左右分离为两个式子,再对同时包含 θ \theta θ φ \varphi φ的一边进一步分离
    s i n θ Θ d d θ ( s i n θ d Θ d θ ) + l ( l + 1 ) s i n 2 θ = − 1 Θ d 2 Θ d φ 2 = m 2 \cfrac{sin \theta}{\Theta} \cfrac{d}{d \theta}(sin \theta \cfrac{d \Theta}{d \theta}) + l(l+1)sin ^2 \theta = - \cfrac{1}{\Theta} \cfrac{d^2 \Theta}{d \varphi ^2} = m^2 Θsinθdθd(sinθdθdΘ)+l(l+1)sin2θ=Θ1dφ2d2Θ=m2
    最后我们可以拆成
    { d d r ( r 2 d R d r ) − l ( l + 1 ) R = 0 d 2 Φ d φ 2 + m 2 Φ = 0 s i n θ d d θ ( s i n θ d Θ d θ ) + [ l ( l + 1 ) s i n 2 θ − m 2 ] Θ = 0 \begin{cases} \cfrac{d}{dr} (r^2 \cfrac{dR}{dr}) - l(l + 1)R = 0 \\ \cfrac{d ^2 \Phi}{d \varphi ^2} + m^2 \Phi = 0\\ sin \theta \cfrac{d}{d \theta}(sin \theta \cfrac{d \Theta}{d \theta}) + [l(l + 1)sin^2 \theta - m^2] \Theta = 0 \\ \end{cases} drd(r2drdR)l(l+1)R=0dφ2d2Φ+m2Φ=0sinθdθd(sinθdθdΘ)+[l(l+1)sin2θm2]Θ=0
    前两个可以说是白给,可以很容易算出解为:
    R ( r ) = C r l + D r l + 1 R(r) = Cr^l + \cfrac{D}{r ^ {l + 1}} R(r)=Crl+rl+1D , l = 0 , 1 , 2 , . . . , C 、 D 为 常 数 l = 0,1,2,...,C、D为常数 l=0,1,2,...,CD
    Φ ( φ ) = e i m φ \Phi (\varphi)= e^{im\varphi} Φ(φ)=eimφ
    第三个比较麻烦,需要利用到勒让德,因为我觉得大家也应该没学过吧,反正我以前都没听说过。。关于勒让德可以在下面的文章中了解

    https://ccjou.wordpress.com/2012/02/20/legendre-%E5%A4%9A%E9%A0%85%E5%BC%8F/
    https://en.wikipedia.org/wiki/Associated_Legendre_polynomials
    http://silviojemma.com/public/papers/lighting/spherical-harmonic-lighting.pdf

    首先令 x = c o s θ x = cos \theta x=cosθ, y ( x ) = Θ ( θ ) y(x) = \Theta(\theta) y(x)=Θ(θ),则有
    d Θ ( θ ) d θ = d y d x d x d θ = − s i n θ d y d x = ( 1 − x 2 ) d d x [ ( 1 − x 2 ) d y d x ] \cfrac{d \Theta(\theta)}{d \theta} = \cfrac{d y}{dx}\cfrac{dx}{d \theta} = -sin \theta \cfrac{dy}{dx} = (1-x^2) \cfrac{d}{dx}[(1-x^2) \cfrac{dy}{dx}] dθdΘ(θ)=dxdydθdx=sinθdxdy=(1x2)dxd[(1x2)dxdy]
    带入到第三个式子中,可以得到 m m m阶连带勒让德方程
    d d x [ ( 1 − x 2 ) d y d x ] + [ 1 ( l + 1 ) − m 2 ( 1 − x 2 ) ] y = 0 \cfrac {d}{dx}[(1-x^2) \cfrac{dy}{dx}] + [1(l+1) - \cfrac{m^2}{(1-x^2)}]y = 0 dxd[(1x2)dxdy]+[1(l+1)(1x2)m2]y=0
    m = 0 m=0 m=0时,此方程退化为勒让德方程
    d d x [ ( 1 − x 2 ) d y d x ] + [ 1 ( l + 1 ) ] y = 0 \cfrac {d}{dx}[(1-x^2) \cfrac{dy}{dx}] + [1(l+1)]y = 0 dxd[(1x2)dxdy]+[1(l+1)]y=0
    y y y写为 P l m ( x ) P^m_l(x) Plm(x),上式可解为
    P l 0 ( x ) = 1 2 l l ! d l d x l ( x 2 − 1 ) l , l ∈ [ 0 , ∞ ] P^0_l(x) = \cfrac{1}{2^ll!} \cfrac{d^l}{dx^l} (x^2 - 1)^l,l \in [0,\infin] Pl0(x)=2ll!1dxldl(x21)l,l[0,]
    那么上文中 m m m阶连带勒让德方程可以解为
    { P l m ( x ) = ( − 1 ) m 2 l l ! ( 1 − x 2 ) m 2 d l + m d x l + m ( x 2 − 1 ) l , l ∈ N , l ∈ [ 0 , ∞ ] P l − m ( x ) = ( − 1 ) m ( l − m ) ! ( l + m ) ! P l m ( x ) , m < 0 , l ∈ [ 0 , ∞ ] (1) \begin{cases} \tag{1} P^m_l(x) = \cfrac{(-1)^m}{2^ll!} (1 - x^2)^\cfrac{m}{2} \cfrac{d^{l + m}}{dx^{l + m}} (x^2 - 1)^l, l \in N,l \in [0,\infin] \\ P^{-m}_l(x) = (-1)^m \cfrac{(l - m)!}{(l + m)!} P^m_l(x), m<0,l \in[0,\infin] \end{cases} Plm(x)=2ll!(1)m(1x2)2mdxl+mdl+m(x21)l,lN,l[0,]Plm(x)=(1)m(l+m)!(lm)!Plm(x),m<0,l[0,](1)
    用伴随勒让德多项式定义函数 Θ ( θ ) \Theta (\theta) Θ(θ)
    Θ ( θ ) = P l m ( c o s θ ) , l ∈ N , l ≥ ∣ m ∣ (2) \tag{2} \Theta(\theta) = P^m _l(cos \theta), l \in N,l\geq |m| Θ(θ)=Plm(cosθ),lNlm(2)
    所以球谐表达式克表示为
    Y l m ( θ , φ ) = K l m Φ ( φ ) Θ ( θ ) = K l m e i m φ P l m ( c o s θ ) , l ∈ N , m = 0 , ± 1 , ± 2 , . . . ,   ± l (3) \tag{3} Y^m_l(\theta, \varphi) = K^m_l \Phi(\varphi) \Theta(\theta) = K^m_l e^{im \varphi} P^m_l (cos \theta), l \in N,m=0, \pm 1,\pm 2, ... , \ \pm l Ylm(θ,φ)=KlmΦ(φ)Θ(θ)=KlmeimφPlm(cosθ),lN,m=0,±1,±2,..., ±l(3)
    K l m K^m_l Klm为归一化因子,归一化后,关于l和m的球谐函数 Y l m Y^m_l Ylm可以表示为:
    Y l m ( θ , φ ) = ( − 1 ) m ( 2 l + 1 ) 4 π ( l − ∣ m ∣ ) ! ( l + ∣ m ∣ ) ! P l m ( c o s θ ) e i m φ Y^m_l(\theta, \varphi) = (-1)^m \sqrt{ \cfrac{(2l + 1)}{4 \pi} \cfrac{(l-|m|)!}{(l+|m|)!}}P^m_l (cos \theta)e^{im \varphi} Ylm(θ,φ)=(1)m4π(2l+1)(l+m)!(lm)! Plm(cosθ)eimφ


球谐光照

  1. 众所周知,一个原始信号波可以由一系列带有缩放因子的简谐波叠加而成,而球谐光照的核心就是球面亮度信号编码和重建。
    O ( x ) ≈ O ~ ( x ) = ∑ i = 1 n c i B i ( x ) (4) \tag{4} O(x) \approx \tilde{O}(x) = \sum ^n_{i=1} c_iB_i(x) O(x)O~(x)=i=1nciBi(x)(4)
    为此,我们需要基函数和缩放因子。
  2. 球谐光照中使用的球谐函数序列是一组正交基函数,而且在应用于渲染时,通常采用实数值的球谐,结合(1)(2),基于球面坐标系下的实数球谐函数可定义如下:
    Y l m ( θ , φ ) = { 2 K l m P l − m ( c o s θ ) s i n ( − m φ ) , 当 m < 0 时 K l m P l m ( c o s θ ) , 当 m = 0 时 2 K l m P l m ( c o s θ ) s i n ( m φ ) , 当 m > 0 时 (基函数) \tag{基函数} Y^m_l(\theta,\varphi) = \begin{cases} \sqrt{2} K^m_l P^{-m}_l (cos \theta) sin(-m \varphi) , &当 m < 0时\\ K^m_l P^m_l (cos \theta) , &当 m = 0时\\ \sqrt{2} K^m_l P^m_l (cos \theta) sin(m \varphi) , &当 m > 0时\\ \end{cases} Ylm(θ,φ)=2 KlmPlm(cosθ)sin(mφ),KlmPlm(cosθ),2 KlmPlm(cosθ)sin(mφ),m<0m=0m>0()
    有了正交基函数,便可以将原始的函数改用球谐基函数进行近似替代。
    假设原始函数为 g ( s ) g(s) g(s), s s s是关于球面坐标系的天顶角 θ \theta θ和方位角 φ \varphi φ 的函数,作为基函数 Y l m ( θ , φ ) Y^m_l(\theta,\varphi) Ylm(θ,φ)的可以改成 Y l m ( s ) Y^m_l(s) Ylm(s),投影后的近似函数为 g ~ ( s ) \tilde{g}(s) g~(s)
    因为正交基函数的对偶函数便是它自身,所以加权系数 c l m c^m_l clm
    c l m = ∫ S g ( s ) Y l m ( s ) d s (加权系数) \tag{加权系数} c^m_l = \int_S g(s) Y^m_l (s)ds clm=Sg(s)Ylm(s)ds()
    结合 ( 4 ) (4) (4),可得到投影后的近似函数 g ~ ( s ) \tilde{g}(s) g~(s)
    g ~ ( s ) = ∑ l = 0 l m a x ∑ m = − l l c l m Y l m ( s ) \tilde{g}(s) = \sum ^{lmax}_{l = 0} \sum ^{l}_{m=-l} c^m_l Y^m_l(s) g~(s)=l=0lmaxm=llclmYlm(s)
    现在通过 i = l 2 + l + m i = l^2 + l + m i=l2+l+m,映射 l , m l,m l,m
    c i = ∫ S g ( s ) Y i ( s ) d s c_i = \int_S g(s) Y_i (s)ds ci=Sg(s)Yi(s)ds
  3. 通过概率密度函数和随机样本进一步估算,也就是蒙特卡洛估算法
    上式可近似为
    c i = 4 π N ∑ j = 0 N g ( s j ) Y i ( s j ) c_i = \cfrac{4 \pi}{N} \sum ^{N}_{j = 0} g(s_j) Y_i (s_j) ci=N4πj=0Ng(sj)Yi(sj)

还原球面上的光照方程

L ( x , w o ) = L e ( x , w o ) + ∫ s f r ( x , w i → w o ) ⋅ L ( x ′ , w i ) ⋅ G ( x , x ′ ) ⋅ V ( x , x ′ ) ⋅ d w i L(x,w_o) = L_e(x,w_o) + \int_s f_r(x,w_i \rarr w_o) \cdot L(x \rq,w_i) \cdot G(x,x \rq) \cdot V(x,x \rq) \cdot dw_i L(x,wo)=Le(x,wo)+sfr(x,wiwo)L(x,wi)G(x,x)V(x,x)dwi
1. 对于漫反射表面,各个方向上反射光线相同,所以可以吧 f r ( x , w i → w o ) f_r(x,w_i \rarr w_o) fr(x,wiwo),替换为常数 k k k.
2. 如果现在不关心AO的话, V ( x , x ′ ) V(x,x \rq) V(x,x),可替换为1。
3. L ( x ′ , w i ) ⋅ G ( x , x ′ ) L(x \rq,w_i) \cdot G(x,x \rq) L(x,wi)G(x,x)则用球谐函数替代。
4. 假设当前物体不存在自发光。
那么现在,我们可以把光照方程写为:
L ( x , w o ) ≈ ∑ l = 0 l m a x ∑ m = − l l C l m L C l m G Y l m L(x,w_o) \approx\sum ^{lmax}_{l = 0} \sum ^{l}_{m=-l} \stackrel{L}{C^m_l} \stackrel{G}{C^m_l} Y^m_l L(x,wo)l=0lmaxm=llClmLClmGYlm


Unity中的球谐

  1. 在Lit中
    因为 i = l 2 + l + m i = l^2 + l + m i=l2+l+m,所以 l l l值越大,咱们需要的系数和基函数数量越大。
    unity中使用了3阶球谐,即 l l l取值为{0,1,2}。
    所以球谐函数的系数共有9个,Unity用7个float4存储9*3(RGB)个数字。

    下面的代码是简化过的,实际buffer里绝不可能就这几行

    CBUFFER_START(UnityPerDraw)
    float4 unity_SHAr, unity_SHAg, unity_SHAb;
    float4 unity_SHBr, unity_SHBg, unity_SHBb;
    float4 unity_SHC;
    CBUFFER_END
    

    假设当前片段受到光照探针的影响

    CBUFFER_START(UnityProbeVolume)
    float4 unity_ProbeVolumeParams;
    CBUFFER_END
    

    如果unity_ProbeVolumeParams.x == 0,那么当前采用的是常规探针而不是LPPV
    现在,我们的光照探针采样函数可以写为

    float3 SampleLightProbes (LitSurface s) {
    	if (unity_ProbeVolumeParams.x) {
    		//这种情况,涉及到一些其他因素,在这里先不做解释
    		return LPPVSampleValue;
    	}
    	else {
    		float4 coefficients[7];
    		coefficients[0] = unity_SHAr;
    		coefficients[1] = unity_SHAg;
    		coefficients[2] = unity_SHAb;
    		coefficients[3] = unity_SHBr;
    		coefficients[4] = unity_SHBg;
    		coefficients[5] = unity_SHBb;
    		coefficients[6] = unity_SHC;
    		return max(0.0, SampleSH9(coefficients, s.normal));
    	}
    }
    

    将采样结果*diffuse叠加到color上

     color.rgb += SampleLightProbes (LitSurface s) * surface.diffuse;
    
  2. SampleSH9
    实际上,就是在做分量和系数相乘之后的叠加

    float3 SampleSH9(float4 SHCoefficients[7], float3 N)
    {
        float4 shAr = SHCoefficients[0];
        float4 shAg = SHCoefficients[1];
        float4 shAb = SHCoefficients[2];
        float4 shBr = SHCoefficients[3];
        float4 shBg = SHCoefficients[4];
        float4 shBb = SHCoefficients[5];
        float4 shCr = SHCoefficients[6];
    
        float3 res = SHEvalLinearL0L1(N, shAr, shAg, shAb);
        res += SHEvalLinearL2(N, shBr, shBg, shBb, shCr);
    
        return res;
    }
    real3 SHEvalLinearL0L1(real3 N, real4 shAr, real4 shAg, real4 shAb)
    {
        real4 vA = real4(N, 1.0);
        real3 x1;
        
        x1.r = dot(shAr, vA);
        x1.g = dot(shAg, vA);
        x1.b = dot(shAb, vA);
    
        return x1;
    }
    real3 SHEvalLinearL2(real3 N, real4 shBr, real4 shBg, real4 shBb, real4 shC)
    {
        real3 x2;
        real4 vB = N.xyzz * N.yzzx;
        
        x2.r = dot(shBr, vB);
        x2.g = dot(shBg, vB);
        x2.b = dot(shBb, vB);
    
        real vC = N.x * N.x - N.y * N.y;
        real3 x3 = shC.rgb * vC;
    
        return x2 + x3;
    }
    

    SHEvalLinearL0L1比较简单, l 0 , L 1 l_0,L_1 l0,L1一共四项,换换系数顺序,rgb一一对应,妙啊。
    SHEvalLinearL2中
    real4 vB = N.xyzz * N.yzzx;构造出了 l = 2 l=2 l=2时,前四项多项式中的xy,yz,z^2,xz;
    real vC = N.x * N.x - N.y * N.y; 则构造了 l = 2 , m = 2 l=2,m=2 l=2,m=2时球谐系数的 x^2 - y^2,最后一项单独算。

  3. 还记得上文中启用LPPV的情况吗
    在这种情况下,我们需要预计算计算产生的Texture3D中取得各个分量的球谐系数

    float3 SampleProbeVolumeSH4(
    TEXTURE3D_PARAM(SHVolumeTexture, SHVolumeSampler), 
    float3 positionWS, float3 normalWS,
    float4x4 WorldToTexture,float transformToLocal, 
    float texelSizeX, float3 probeVolumeMin, 
    float3 probeVolumeSizeInv)
    {
        float3 position = (transformToLocal == 1.0) ? mul(WorldToTexture, float4(positionWS, 1.0)).xyz : positionWS;
        
        float3 texCoord = (position - probeVolumeMin) * probeVolumeSizeInv.xyz;
        texCoord.x = clamp(texCoord.x * 0.25, 0.5 * texelSizeX, 0.25 - 0.5 * texelSizeX);
    
        float4 shAr = SAMPLE_TEXTURE3D_LOD(SHVolumeTexture, SHVolumeSampler, texCoord, 0);
        texCoord.x += 0.25;
        float4 shAg = SAMPLE_TEXTURE3D_LOD(SHVolumeTexture, SHVolumeSampler, texCoord, 0);
        texCoord.x += 0.25;
        float4 shAb = SAMPLE_TEXTURE3D_LOD(SHVolumeTexture, SHVolumeSampler, texCoord, 0);
        
        return SHEvalLinearL0L1(normalWS, shAr, shAg, shAb);
    }
    

    首先,归一化了纹理映射的坐标;
    之后是一些缩放和偏移,这是因为纹理映射坐标按照RGB分段压缩到0.25一个分段中了;
    采到颜色信息之后,还是走SHEvalLinearL0L1。

  4. 一个非常非常low的GI效果展示,只是为了展示经过上面那波操作探针生效了,效果很微妙
    在这里插入图片描述


写在最后

  • 我的毕设是一个游戏,是一个多人跨学校联合毕设,得想个办法把它做的牛逼一点
  • 正在写一个 Forward+ RP,空闲时间写着玩,然而一直没啥时间
  • 虽然没时间不是理由,但是我有更重要的事情要做
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值