2013-04-08 56 views
0

在GLSL着色器中,我需要省略一些鑲嵌補丁以顯着提高性能。這些補丁是每個頂點具有給定世界座標的三角形。但是,當我將這些座標轉換爲視錐體剔除的視圖空間時,會出現誤差。使用視圖矩陣進行遏制剔除

這是原始地形。

terrain

這是錯誤如何影響它的頂部。

terrain broken

這與污垢的截面的特寫鏡頭。

terrain broken

這些錯誤在屏幕的頂部,但也側面和底部namly發生。 這裏是我用來確定是否應該排除三角形(在GLSL中)的代碼。

bool inFrustum(vec3 p,vec3 q,vec3 r) { 
    vec4 Pclip = camera * vec4(p, 1.0f); 
    vec4 Qclip = camera * vec4(q, 1.0f); 
    vec4 Rclip = camera * vec4(r, 1.0f); 
    if(((-Pclip.w>Pclip.x&&-Qclip.w>Qclip.x&&-Rclip.w>Rclip.x)|| (Pclip.x>Pclip.w&&Qclip.x>Qclip.w&&Rclip.x>Rclip.w))|| 
     ((-Pclip.w>Pclip.y&&-Qclip.w>Qclip.y&&-Rclip.w>Rclip.y)||(Pclip.y>Pclip.w&&Qclip.y>Qclip.w&&Rclip.y>Rclip.w))|| 
     ((-Pclip.w>Pclip.z&&-Qclip.w>Qclip.z&&-Rclip.w>Rclip.z)||(Pclip.z>Pclip.w&&Qclip.z>Qclip.w&&Rclip.z>Rclip.w))){ 
    return false; 
    } 
    else{ 
    return true; 
    } 
} 

我將不勝感激任何幫助! Behemyth

回答

1

在我的着色器我用下面的宰殺補丁:

bool visible(vec3 vert) 
{ 
    int clipoffset = 5; //a bit offset because of displacements 
    vec4 p = MVP*vec4(vert,1); 
    return !((p1.x < -(p1.w+clipoffset))|| 
      (p.x > (p.w+clipoffset))|| 
      (p.y < -(p.w+clipoffset))|| 
      (p.y > (p.w+clipoffset))|| 
      (p.z < -(p.w+clipoffset))|| 
      (p.z > (p.w+clipoffset))); 
} 

,它看起來像這樣從上面:enter image description here

PS:我用四邊形曲面細分,所以我檢查的一個頂點是視錐:

if(visible(inPos[0])|| 
      visible(inPos[1])|| 
      visible(inPos[2])|| 
      visible(inPos[3])) 
     { 
      outt[0] = calcTessellationLevel(inPos[3],inPos[0]); 
      outt[1] = calcTessellationLevel(inPos[0],inPos[1]); 
      outt[2] = calcTessellationLevel(inPos[1],inPos[2]); 
      outt[3] = calcTessellationLevel(inPos[2],inPos[3]); 

      inn[1] = (outt[0]+outt[2])/2; 
      inn[0] = (outt[1]+outt[3])/2; 
     } 

編輯:在您的代碼也許是(和)||運營商造成的問題,嘗試不帶括號每秒語句後:

if(S1||S2||S3||S4) 

,而不是

if((S1||S2)||(S3||S4)) 

編輯::嗯....我沒有看過有人問日期,不知道我怎麼樣我發現它.... OO

+1

我很欣賞投入到這篇文章的努力。我無意中通過創建路徑跟蹤渲染器來繞過這個問題。由於這個問題從來沒有真正解決過,所以這個問題與任何問題一樣好。謝謝您的幫助! – Behemyth 2013-12-05 04:43:24