• Home
  • About
    • 黑脸包公 photo

      黑脸包公

      书山有路勤为径,学海无涯苦作舟.

    • Learn More
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

光线计算

20 Mar 2019

Reading time ~1 minute

颜色运算

颜色加法

```math C_{sum} = C_1 + C_2 = (MIN(r1+r2, 255), MIN(g1+g2, 255), MIN(b1+b2,255)) ```

颜色调制

```math C_{modulated}=s*C_1 = (s*r1,s*g1,s*b1) ```

其中s应该被约束在最大值不超过255,否则会发生颜色改变

```math C_{modulated}=C_1*C_2=(r_1*r_2,g_1*g_2,b_1*b_2) ```

按照光映射的工作原理,C1应该被约束在(0~1,0~1,0~1),这样结果将不会溢出。

光照纹理:LIGHT_TEXTURE[x][y]

颜色纹理:COLOR_TEXTURE[x][y]

alpha混合

对两个源像素按照alpha比例进行混合

```math Pixel_{dest}[x,y]_{rgb} = Pixel_{s1}[x,y]_{rgb} * alpha + Pixel_{s2}[x,y]_{rgb}*(1-alpha) ```

环境光

对于表面S上的一个点,反射的环境光强度为:

```math I_{total-a}=R_{S_{ambient}} * I_{ambient} ```

反射色为浮点RGB

total-a中a是一个光类型表示,此处a表示环境光

散射光

一束光照到表面S后将向所有方向散射出去,强度取决于表面和光源之间的相对角度

散射光强度与面法线和光源向量之间的夹角余弦成正比

漫反射也被称为Lambertian反射

我们假设没中表面材质都有特定的漫反射颜色(浮点RBG)

```math R_{s_{diffuse}} ```

单光源的散射光照方程如下 n:法线向量,l光源向量

```math I_{total-d} = R_{s_{diffuse}} * I_{diffuse} * ( n · l) ```

加入散射项后,单光源光照模型如下

```math I_{total-ad} = R_{S_{ambient}} * I_{ambient} + [R_{s_{diffuse}} * I_{diffuse} * ( n · l)] ```

在多光源下。只需要将每个光源的散射累计起来

```math I_{total-ad} = R_{S_{ambient}} * I_{ambient} + R_{s_{diffuse}} * \sum_{i=1}^{n}{[I(i)_{diffuse} * ( n_i · 1_i)]} ```

镜面反射光

Phong光照模型,另外通过差值计算法线来计算着色时被称为Phong着色。

物体表面光洁度常量specularity

定义一个反射系数

```math R_{s_{specular}} ```

光照强度

```math I_{specular} ```

镜面反射指数(specular exponent),决定了镜面反射区域大小,称之为sp

这样,单光源反射光照方程如下,r:反射向量,v:观察向量

```math I_{total-s}=R_{s_{specular}} * I_{specular} * MAX(r·v,0)^{sp} ```

光照向量和法线夹角必须小于90度,可以在上面的方程再乘以

```math [(n·l)>0?1:0] ```

多光源下

```math I_{total-s}=R_{s_{specular}} * \sum_{i=1}^{n}{[I(i)_{specular} * MAX(r_i·v_i,0)^{sp}*[(n_i·l_i)>0?1:0]]} ```

发射光

```math I_{total-e} = R_{S_{emission}} ```

综上

```math I_{total-aeds} = I_{total-a} + I_{total-e} + I_{total-d} + I_{total-s} ```

float numFrames = XYFrames*XYFrames; float accumdist = 0; float StepSize = 1/MaxSteps; for(int i = 0;i<MaxSteps,i++) { float cursample = PseudoVolumeTexture(Tex,TexSample,saturate(CurPos),XYFrames,numFrames)r, accumdist+= cursample*StepSize, CurPos+= -CamVec*StepSize, } return accumdist,



Share Tweet +1