Quel est le but de glScissor?


33

Je sais qu'il est plus efficace que le test au pochoir, mais ai-je raison de supposer que la même fonctionnalité pourrait être obtenue en utilisant des transformations de projection avec la fenêtre?

Réponses:


47

Ils sont plus complémentaires que les alternatives les uns aux autres. Vous souhaitez presque toujours définir le rectangle de ciseaux sur les mêmes valeurs que la fenêtre.

glViewport () spécifie une transformation de l'espace de projection normalisé en espace d'écran. Les polygones sont coupés au bord de l'espace de projection, mais pas d'autres opérations de dessin comme glClear (). Ainsi, vous utilisez glViewport () pour déterminer l'emplacement et la taille de la région de la fenêtre d'espace d'écran, mais le rasterizer peut toujours rendre de temps en temps des pixels en dehors de cette région.

C'est là qu'interviennent les ciseaux. GlScissor () définit un rectangle d'espace d'écran au-delà duquel rien n'est dessiné (si le test des ciseaux est activé).

Ainsi, par exemple, le code suivant effacera tout l'écran, même si la fenêtre d'affichage est définie sur une petite partie de la plus grande fenêtre:

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

L'ajout de glScissor () et l'activation du test des ciseaux (qui est désactivé par défaut) restreint la suppression.

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

Parfois, vous rencontrez une implémentation qui cisaille automatiquement dans la région de la fenêtre, mais qui viole la spécification GL.

Au-delà, le rectangle en ciseaux peut être utilisé pour restreindre temporairement le dessin à un sous-rectangle de la fenêtre, pour des effets spéciaux, des éléments d'interface utilisateur, etc.


11
pour être plus clair, Viewportcoupe les calculs de sommet. Si vous tracez une ligne avec une épaisseur de ligne> 1 ou un point avec gl_PointSize> 1, vous dessinerez également en dehors de la fenêtre.
gman

13

Ils opèrent sur deux parties complètement différentes du pipeline graphique.

glViewport spécifie en fait une transformation, et c'est une transformation qui se produit après le vertex shader mais avant le fragment shader. Si cela aide à voir où il s'inscrit conceptuellement, pensez à ce qu'il fait partie des transformations utilisées pour obtenir vos données de sommet de l'espace mondial vers l'espace d'écran (c'est-à-dire qu'il est relativement étroitement lié à la vue du modèle et à la projection).

Le test de ciseaux se produit après le shader de fragment, ainsi que toutes les autres opérations par fragment qui se produisent à ce moment, telles que le mélange, la profondeur / le pochoir, etc. Lorsqu'un fragment est testé par le test de ciseaux, il a donc déjà été effectué la transformation de la fenêtre.

Oui, le test des ciseaux peut être plus rapide au pochoir car il s'agit d'une simple acceptation / rejet basée sur les coordonnées de l'espace d'écran d'un fragment, tandis que le pochoir doit se comparer à la valeur actuelle dans le tampon de pochoir, éventuellement augmenter ou décrémenter cette valeur actuelle, prendre également en compte les résultats du test de profondeur, etc.

Donc, en rassemblant tout cela, vous pouvez voir pourquoi le test de ciseaux existe. Il vous donne la possibilité de contraindre les opérations par fragment à une partie rectangulaire de l'écran, mais sans réellement modifier la transformation actuelle de la fenêtre.


6

J'aime ce genre de choses expliquées visuellement.

Dans OnpenGL, nous avons des coordonnées 2D qui vont de -1 à +1 pour les axes X et Y.

entrez la description de l'image ici

Ensuite, cette image doit être mappée aux coordonnées de la fenêtre.

Imaginons que nous ayons une fenêtre qui a une couleur foncée comme fond et que nous ayons du blanc comme couleur claire.

Le cas le plus courant est d'avoir une fenêtre et des ciseaux couvrant tout l'écran.

entrez la description de l'image ici

Mais nous pouvons les définir pour être une plus petite région de l'écran.

entrez la description de l'image ici

Ces régions peuvent être différentes. Dans l'exemple suivant, la fenêtre couvre tout l'écran, tandis que ciseaux est la plus petite boîte.

entrez la description de l'image ici

Et dans ce dernier cas, les ciseaux couvrent tout l'écran, tandis que la fenêtre d'affichage est la plus petite boîte. Notez que cela glClearaffecte tout l'écran, car cela est déterminé par la région des ciseaux.

entrez la description de l'image ici


1
C'est l'explication la plus claire pour moi, il fallait vraiment des dessins.
Laurent Caillette

5

glScissors accomplit l'écrêtage de la géométrie contre une partie de l'écran.

Vous le voudriez, par exemple, si vous rendiez une boîte GUI contenant du texte défilant en douceur. Vous souhaitez couper toute la géométrie en dehors de la partie de l'écran couverte par l'interface graphique, mais conserver du texte partiel ou des polygones qui sont toujours à l'intérieur.

glViewport mappe les coordonnées de projection aux coordonnées de l'appareil, mais ne coupe pas.

glStencil est utilisé pour masquer des pixels individuels dans des motifs plus complexes, tels que des formes irrégulières. Ainsi, glScissors est plus rapide.


1

glScissor est plus simple que les transformations de projection avec fenêtre.

Le test glScissor spécifie les pixels à modifier lors du rendu, tandis que glViewport change la façon dont gl doit mapper des coordonnées du périphérique aux coordonnées de la fenêtre.

Ensuite, quelle est la différence avec la définition de la fenêtre dans le rectangle que vous souhaitez rendre et l'ajustement de la matrice de projection pour annuler la mise à l'échelle effectuée par la fenêtre.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.