Удаление усадьбы с помощью матрицы обзора

В шейдере GLSL мне нужно опустить несколько патчей тесселяции, чтобы резко повысить производительность. Эти участки представляют собой треугольники с заданными мировыми координатами для каждой вершины. Однако, когда я конвертирую эти координаты в пространство просмотра для отсечения усеченного конуса, есть предел погрешности.

Это оригинальная местность.

terrain

Вот так и влияет ошибка наверху.

местность разбита

Это крупный план участка с грязью.

местность разбита

Эти ошибки возникают не только в верхней части экрана, но и по бокам и внизу. Вот код, который я использую, чтобы определить, следует ли исключить треугольник (в 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;
    }
}

Буду очень признателен за любую предоставленную помощь! Бегемиф


person Behemyth    schedule 08.04.2013    source источник


Ответы (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))

РЕДАКТИРОВАТЬ :: хммм .... Я не смотрел дату, когда его спросили, не знаю, как я его нашел .... Оу

person David Szalai    schedule 03.12.2013
comment
Я ценю усилия, вложенные в этот пост. Я непреднамеренно обошел эту проблему, создав средство визуализации трассировки пути. Поскольку проблема с моей стороны так и не была решена по-настоящему, этот вопрос является таким же хорошим ответом, как и любой другой. Спасибо за помощь! - person Behemyth; 05.12.2013