Unity之基於光線投射演算法的體渲染技術(二)

2021-09-10 05:51:58 字數 1152 閱讀 7575

接上文

第二種光線投射演算法的實現,基於光線起點(相機位置)。將相機位置由世界座標通過模型檢視投影矩陣反變換到長方體的區域性座標空間。每個fragment的座標作為光線的入射點,由變換後的相機位置與光線入射點確定光線的方向,在沿著光線方向從入射點前進時,每到達乙個新的點,判斷其是否在長方體內,如果在,就記錄該點畫素資訊,如果不在,則結束這條光線。與上文本質是一樣的,演算法實現上有些差異(需要逐點判斷,比較花費時間);

核心shader**(這裡額外加入了blinn-phong光照模型來加強顯示效果):

shader "custom/raycast"

subshader

pass

; struct v2f ;

sampler3d data3d;

float maxsamples;

float maxslices;

float4 _color;

float _value;

float shiness;

inline half maxrgb(half3 rgb)

fixed cubeintersection(float3 origin, float3 direction, float3 aabbmax, float3 aabbmin, out float tnear, out float tfar)

half4 getcolor(float3 pos)

data=float4(data.rgb,1);

return saturate(data);

}//通過rgb的變化梯度來計算法線

float3 getgradient(float3 pos)

//blinn-phong光照模型

float4 shadinglight(float4 color, float3 g, float3 v, float3 l)

v2f vert(u2v v)

half4 frag(v2f i) : color

}return dst*_color;

}endcg

} }fallback "diffuse"

}

體繪製之光線投射演算法(附原始碼)

一 原理 levoy在1988年提出了光線投射 ray casting 演算法 1 其基本原理是 從螢幕上每乙個畫素點出發,沿著視線方向發射出一條光線,當這條光線穿過體資料時,沿著光線方向等距離取樣,利用插值計算出取樣點的顏色值和不透明度 接著按照從前到後或從後到前的順序對光線上的取樣點進行合成,計...

基於層次包圍盒的光線追蹤渲染加速演算法

光線追蹤的效率問題一直以來都是關注的焦點,因為很多時候都會有非常多的求交運算要執行。目前幾乎所有的加速演算法都是儘量減少求交運算量,比如octree kd tree 包圍盒 及層次包圍盒 等。基於空間分割的演算法最重要的就是如何有效地分隔空間,讓場景細節和主體脫離 劃分在不同的層次中 層次包圍盒對空...

基於egret的點光源光線效果的實現

先上效果圖 白色區域為光線區域,黑色區域為陰影區域,光源可以自定義座標,同時可以新增位圖作為光源樣式。實現主要包含兩個函式,乙個是計算光源產生的射線與個圖形相交的座標,乙個用於繪製圖形 getintersection ray,segment var t2 r dx s py r py r dy r ...