【问题标题】:Frustum Culling With View Matrix使用视图矩阵进行截锥剔除
【发布时间】:2013-04-08 18:24:41
【问题描述】:

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

这是原始地形。

这就是错误对顶部的影响。

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

这些错误不仅发生在屏幕顶部,而且也发生在屏幕的侧面和底部。 这是我用来确定是否应该排除三角形的代码(在 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;
    }
}

我将不胜感激任何帮助! 巨兽

【问题讨论】:

    标签: matrix glsl frustum culling


    【解决方案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)));
    }
    

    从上面看是这样的:

    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

    【讨论】:

    • 我很感激为这篇文章付出的努力。我无意中通过创建路径跟踪渲染器绕过了这个问题。由于我的问题从未真正解决,因此这个问题与任何问题一样好。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多