3D紋理展示方式之RayMarch(光線投射)(glsl源碼說明)

Demo:http://www.artvily.com/renderCase?sample=tex3DRayMarch

3D紋理在基於volume rendering的渲染機制的相關應用中有着廣泛的應用。應用的領域非常廣泛,例如考古、醫學、材料科學,遊戲等等。
一般來說3D紋理,可以理解爲具有三個維度(width,height,depth)的數據類似於三維數組。一般的2D紋理我們可以認爲它就是一張圖片(實際就是一段內存(主內存和顯存)中的數據), 那麼3D紋理可以理解爲在depth維度疊在一起的若干張圖。那麼描述3D紋理數據的大小就是width*height*depth * stride,這個stride具體要看你用多少個字節來表示3D紋理數據中的一個(voxel)。在片段着色器中訪問的時候使用(s,t,r)或者(x,y,z)紋理空間座標,採樣器就會依據你自定義的NEAREST或者LINEAR來獲得插值結果->當前片段通過紋理座標(x,y,z)對應得到的紋理數據。這個數據可以可以直接展示出來也可以作爲其他計算的輸入數據例如光照或者體積光/霧/流體等。

上圖是使用 ray march(光線投射)機制,來獲得片段對應的3D紋理數據。先看片段着色代碼:

// es3 glsl shader code
vec4 color4 = vec4(0.0);
// 光線步進值
float stepDis = 5.0;
float dis = 0.0;
vec3 pv;
for(int i = 0; i < 100; ++i)
{
    // 計算當前光線到達位置的空間座標,v_ray是光線前進方向的單位矢量,v_pos是當前最靠近攝像機近平面的片段的空間座標
    pv = v_pos + v_ray * dis;
    // 由片段在對應空間的(x,y,z)座標計算得到(s,t,r)紋理空間座標
    pv.xyz /= 405.0;
    // 獲取3D紋理的對應值
    color4.w = texture(u_samper3D, pv).x;
    // 制定閾值
    if(color4.w > 0.6)
    {
        break;
    }
    // 光線前進一步 
    dis += stepDis;
}
if(color4.w < 0.6) discard;
// 下面兩行是計算一個片段顏色
color4.xy = pv.xy;
color4.xyz *= u_color.xyz;
// 片段輸出結果
OutputColor = color4;

上述代碼展示了ray march 機制。shader toy上很多樣例都是用這個機制做的。

更多我這裏使用的ray march機制demo請見: https://blog.csdn.net/vily_lei/article/category/8083293

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章