Contourner limitation des taille de textures en OpenGL - C++ - Programmation
Marsh Posté le 16-12-2003 à 10:15:00
Les tailles en puissances de deux sont la pour une raison:
la performance du texturage.
Ca ne sert à rien de chercher à les contourner il suffit que tu éduques celui qui te crées des textures pour utiliser des puissances de deux.
LeGreg
Marsh Posté le 16-12-2003 à 10:43:53
bah c'est pas gagné ... j'acquiert des frames video depuis une camera IEEE qui elle veut rien entendre , son format c'est 320*240 ....
Marsh Posté le 16-12-2003 à 11:30:25
320x240 deux solutions:
- ca rentre dans une texture 512x256 (facile si c'est du temps réel)
- ca se redimensionne aussi (filtrage linéaire, point le plus proche, bicubique etc..)
Pour ce qui est des cartes Nvidia elles supportent les textures de dimensions quelconques via l'extension RECT mais avec de serieuses limitations sur ce qu'on peut faire avec.
LeGreg
Marsh Posté le 16-12-2003 à 11:54:16
D'accord.
pour faire rente l'image dans la texture ... à part de brutal memcy de ligne, onpeut faire comment ??
Marsh Posté le 16-12-2003 à 11:56:19
Joel F a écrit : D'accord. |
de brutaix memcpy ?
A part la mise a jour de bourin je vois pas ? En dx je passera par une tex dynamique, je sais pas c quoi le pendant en ogl
Marsh Posté le 16-12-2003 à 11:58:27
ben j'ai essayer en faisant du memcpy du tableau d'unsigned char* que renvoie la camera vers un autre unsigned char* de 512*256 ensuite je genere la texture et l'affiche.
verdict : ca va bien mais ou bout d'un moment ca rame ...
j'ai testé avec des entees 'disques' (ficheirs raw 320*240 sur disque) et ca rame aussi ... ca ne vient donc pas de la camera.
Marsh Posté le 16-12-2003 à 12:00:22
Joel F a écrit : ben j'ai essayer en faisant du memcpy du tableau d'unsigned char* que renvoie la camera vers un autre unsigned char* de 512*256 ensuite je genere la texture et l'affiche. |
c'est le bout la qui me fait peur. si ca se trouve tu sature completement ta ram video. tu la genere comment ?
la methode en directX : crée une tex en VRAM, une autre en memoire systeme, et copier la deuxieme dans la premiere. em ogl je sais pas, y'a pas des glCopyRect ou des trucs du genre ?
Marsh Posté le 16-12-2003 à 12:06:53
Joel F a écrit : bah c'est pas gagné ... j'acquiert des frames video depuis une camera IEEE qui elle veut rien entendre , son format c'est 320*240 .... |
tu les mappes sur quoi comme objet ?
Marsh Posté le 16-12-2003 à 13:27:46
chrisbk a écrit : |
j'ai un tableau statique d'unsigned char qui me sert de tempon.
je recupere le spixels d emon image, je fait mes traitement et j'ecrit le resultat dans ce tampon.
Ensuite j'appelle glGenTexture et compagnie pour recreer la texture correcte.
Ensuite je mappe la txture sur un Quad pour l'affichage.
Marsh Posté le 16-12-2003 à 13:29:21
Joel F a écrit : |
ah mon avis, cherche pas plus loin, il est la le drame
tu demolis ta ram video, une texture par frame c'est un carnage
Marsh Posté le 16-12-2003 à 13:33:40
c'est quoi un quad ?
si le but est juste d'afficher en 2D ton truc, tu as les opérations glCopyRect() au niveau pixel.
Elles sont très rapides, je saturais le lien avec la caméra alors que je faisais segmentation+suivi des cibles+affichage instrumenté en temps réel.
Marsh Posté le 16-12-2003 à 14:05:48
en fait, je dois gerer deux viewport dans ma vue : un ou j'affiche ce que je recois de ma camera (textur eplaqué sur un QUAD) dans le deuxieme, je dessine EN 3D le maillage correspondant à ma vue camera.
Je doit donc gérer deux types de vues differentes .... et j'en chie des ronds de chapeau.
Marsh Posté le 16-12-2003 à 14:11:32
si tu veut afficher une texture qui fait 256*157 tu fait par exemple pour le coin superieur droit
glTexCoord2f(1,157/256); enfin c'est une truc comme ca
Marsh Posté le 16-12-2003 à 14:14:15
j'oubliais, il faut bien sur que tu charge au depart une image avec une puissance de 2 comme largeur et hauteur, mais rien ne t'empeche de mettre plusieurs textures dans ton images pour ne pas perdre de la place
Marsh Posté le 16-12-2003 à 14:17:38
Joel F a écrit : en fait, je dois gerer deux viewport dans ma vue : un ou j'affiche ce que je recois de ma camera (textur eplaqué sur un QUAD) dans le deuxieme, je dessine EN 3D le maillage correspondant à ma vue camera. |
dans ton viewport 2D, il faut faire des opérations de pixels, il ne faut surtout pas faire de 3D.
Marsh Posté le 16-12-2003 à 15:14:03
Tu peux pas redimensionner tes images aux chargements, tout simplement ?
Marsh Posté le 16-12-2003 à 17:20:17
non les operations que j'y fait sont sensibles aux données et le redimensionnement serai la derniere chose à faire.
Marsh Posté le 16-12-2003 à 19:26:51
les bidules que tu utiles ils fonctionnent comment ? parce que sinon t'aurais pu planquer un mécanisme de cartographie derrière quelques opérateurs ...
Marsh Posté le 16-12-2003 à 19:54:15
je vais essayer de faire claire :
Je recupere deux flux videos de mes cameras que je nomme ici GAUCHE et DROITE.
Sur chacune de ces images j'applique una lgo de rectification (ie bilinear filter et homographie), un filtre de Harris (filtre,fitlre,fitlre et en sortie liste de points). A partie de cette liste de points, je reconstruit les coordonnées 3D d'elements de references de ma video.
J'aimerais afficher mes deux flux videos et PAR DESSUS afficher la reconstruction 3D que je viens de calculer.
Marsh Posté le 16-12-2003 à 20:09:22
si ca peut taider tu va dans le source code de quake 2, ya une fonction toute faite qui redimensionne les textures, jlai deja utilise dans un de mes viewer , marche impec
dailleurs si tu met un texture quelquonque dans un niveau (quake 2 ou 3 ) ca passe nikel -> la fct magique id software
Marsh Posté le 16-12-2003 à 10:04:44
Bon c'est pas nouveau, les textures OpenGL doivent se plier à des restriction en taille : leur largeur/hauteur doivent en effet etre des puissances de 2.
C'est cool tout ca ... mais quand on a une texture de taille quelconque et qu'on veut la passer à OpenGL ... on fait comment ? Actuellement je recopi eligne par ligne avec un memcpy ... c'ets lent et moche :-/
Y a t il une astuce qui m'echappe ??