Culling

O Culling (recorte) é o descarte de pixels desnecessários antes do término do pipeline. Sua principal utilidade é propiciar ganhos cmputacionais, pois evita-se a realização de cálculos matemático, podendo-se utilizar a economia de processamento e calculo dos pixels descartados no processamento dos demais pixels da cena.Há duas espécies de recorte realizadas pelas APIs gráficas comumemente, o culling de faces (backface culling) e o frustum culling.

Culling de faces

O culling de faces é o mais simples de se entender. Esta espécie de culling é dada pelo descarte de primitivos que apresentam um determinado tipo de orientação (horário ou antihorára). Sua base é a de que se primitivos que são visiíveis para a câmera apresentam ordem horário, os primitivos de ordem antihorária comporiam a face de trás dos objetos e portanto não precisariam ser renderizados. O mesmo valeria se os primitivos visíveis estivessem em ordem antihorária e os invisíveis (parte de trás) em ordem horária.

Frustum culling

O frustum é o volume de visualização de uma cena. Consequentemente, os pixels que não estão contidos no volume de visualização não são visíveis ao observador da cena e podem ser seguramente descartados. A este descarte se dá o nome de frustum culling.
O Frustum culling na sua forma mais simples se dá através da multiplicação da coordenada do vértice com a matriz resultante das transformações do mundo, visão e projeção. Caso alguma coordenada do novo vetor que representa o vértice esteja fora do alcance [-1, 1] (DirectX) significa que o ponto não é mais visivel e pode ser descartado. Contudo há outras maneiras de se realizar o frustum culling com o intuito de acelerá-lo, sendo a mais simples envolver malhas complexas 3D com geometrias simples (envoltórios), que tem um teste de visibilidade mais rápido.

Exemplo

Por padrão o Culling em OpenGL é desabilitado. Para habilitá-lo deve-se invocar a seguinte linha:

    glEnable( GL_CULL_FACE );

Quando habilitado o culling o OpenGL assume o culling da face da trás como padrão e determina que primitivos com orientação horária são os que formam a face de trás. Esta configuração poderia ter sido feita explícita pelo código acima o que resultaria no seguinte código:

    glEnable( GL_CULL_FACE );
    glCullFace( GL_BACK );
    glFrontFace( GL_CCW );
flickr:5875252552

Culling de um triângulo colocado para GL_BACK

flickr:5875252628

Culling do mesmo triângulo colocado para GL_FRONT

Baixar o exemplo: http://www.4shared.com/file/PvCXORlW/Culling.html

Links

http://www.videotutorialsrock.com/opengl_tutorial/backface_culling/video.php Tutorial em video sobre backface culling
http://www.opengl.org/wiki/Face_Culling Como funciona o backface culling

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.