2015-10-17 3 views
-1

Je veux prendre de très grandes captures d'écran de mon application dans OpenGL comme 20000x20000 pour l'impression sur la bannière. Tout d'abord, je ne suis pas capable de créer de tels gros framebuffers en raison de la limitation de taille de texture maximale du GPU. Tout le monde peut m'aider à capturer le framebuffer dans différents morceaux?Prise de très grande capture d'écran de la scène

Répondre

3

Comme vous l'avez déjà noté, la capture en plusieurs passes est la voie à suivre. Dans la forme la plus simple, vous pouvez utiliser plusieurs passes, chacune rendant une partie de la scène. Pour obtenir la sous-région de l'image properr, il vous suffit d'appliquer une autre transformation aux positions de l'espace de clip de vos sommets. Cela se résume à de simples traductions et escalades dans x et y:

Lors de l'examen du euclidiean interprétation de l'espace clip - l'espace dispositif normalisé - le volume de visualisation est représenté par un cube [-1,1] dans tous les 3 dimensions Pour rendre uniquement une sous-région alignée sur l'axe de ce cube, nous devons l'augmenter de sorte que seule la sous-région s'insère dans la zone [-1,1], et nous devons la traduire correctement.

En supposant que nous voulons diviser l'image en une grille uniforme de m fois n tuiles, nous pourrions faire les transformations suivantes lors du rendu carreaux i, j:

  1. Déplacez en bas à gauche de la tuile à la origine. Cette position de la tuile sera à (-1 + 2*i/m, -1 + 2*j/n), donc nous devons traduire la valeur niée:

    x' = x + 1 - 2*i/m, y' = y + 1 - 2*j/n

    Ceci est seulement une étape d'aide pour faire la traduction finale plus facile.

  2. Echelle par des facteurs m et n le long de directions x et y:

    x'' = m * x' = x * m + m - 2*i, y'' = y' * n = y * n + n - 2*j

  3. La tuile est maintenant aligné de telle sorte qu'il est le coin inférieur gauche est (encore) à l'origine et la le centre en haut à droite est à (2,2), donc il suffit de le traduire par (-1, -1) pour que nous retrouvions la vue voulme à nouveau:

    x''' = x'' - 1 = x * m + m - 2*i - 1, y''' = y'' - 1 = y * n + n - 2*j - 1

Cela peut bien coure être représenté aussi simple matrice de transformation affine:

( m  0  0 m - 2*i - 1) 
( 0  n  0 n - 2*j - 1) 
( 0  0  1  0 ) 
( 0  0  0  1 ) 

Dans la plupart des cas, vous pouvez simplement pré-multiplier cette matrice à la projection à matrice (ou quoi que matrices vous utiliser), et n'aura pas à changer quoi que ce soit d'autre pendant le rendu.