|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité régulier
![]() |
Bonjour,
je suis en train d'apprendre à utiliser openGL 3 et je bloque sur l'utilisation de textures. J'ai chargé ma texture en mémoire de la carte graphique (je sais qu'elle est bien chargée car je peux la voir avec gDEBugger), ensuite j'envoie l'identifiant de cette texture à mon shader que voici (juste le fragment, le vertex n'est je pense, pas utile) : Code :
j'ai testé énormément de choses mais voici le code actuel permettant d'envoyer la texture : Code :
Sinon deux petites questions dans le même sujet: 1) Les coordonnées pour la fonction texture() dans le shader doivent etre entre 0 et 1 ou entre 0 et width/height ? 2) D’après gDEBugger, glBindTexture semble déprécié, hors je ne trouve rien à ce sujet, est-ce vraiment le cas et si oui que faut il utiliser à le place ? Merci d'avance. |
||||
|
|
00
|
|
|
#2 | ||||||||
|
Membre habitué
![]() Étudiant Inscription : juin 2009 Messages : 155 ![]() |
Bonjours
Citation:
tu va aller chercher le pixel en coordonné (0.2*width, O.5*height) de ta texture Ainsi çà à le bon gou d'être indépendant de la résolution de ta texture et donc très pratique pour faire du LOD (Level Of Detail). Mais note qu'il existe aussi des fonctions glsl pour accédé directement au pixel que tu désire. (très utile pour des shaders de post-production) Ensuite, en fonction de tes besoin, tu peut configuré le sampler associé de manière différente, Genre si tu souhaite que ta composante doit subir un clamp :Code :
Code :
Code :
texture(tex_id, texCoord - floor(texCoord)) Code :
texture(tex_id,clamp(vec2(0.0), vec2(1.0), texCoord)) Citation:
Dans ce genre de cas, il est même préférable de réécrire les codes OpenGL avec la documentation à coté.Pour se qui est de ton shader, à tu vérifié dans un premier temps le rendu avec un shader du type : Code :
Code :
glBindFragDataLocation (m_shaderProgram, 0, "Color"); Quelque lien utiles Official OpenGL SDK 3.2 OpenGL 3.2 Quick Reference Card Bonne fêtes. |
||||||||
|
10
|
|
|
#3 | ||||
|
Invité régulier
![]() |
Merci pour ces éclaircissements, j'ai réussi à afficher ma texture
Néanmoins, je veux maintenant passer au multitexturing et encore une fois, je ne comprend pas pourquoi cela ne fonctionne pas. J'ai chargé toutes mes textures sur le GPU (4 au total) seulement c'est uniquement la première qui est toujours active, peut importe laquelle j'essaye d'afficher. Voici mon code : Code :
Code :
|
||||
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Alexandre LaurentÉtudiant Inscription : mai 2008 Messages : 6 560 ![]() |
Je ne vois pas le problème dans le code. Serait-ce à cause du shader ?
Sinon, si vous utilisez le pipeline fixe (je doute, vu la conversation), il manque des glEnable(GL_TEXTURE_2D); lors de l'activation de chaque texture. Un autre problème peut venir du faire que vous fassiez un unbind de la texture ? Finalement, pour être sur que tout le code est bon, j'afficherai bien les IDs des textures et des uniforms, pour voir si on moins, ils sont bien tous différents.
__________________
Vous souhaitez participer à la section Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
|
00
|
|
|
#5 | ||||||
|
Invité régulier
![]() |
En effet, pas de pipeline fixe, que du shader.
D'ailleurs, le voici : Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#6 | ||||
|
Membre habitué
![]() Étudiant Inscription : juin 2009 Messages : 155 ![]() |
C'est tout a fait curieux ...
Il doit y avoir un problème avec des lignes non affichées ici. Vérifie bien si les valeur m_uniform_heightmap ainsi que ses congénères m_uniform ont une valeur cohérente.Aussi je te conseille de placer des lignes : Code :
A mon avis, les erreurs viennent des lignes : Code :
|
||||
|
10
|
|
|
#7 | ||||
|
Invité régulier
![]() |
Citation:
Du coup j'ai fait un nouveau shader qui utilise tous les samplers et du coup mes glGetUniformLocation ne retournent plus -1. Mais, ca ne fonctionne toujours pas, déjà j'ai testé de recupérer les erreures d'openGL comme tu me l'a conséillé, et justement la première erreur apparait au glUniform1i(m_uniform_heightmap, 0); je ne vois pas ce que cette ligne à de mal, m_uniform_heightmap est bien défini et vaut 1 (le sampler est bien utilisé dans le shader). [edit] Trouvé ! il est indiqué ici : Citation:
Code :
Merci a vous . |
||||
|
|
00
|
|
|
#8 | ||
|
Membre habitué
![]() Étudiant Inscription : juin 2009 Messages : 155 ![]() |
Oui c'est sur que ça fonctionne pas sans le glUseProgram(m_shaderProgram), mais comme tu l'avais mis bien comme il faut tend ton code de rendu ...
Le fait que tu bind à chaque foi les samplers dans ta boucle de rendu m'étonnait déjà, mais çà ne change pas fondamentalement les choses (sauf si ta config est vraiment vielle) Note que si t'as pas envi de faire du "bind to modify", il est mis à ta disposition l'extension GL_EXT_direct_state_access (qui est souvent présent sur les cartes graphiques), qui te permet, entre autres, de modifier un uniform d'un program sans le bind par la fonction glProgramUniform. Elle sont également disponible dans le core profil depuis OpenGL 4.1 ou 4.2 (j'ai un doute entre les deux Exemple : Code :
Aussi un petit conseil, une foit que ton shader est prêt, ou tout initialisé correctement, il n'est pas nécessaire de gardé les variables m_uniform_heightmap et ses collègues en global si tu ne les modifiera plus jamais. Donc declare les juste dans ta fonction qui initialise le shader. Parce qu'avec OpenGL 3 et supérieur, t'a vite tout plein de shaders de partout, alors faut commencé vite à faire le tris. Hésite pas aussi à te faire des structures ou des class pour contenir tes location d'uniform. Ravis de t'avoir aidé.
|
||
|
00
|
Copyright © 2000-2012 - www.developpez.com