Qual é o objetivo do glScissor?

32

Sei que é mais eficiente que o teste de estêncil, mas estou certo, assumindo que a mesma funcionalidade possa ser alcançada usando transformações de projeção com viewport?

Kimi
fonte

Respostas:

46

Eles são mais complementares do que alternativas entre si. Você quase sempre deseja definir o retângulo da tesoura com os mesmos valores da viewport.

glViewport () especifica uma transformação do espaço de projeção normalizado no espaço da tela. Os polígonos são cortados na borda do espaço de projeção, mas outras operações de desenho como glClear () não são. Portanto, você usa glViewport () para determinar o local e o tamanho da região da janela de visualização do espaço da tela, mas o rasterizador ainda pode ocasionalmente renderizar pixels fora dessa região.

É aí que entra a tesoura. GlScissor () define um retângulo de espaço na tela além do qual nada é desenhado (se o teste de tesoura estiver ativado).

Por exemplo, o código a seguir limpará a tela inteira, mesmo que a janela de exibição esteja configurada para uma pequena parte da janela maior:

glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);

Adicionar glScissor () e ativar o teste de tesoura (que está desativado por padrão) restringe a limpeza.

glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

Ocasionalmente, você encontra uma implementação que se move automaticamente para a região da janela de exibição, mas que viola a especificação GL.

Além disso, o retângulo de tesoura pode ser usado para restringir temporariamente o desenho a um sub-retângulo da janela de exibição, para efeitos especiais, elementos da interface do usuário etc.

pós-bomismo
fonte
11
para ficar mais claro, Viewportrecorta os cálculos de vértice. Se você desenhar uma linha com espessura de linha> 1 ou um ponto com gl_PointSize> 1, também desenhará fora da janela de exibição.
Gman
13

Eles operam em duas partes completamente diferentes do pipeline gráfico.

O glViewport na verdade especifica uma transformação, e é uma transformação que ocorre após o shader de vértice, mas antes do shader de fragmento. Se ajudar a ver onde ele se encaixa conceitualmente, pense em fazer parte das transformações usadas para obter seus dados de vértice do espaço do mundo para o espaço da tela (ou seja, está relativamente relacionado à visualização e projeção do modelo).

O teste de tesoura ocorre após o shader do fragmento, juntamente com todas as outras operações por fragmento que ocorrem naquele momento, como mesclagem, profundidade / estêncil etc. Quando um fragmento é testado pelo teste de tesoura, ele já passou por a transformação da viewport.

Sim, o teste de tesoura pode ser mais rápido que o estêncil, porque é uma simples aceitação / rejeição com base nas cordas do espaço da tela de um fragmento, enquanto o estêncil precisa comparar com o valor atual no buffer de estêncil, possivelmente aumentar ou diminuir esse valor atual, também levar em consideração os resultados do teste de profundidade e assim por diante.

Então, juntando tudo isso, você pode ver por que o teste de tesoura existe. Permite restringir as operações por fragmento a uma parte retangular da tela, mas sem modificar a transformação da viewport atual.

Maximus Minimus
fonte
6

Eu gosto desse tipo de coisa explicada visualmente.

No OnpenGL, temos coordenadas 2D que variam de -1 a +1 para os eixos X e Y.

insira a descrição da imagem aqui

Então essa imagem precisa ser mapeada para as coordenadas da janela.

Vamos imaginar que temos uma janela que tem uma cor escura como fundo, e que temos branco como a cor clara.

O caso mais comum é fazer com que a viewport e a tesoura cubram a tela inteira.

insira a descrição da imagem aqui

Mas podemos configurá-los para serem uma região menor da tela.

insira a descrição da imagem aqui

Essas regiões podem ser diferentes. No exemplo a seguir, a janela de exibição cobre a tela inteira, enquanto tesoura é a caixa menor.

insira a descrição da imagem aqui

E, neste último caso, a tesoura cobre a tela inteira, enquanto a janela de visualização é a caixa menor. Observe que isso glClearafeta a tela inteira, pois é determinada pela região da tesoura.

insira a descrição da imagem aqui

user1754322
fonte
1
Esta é a explicação mais clara para mim, realmente precisava de desenhos.
Laurent Caillette
5

O glScissors realiza um recorte da geometria contra uma parte da tela.

Você desejaria isso, por exemplo, se estivesse renderizando uma caixa da GUI que tivesse rolado o texto suavemente dentro dela. Você deseja cortar toda a geometria fora da parte da tela coberta pela GUI, mas mantenha o texto parcial ou polígonos que ainda estão dentro.

O glViewport mapeia as coordenadas da projeção para as coordenadas do dispositivo, mas não corta.

O glStencil é usado para mascarar pixels individuais em padrões mais complexos, como formas irregulares. Assim, o glScissors é mais rápido.

Rama Hoetzlein
fonte
1

O glScissor é mais simples do que transformações de projeção com viewport.

O teste glScissor especifica quais pixels serão alterados ao renderizar, enquanto o glViewport altera como o gl deve mapear das coordenadas do dispositivo para as coordenadas da janela.

Qual é a diferença entre definir a viewport no retângulo que você deseja renderizar e ajustar a matriz de projeção para desfazer o dimensionamento feito pela viewport.

Md Mahbubur Rahman
fonte