6
votes

Rendu à faible résolution au résultat de la texture lors de la projection de la perspective

Je travaille actuellement sur une application de caméra pour l'iPhone dans lequel je prends l'entrée de la caméra, convertissez-la en une texture OpenGL, puis de la cartographier sur un objet 3D (actuellement un avion dans la projection en perspective, pour des raisons de simplicité ). Après mapper l'entrée de la caméra sur cet avion 3D, je rends cette scène 3D à une texture qui est ensuite utilisée comme nouvelle texture pour un plan dans un espace orthographique (pour appliquer des filtres supplémentaires dans mon shader fragment).

aussi longtemps que je Gardez tout dans la projection orthographique, la résolution de ma texture de rendu est assez élevée. Mais à partir du moment où j'ai mis mon avion dans la projection de la perspective, la résolution de ma texture de rendu est très faible.

comparaison:

 Comparaison de la résolution

Comme vous pouvez le constater, la dernière image a une résolution très faible par rapport aux deux autres. Donc, je suppose que je fais quelque chose de mal.

Je n'utilise actuellement pas multisampling sur aucun de mes colonnes et je doute si j'en aurai besoin de toute façon pour résoudre mon problème depuis l'orthographique la scène fonctionne parfaitement.

Les textures que je restituer sont 2048x2048 (sera éventuellement émise comme une image sur le rouleau de la caméra iPhone).

Voici quelques parties de mon code source que je Pensez être pertinent:

code pour créer la tramebuffer qui est émise à l'écran: xxx

texturerdegert class: xxx

et enfin, un extrait de la manière dont je crée la texture de rendu et le remplir avec des pixels: xxx


3 commentaires

J'ai essayé de résoudre le problème en permettant à Mipmapping sur ma classe de texture, mais cela n'a pas résolu le problème.


Pour déterminer ce qui ne va pas ici, il serait probablement plus utile de montrer les valeurs de coordonnées de position / texture que vous utilisez pour votre plan, ainsi que les matrices que vous utilisez.


@BitShiftCop Tout succès à résoudre ce problème?


3 Réponses :


6
votes

Je supposerais que la cartographie de la texture n'est pas exacte avec la projection de la perspective.

Pourriez-vous remplacer l'image du rouleau de la caméra par vérificateur (grille d'échecs avec taille de cellule 1px)? Comparez ensuite les dames rendus dans des projections orthogonales et de perspective - la grille ne devrait pas être floue. Si c'est le problème, le problème est dans la matrice de projection - il nécessite un biais pour la cartographie directe Texel-to-pixel.

Si vous avez le périphérique, vous pouvez examiner les étapes de rendu via OpenGL Cadre Capture Caractéristique de Xcode - Vous verrez quand exactement l'image devient floue.

Quant aux mipmapping, il n'est pas bon de l'utiliser pour les textures créées à la volée.


0 commentaires

5
votes

Le flou peut être causé par le plan étant positionné à des demi-pixels dans les coordonnées de l'écran. Étant donné que partir d'orthographique à la perspective, la transformation change la position de l'avion, le plan ne sera probablement pas positionné à la même manière coordonnée entre les deux transformations.

Des flou similaires se produisent lorsque vous déplacez un UIImageView de l'origine du cadre (0.0.0.0) à (0.5,0.5) sur l'affichage standard-résens et (0,25,0,25) sur les écrans de rétine.

Le fait que votre texture est très élevée peut ne pas aider dans ce cas car le nombre de pixels réellement échantillonnés est limité.

Essayez de déplacer l'avion une petite distance dans l'écran X, Y coordonnées et voyez si le flou disparaît.


4 commentaires

J'ai essayé de déplacer l'avion, mais le flou ne disparaît pas.


Combien avez-vous bougé? Il essaierait de 0,25 pixels dans X, Y dans différentes directions, si vous utilisez le simulateur iPhone 4.


Je teste sur mon iPhone 4s et je me déplace dans des marches de 0,05 pixels, j'ai essayé beaucoup d'étapes mais non d'entre eux donnaient un résultat meilleur ou même légèrement meilleur. Je continuerai à essayer d'autres textures et le modèle de vérificateur comme mentionné ci-dessus.


Okej. Eh bien, alors ma réponse ne semble pas être la solution à votre problème.



2
votes

J'ai finalement résolu mon problème en fusionnant la première et la deuxième étape de mon processus de rendu.

La première étape utilisée pour récolter et retourner la texture de la caméra et le rendre à une nouvelle texture. Ensuite, cette texture nouvellement rendue est mappée sur un plan 3D et le résultat est rendu à une nouvelle texture.

J'ai fusionné ces deux étapes en modifiant les coordonnées de la texture de mon plan 3D afin que je puisse utiliser la texture d'une caméra d'origine directement sur ce plan.

Je ne sais pas quelle est la raison exacte ce qui causait cette perte de qualité entre les deux textures rendues, mais comme indice pour l'avenir: ne rendant pas pour texturer et réutiliser ce résultat pour un nouveau rendu à la texture . Fusionner tout cela ensemble est meilleur pour la performance et évite également des problèmes de changement de couleur.


0 commentaires