2010-05-25 4 views
2

J'ai été chargé de résoudre un problème qui est en dehors de mon domaine de connaissances et j'espérais pouvoir obtenir des conseils de dépannage de quelqu'un plus expérimenté avec openGL (j'ai très peu d'expérience avec OpenGL). Nous travaillons sur une application multiplateforme implémentée dans une implémentation Lisp commune appelée ccl. Dans cette application, nous avons besoin d'afficher des objets 3D qui affichent du texte. Sur le mac, tout le texte s'affiche bien mais sur le PC au lieu d'afficher le texte il affiche une autre texture. Au début, je pensais que la texture n'était peut-être pas juste référencée, alors j'ai essayé de changer le numéro de texture mais aucune des textures de la liste ne semblait être le texte (ou si la texture était déformée et ne ressemblait pas à du texte). Je sais que ce problème est très vague et je ne cherche pas quelqu'un pour poster une solution, mais je me demandais si les gens pourraient suggérer des endroits que je pourrais chercher pour essayer de résoudre ce problème.Résolution de problèmes textures de texte openGL ne s'affichent pas correctement plateforme croisée

Voici la méthode qui finit par créer la texture à partir d'un fichier (désolé le code est écrit en Lisp en utilisant le cocoa/cocotron) aussi quand j'ai ajouté les instructions d'impression pour imprimer les pixels larges et les pixels élevés. puissances de 2 (512):

