Comment puis-je passer plusieurs textures à un seul shader?
Je suis à l'aide de freeglut, GLEW et le Diable à rendre une texture théière à l'aide d'un vertex et fragment shader. C'est tous fonctionne bien en OpenGL 2.0 et GLSL 1.2 sur Ubuntu 14.04.
Maintenant, je veux appliquer une texture en relief la théière. Mon maître de conférences à l'évidence ne pas brasser son propre thé, et donc ne savent pas qu'ils sont censés être lisse. De toute façon, j'ai trouvé un joli tutoriel sur la vieille école bump qui comprend un fragment shader qui commence:
uniform sampler2D DecalTex; //The texture
uniform sampler2D BumpTex; //The bump-map
Ce qu'ils ne mentionnent pas c'est comment de passer deux textures pour le shader en premier lieu.
Auparavant, Je
//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);
//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
//Fragment shader
gl_FragColor = color * texture2D(DecalTex,gl_TexCoord[0].xy);
alors maintenant, je
//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);
glBindTexture(GL_TEXTURE_2D, bumpHandle);
//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;
//Fragment shader
gl_FragColor = color * texture2D(BumpTex,gl_TexCoord[0].xy);
//no bump logic yet, just testing I can use texture 1 instead of texture 0
mais cela ne fonctionne pas. La texture disparaît complètement (dans les faits, la théière est blanc). J'ai essayé GL_TEXTURE_2D_ARRAY, glActiveTexture et quelques autres-semblant mais infructueux options.
Après tamisage à travers l'habituel mélange de références à OpenGL et GLSL, nouveaux et anciens, j'en suis venu à la conclusion que j'ai probablement besoin glGetUniformLocation
. Exactement comment dois-je utiliser ce en OpenGL fichier cpp pour passer le déjà peuplées de la texture des poignées pour le fragment shader?
- Comment passer un tableau de textures avec des tailles différentes pour GLSL?
- Passer Plusieurs Textures à partir d'OpenGL pour shader GLSL
- Plusieurs textures en GLSL - un seul fonctionne
(Ce sont les devoirs de sorte s'il vous plaît répondre avec un minimum de fragments de code (le cas échéant). Merci!)
À défaut, quelqu'un thé cosy mesh?
OriginalL'auteur d3vid | 2014-08-11
Vous devez vous connecter pour publier un commentaire.
C'est très simple, vraiment. Tous vous avez besoin est de se lier à l'échantillonneur de la texture à l'unité avec
glUniform1i
. Donc, pour votre exemple de code, en supposant que les deux uniformes échantillonneurs:Dans votre code d'initialisation:
OK, shader uniformes ensemble, maintenant nous rendre. Pour ce faire, vous aurez besoin de l'habitude
glBindTexture
plusglActiveTexture
:Et dans le shader, vous allez utiliser les textures samplers tout comme vous le faites déjà:
Remarque: Pour des techniques comme le bump-mapping, vous avez seulement besoin d'un ensemble de coordonnées de texture, car les textures sont les mêmes, seul contenant des données différentes. Donc, vous devriez probablement passer des coordonnées de texture, comme un sommet de l'attribut.
glActiveTexture(GL_TEXTURE0 + 0);
après la finale glBindTexture pour le travail et merci pour le khronos liensContent d'avoir pu aider 🙂
OriginalL'auteur glampert
au lieu d'utiliser:
dans votre code,
vous pouvez avoir:
dans votre shader. Que signifient que vous n'avez pas de requête pour l'emplacement.
OriginalL'auteur merak