2011-05-27 3 views
1

Situation: Générer N échantillons d'une forme et des arêtes correspondantes (en utilisant le filtre Sobel ou le mien) avec différentes transformations et rotations, tandis que la fenêtre d'affichage (taille = 600 * 600) et la caméra restent constantes. c'est-à-dire qu'il y aura N échantillons + N bords correspondants.Cibles de rendu multiples hors écran à l'aide d'un objet frame buffer (FBO) ou?

Je pense à faire comme ça,

Utilisez un avec 2 renderbuffers OIR [à savoir la taille de chaque tampon sera = (N * 600) * 600] - 1er pour les formes N et 2 pour les bords des formes correspondant

Questions:

  1. Quelle est la meilleure façon d'atteindre au-dessus des choses?
  2. Bien que la taille de la fenêtre d'affichage soit de 600 * 600pixels, la forme n'occupe qu'environ 50 * 50pixels. Donc, y a-t-il un moyen efficace d'appliquer la détection des contours sur la zone de délimitation/la région AABB seulement sur le second tampon? Aussi seulement en lisant 2N boîte de délimitation (N échantillon + N bords correspondants) de manière efficace?

Répondre

2

1: Je ne suis pas sûr de ce que vous appelez «meilleure façon». Utilisez plusieurs cibles de rendu: vous créez deux 600 * textures N, lient les deux à l'OIR avec glDrawArrays, et dans votre fragment shader, donc quelque chose comme ça:

layout(location = 0) out vec3 color; 
layout(location = 1) out vec3 edges; 

Lors de l'écriture de « couleur » et « arêtes » , vous écrirez effectivement dans vos textures.

2: Vous ne devriez pas faire cela. Calculez vos boîtes de délimitation sur la CPU, et projetez-les (multipliez chaque coin par votre matrice ModelViewProjection) pour obtenir les boîtes de délimitation en 2D

Par ailleurs: Calculez d'abord vos boîtes de délimitation, de sorte que vous n'ayez pas besoin de 600 * 600 textures mais 50 * 50 ...

EDIT: Vous restreignez généralement la zone dessinée avec glViewPort. Mais il n'y a qu'une seule fenêtre, et vous en avez besoin de plusieurs. Vous pouvez essayer le Viewport array extension et vivre sur le bord saignant, ou passer l'AABB dans une texture, ou ne vous inquiétez pas à ce sujet jusqu'à ce que les performances comptent ...

Oh, et vous ne pouvez pas utiliser Sobel comme ça. .. Sobel exige que vous puissiez lire tous les texels autour, ce qui n'est pas le cas puisque vous êtes en train de rendre ces texels. Soit faire un algorithme à deux passes sans MRT (première couleur, puis bords) ou ne pas utiliser Sobel et devinez vous les bords dans le shader (je ne vois pas vraiment comment)

+0

@ Calvin- Merci. 2- c'est "environ" 50 * 50 c'est-à-direvariera parce que parfois il pourrait être plus grand ou plus petit aussi en raison de l'effet de transformation en z de la projection en perspective. donc je ne pouvais pas faire ça. Le seul truc que nous pourrions faire ici est de lire, je pense. – Rudi

+0

@Rudi Editer la réponse – Calvin1602

+0

@ Calvin- veuillez considérer que je n'ai jamais utilisé de shader. Cannt J'utilise: mise en page (location = 0) sur la couleur vec3; bord = iif ((couleur [i, j-1] = couleur [i, j + 1] || (couleur [i-1, j] = couleur [i + 1, j]) 1:! 0 ; mise en page (location = 1) sur vec3 bords; – Rudi

1

Comme Calvin dit, vous devez d'abord restituez votre objet dans le premier framebuffer, puis liez-le en tant que texture (utilisez la pièce jointe plutôt qu'un renderbuffer) pour la seconde passe afin de trouver les bords, car la détection de bord doit généralement accéder aux pixels environnants.

En ce qui concerne votre deuxième question, vous pourriez probablement utiliser le tampon stencil. Dessinez simplement vos formes dans la première passe et laissez-les écrire une valeur de référence dans le tampon stencil. Effectuez ensuite la détection des contours (généralement en affichant un quadrillage de taille d'écran avec le fragment shader correspondant) et configurez le test du stencil pour qu'il ne passe que lorsque le tampon du stencil contient la valeur de référence. De cette façon (en supposant que le matériel de début z, ce qui est assez commun maintenant), le fragment shader ne sera exécuté que sur les pixels sur lesquels la forme a été dessinée.

+0

@ Christian- N'utilise pas un FBO avec 2 tampons de texture et en appliquant un fragment de shader nous pourrions réaliser la première tâche de la meilleure façon? comme suggéré par Calvin au lieu de changer les FBO? c'est-à-dire qu'un textrue aura une sortie de couleur de forme et un autre aura un bord utilisant un fragment shader? – Rudi

+0

@Rudi Oui, mais comme Calvin l'a dit, vous ne pouvez pas dessiner les formes et calculer les arêtes dans le même passage, car le détecteur de bord doit avoir accès aux pixels voisins. –

+0

Oui. D'où mon nouveau commentaire. C'est logique, d'abord: vous ne pouvez pas accéder à votre voisin, vous ne savez même pas s'il a déjà été calculé ou non! – Calvin1602

Questions connexes