Bonsoir tout le monde,
ça fait déjà un moment que suis des tutoriels OpenGL, mais actuellement je me heurte à un problème de texture ou plus exactement celui des Texture Atlas/Sprite Sheet, jusqu'ici j'ai pu utiliser les coordonnées de mes textures (réparties dans des carrés de tailles similaires et donc facile à calculer) et ensuite les adapter à mon objet dans le Vertex-Shader sans qu'il y ait de problème, et tout cela en utilisant les mêmes vertex pour un (Quad) et ma Texture Atlas.
Cette fois-ci j'utilise une Texture Atlas avec des des parties réparties de manière désordonnée, et c'est ça qui pose problème, je ne sais pas comment calculer ou dire à mon Shader d'assigner un groupe de données (texture coordonnées), au vertex adéquat, et ce en raison de son fonctionnement (traitement par 1 seul vertex/fragment), voici le code que j'utilise pour assigner mes coordonnées texture dans la méthode 1 :
VAO :
Vertex-Shader :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 float[] vertex = new float[]{0,0,0,1,1,0,1,1}; float[] texCoords = new float[]{0,0,0,1,1,0,1,1}; int vaoId = GL30.glGenVertexArrays(); GL30.glBindVertexArray(vaoId); //Créer un vbo vertex int vboPos = GL15.glGenBuffers(); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboPos); FloatBuffer bufferPos = BufferUtils.createFloatBuffer(positions.length); bufferPos.put(positions); bufferPos.flip(); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, bufferPos, GL15.GL_STATIC_DRAW); GL20.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 0, 0); //Index 0 dans le VAO et 2D (x,y) GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); //Créer un id texture atlas int textureId = genTextureId(imgLoc); //Créer un vbo coordonnées texture (taille entière) int vbotex = GL15.glGenBuffers(); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbotex); FloatBuffer buffertex = BufferUtils.createFloatBuffer(textCoords.length); buffertex.put(textCoords); buffertex.flip(); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffertex, GL15.GL_STATIC_DRAW); GL20.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, 0, 0); //Index 1 dans le VAO et 2D (u,v) GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); GL30.glBindVertexArray(0);
Ma question est donc, comment utiliser différente coordonnées textures issues de la même 'Texture Atlas' et les assigner à des Quads dupliqués mais qui partagent tous les mêmes vertex ? Pour le moment j'écarte la possibilité de l'instancing (je ne suis pas encore au niveau). J'espère que ce n'est pas trop vague ou mal expliqué, j'accepte toute critique ou solution, merci pour votre aide !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 gl_Position = projMatrix * transMatrix * vec4(position,0.0,1.0); //à passer_au_fragment = (2D) attribut coordonnées_Texture + (2D) positionXY / index texture coords = ( texCoords + offsetXY ) / indexCase;
Partager