(defun CREATE-IMAGE-FROM-FILE (Filename &key Verbose Forced-Depth (Flip-Vertical t)) " 
in: Filename string-or-pathname, &key Verbose boolean, Forced-Depth int, 
out: Pixels byte-vector, 
    Width Height Forced-Depth int; Has-Alpha boolean. 
    Create an image buffer from <Filename> 
    - File must be 32 bit ARGB compatible, e.g., .png with mask or 24 bit RGB." 
(print "CREATE IMAGE FROM FILE") 
(print Filename) 
(when Verbose (format t "CREATE-IMAGE-FROM-FILE: ~A~%" Filename)) 
(let* ((Image-Representation (#/retain (ns-image-rep-from-file (native-string  (namestring (translate-logical-pathname Filename))))))) 
;; should massage data: GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV for best performance 
;; http://developer.apple.com/documentation/graphicsimaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html 
(when (%null-ptr-p Image-Representation) 
    (format t "~%missing texture ~S" Filename) 
    (return-from create-image-from-file)) 
;; do the OpenGL vertical image flip 
(when Flip-Vertical 
    (flip-vertical-buffer 
    (#/bitmapData Image-Representation) 
    (* (#/bytesPerRow Image-Representation) (#/pixelsHigh Image-Representation)) 
    (#/bytesPerRow Image-Representation))) 
(print (#/pixelsWide Image-Representation)) 
(print (#/pixelsHigh Image-Representation)) 
(values 
(#/bitmapData Image-Representation) 
(#/pixelsWide Image-Representation) 
(#/pixelsHigh Image-Representation) 
(#/bitsPerPixel Image-Representation) 
(#/hasAlpha Image-Representation) 
(#/bitmapFormat Image-Representation)))) 


(defmethod DISPLAY-VERTEX-ARRAYS ((Self string-shape)) 
    (glEnable gl_texture_2d) 
    (cond 
    ;; Color! 
    ((color-vector Self) 
    (glcolor3ubv (color-vector Self)) 
    (gltexenvi gl_texture_env gl_texture_env_mode gl_blend)) 
    ;; Black 
    (t 
    (gltexenvi gl_texture_env gl_texture_env_mode gl_modulate))) 
    (glbindtexture gl_texture_2d (texture (font Self))) 
    (glInterleavedArrays GL_T2F_V3F (va-stride Self) (vertex-arrays Self)) 
    (glDrawArrays gl_quads 0 (va-elements-count Self)) 
    (gltexenvi gl_texture_env gl_texture_env_mode gl_modulate) 
    (glDisable gl_texture_2d) 
    ;; if color was use better reset to white? 
    (when (color-vector Self) (glColor3f 1.0 1.0 1.0))) 

alt text http://www.freeimagehosting.net/uploads/e2eaeeca57.png

alt text http://www.freeimagehosting.net/uploads/0a84c32403.png

+0

On dirait que vous ne gérez pas correctement votre mémoire. Pouvez-vous fournir au moins des extraits de code ou des captures d'écran? –

+0

J'ai ajouté quelques screenshots la première capture d'écran est un de nos exemples fonctionnant sur OSX (le texte apparaît bien), le second exemple est exécuté sur windows 7 (il semble que les objets texte utilisent la texture au lieu d'utiliser la texture correcte des boîtes). J'aurais du mal à poster des extraits de code parce que je ne sais toujours pas où le problème se produit dans le code. – Mike2012

Répondre

2

C'est une photo dans l'obscurité, mais les polices ont tendance à être mises en place tôt parce que ce n'est pas drôle d'être sans texte. Vérifiez donc que le premier appel à wglMakeCurrent précède le glGenTextures utilisé pour créer le nom de la texture de la police. Plus généralement, même si je n'ai utilisé que OpenGL à partir de C++, j'ai eu un certain nombre de comportements wierd que je devais traquer. Donc, je suggère deux choses que j'ai trouvé utile lorsque vous travaillez avec OpenGL assez directement:

Tout d'abord, insérez les appels à glGetError dans autant d'endroits que possible. Mettre ceci après chaque appel OpenGL - à l'exception d'un appel à wglMakeCurrent pour désactiver le contexte actuel, puisque glGetError renvoie toujours une erreur sans contexte - est toujours bon.

Quelque chose de simple comme assert(glGetError()==GL_NO_ERROR) est un début raisonnable (ou choisissez n'importe quelle autre méthode de percer dans le débogueur qui vous permet de continuer quoi qu'il arrive ensuite) et si vous vérifiez les docs pour glGetError vous pouvez probablement trouver quelque chose plus compréhensible. Deuxièmement, sous Windows, assurez-vous que vous travaillez toujours avec un contexte courant valide. Ceci est particulièrement important pour les appels à glGenTextures qui génèrent des noms de texture.

assert(wglGetCurrentContext()) fera l'affaire ici, idéalement juste avant chaque bloc d'appels OpenGL, sauf bien sûr pour n'importe quel appel à wglMakeCurrent définit le contexte actuel.

0

Voici mes 2 cents.

J'ai rencontré des problèmes avec des textures de tailles étranges. Lorsque l'extension ARB_texture_non_power_of_two est prise en charge, théoriquement le système graphique peut gérer la texture avec des tailles n'ayant pas une puissance de deux extents, mais en réalité il ne le fait avec aucune combinaison.

J'ai trouvé que sur les cartes NVIDIA, sur systèmes d'exploitation Windows, la texture 2D ne pas avoir un multiple de degrés 2 ne sont pas affichés correctement (par exemple, 231x73), et avec d'autres cartes NVIDIA ne gère pas les textures avec des degrés non être multiple de 4 (peut-être le pilote, peut-être la carte graphique, problème encore inconnu).

Donc, mon conseil est d'enquêter sur les tailles de texture.

+0

Merci beaucoup pour votre suggestion, mais malheureusement, cela ne semble pas être le problème. J'ai ajouté le code qui crée réellement la texture et quand vous regardez la largeur de pixel et la hauteur, ils sont tous deux 512. – Mike2012

0

Le texte est-il dessiné après le dessin des boîtes?

Cela me semble moins problématique d'activer la texture du texte que de désactiver la boîte.

0

Kim Reece est sur la bonne voie. On pourrait dire que l'état de texture des boîtes fuit dans le rendu des mots. Le code que vous avez publié n'est pas la source du problème. Vous devez trouver le code qui restitue réellement les boîtes et les mots et assurez-vous que la texture de la police est liée en utilisant glBindTexture avant que les polys de mot ne soient dessinés. Maintenant, une partie de ceci dépend si votre application utilise OpenGL "cru" ou utilise une bibliothèque sur le dessus pour construire un "graphe de scène" et abstraire ces détails de bas niveau. Pouvez-vous poster plus d'informations sur ce que vous utilisez?

CCL est super! Je l'utilisais presque exclusivement.

+0

Merci beaucoup pour vos conseils Tim, et Kim Reece. J'ai posté le code ci-dessus qui dessine réellement l'objet texte. C'est une méthode appelée display-vertex-arrays, qui est appelée à partir de la méthode draw (la méthode draw pousse essentiellement, fait une mise à l'échelle, appelle display-vertex-arrays puis pops). Il semble que cette méthode appelle en réalité glbindtexture avant de dessiner le tableau de vertex. Je suis d'accord CCL est plutôt gentil! – Mike2012

+0

Vous pouvez vérifier que la valeur de (texture (shape string-shape)) semble raisonnable et diffère de la texture des boîtes. Aussi, vous pourriez vouloir suivre ce qui arrive à la valeur de retour de create-image-from-file; assurez-vous que l'image est faite dans une texture sans erreurs, etc. – Tim

Questions connexes