沮丧与视图矩阵剔除

时间:2013-04-08 18:24:41

标签: matrix glsl frustum culling

在GLSL着色器中,我需要省略一些曲面细分补丁以大幅提高性能。这些贴片是具有每个顶点的给定世界坐标的三角形。但是,当我将这些坐标转换为视锥空间进行视锥体剔除时,存在误差范围。

这是原始地形。

terrain

这就是错误在顶部影响它的方式。

terrain broken

这是一个有污垢的部分的特写。

terrain broken

这些错误在屏幕顶部附近发生,但也发生在侧面和底部。 这是我用来确定是否应该排除三角形的代码(在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 个答案:

答案 0 :(得分: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))
编辑::嗯......我没有看过被问到的日期,也不知道我是怎么找到它的...... O.o

相关问题