2013-04-08 61 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