2010-11-24 39 views
2

Disons que j'ai une application (les détails de l'application ne devraient pas poser de problème pour résoudre le problème). Au lieu de rendre à l'écran, je suis en quelque sorte en mesure de forcer l'application à rendre à un objet framebuffer au lieu de rendre à l'écran (jouer avec glew ou intercepter un appel dans une DLL).Application d'un shader à un objet framebuffer pour obtenir un effet fisheye

Une fois que l'application a rendu son contenu au FBO, est-il possible d'appliquer un shader au contenu du FB? Mes connaissances sont limitées ici, donc d'après ce que je comprends à ce stade toutes les informations sur les sommets ne sont plus disponibles et tous les tests nécessaires ont été appliqués, donc ce qui reste dans le tampon est juste des données de pixels. Est-ce correct?

S'il est possible d'appliquer un shader à la FBO, est-il possible d'avoir un effet fisheye? (comme ceci par exemple: http://idea.hosting.lv/a/gfx/quakeshots.html)

La technique utilisée dans le tableau ci-dessus consiste à créer 6 fenêtres différentes et à rendre chaque fenêtre à une face cubemap, puis à appliquer la texture à un maillage.

Merci

Répondre

4

Un objet framebuffer encapsule plusieurs autres tampons, en particulier ceux qui sont implicitement indexés par l'emplacement du fragment. Ainsi, un seul objet framebuffer peut regrouper un tampon de couleur, un tampon de profondeur, un tampon de stencil et un tas d'autres. Les tampons individuels sont connus sous le nom de renderbuffers.

Vous avez raison - il n'y a pas de géométrie là-dedans. Dans le but de relire la scène, vous obtenez seulement des valeurs de fragment final, qui si vous détournent une application existante sera probablement une image de 2d pixels du cadre et d'autres choses que vous ne vous souciez pas. Si votre GPU a un support de rendu de texture (à l'origine une extension autour d'OpenGL 1.3 mais vous auriez du mal à trouver un GPU sans aujourd'hui, même dans les téléphones mobiles) alors vous pouvez lier une texture comme un rendu dans un framebuffer. Le code de rendu est donc exactement ce qu'il devrait être normalement mais finit par écrire les résultats dans une texture que vous pouvez ensuite utiliser comme source pour dessiner. Les shaders de fragmentation peuvent décider par programme de l'emplacement d'une texture à échantillonner afin de créer leur sortie. Vous pouvez donc écrire un fragment shader qui applique une lentille fisheye, bien que vous soyez limité au champ de vision rendu dans la texture d'origine, évidemment. Ce qui serait probablement ce que vous obtiendriez dans votre exemple de Quake si vous n'aviez qu'un des côtés du cube disponible plutôt que six. En résumé: la réponse est «oui» à toutes vos questions. Il y a une brève introduction aux objets framebuffer here.

+0

Ok donc après avoir créé un objet renderbuffer, capturé la sortie rendue de l'application à utiliser comme texture, quel est le but du fragment shader? Vous avez mentionné que le fragment shader peut décider par programme quel emplacement échantillonner. Pouvez-vous expliquer ce que vous vouliez dire par là dans le contexte de ce problème? – Adham

+0

Ce que vous pourriez faire est de dessiner un seul quad pour contenir le cristallin.Chaque fragment recevra une entrée (x, y) mais au lieu de simplement regarder le pixel en (x, y) dans l'image source et en définissant cela comme la couleur de sortie, il fera un calcul pour savoir où obtenir le Couleur d'entrée pour faire apparaître l'image fisheye (probablement quelque chose comme passer à des coordonnées polaires et lancer un cosinus sur la distance?) - exactement comme Photoshop le ferait. Ensuite, vous ne soumettez qu'un seul quad et obtenez un œil de poisson parfait. – Tommy

2

Regardez ici pour quelques informations pertinentes:

http://www.opengl.org/wiki/Framebuffer_Object

La courte explication simple est que l'équivalent est OIR 3D d'un tampon de trame logiciel. Vous avez un accès direct aux pixels individuels, au lieu de devoir modifier une texture et la télécharger. Vous pouvez obtenir des shaders pour désigner un FBO. Le lien ci-dessus donne un aperçu de la procédure.