2010-12-09 54 views
2

Je me demandais s'il était possible d'avoir un tableau de sampler2D dans un vertex shader GLSL 1.5.OpenGL 3.3, GLSL 1.5: Comment configurer un objet de tampon de texture contenant divers texture2D?

J'ai besoin d'accéder à 30 textures 2d différentes à partir de mon vertex shader. Je lis qu'il est impossible d'avoir une structure comme:

uniform sampler2d texture[30]; 

Cependant, ayant 30 différents uniformes est un peu exagéré et assez difficile à gérer ...

Alors, qui m'a amené à l'idée d'avoir un objet tampon de texture. Les TBO sont supportés depuis OpenGL 3.0. Cependant, je n'ai pas pu trouver un bon tutoriel ou un bon exemple, qui montre comment initialiser un TBO avec non seulement une texture, mais plusieurs textures.

This Le site web montre un exemple sur la façon d'initialiser un TBO avec une seule texture. Pas grave du tout. Je pense que la méthode la plus importante est

void createTBO(GLuint* tbo, GLuint* tex) 

En exécutant la méthode

glTexBufferEXT(GL_TEXTURE_BUFFER_EXT, GL_RGBA32F_ARB, *tbo); 

on peut effectivement fixer la texture au tampon. Ceci est également mentionné here. Je suppose que l'appel glTexBuffer 30 fois l'un après l'autre ne ferait pas l'affaire. Donc, j'ai pensé s'il y avait une autre façon d'obtenir le même résultat. Je suis venu avec deux idées:

  • Ajout des 30 textures 2d à une texture 3d et attachez-le directement au vertex shader. Cependant, ce serait un gros gâchis de mémoire puisque la plupart des couches de la texture 3d ne seraient pas utilisées.
  • En utilisant une structure appelée sampler2DArray. Il est mentionné dans les spécifications. Cependant, j'ai cherché sur le Web et n'ai pas pu trouver d'informations précieuses sur la façon de mettre en œuvre cela.

Alors, mes questions sont:

  • Comment puis-je installer un TBO contenant plus de seulement 1 texture?
  • Est-ce possible? Connaissez-vous des sources où je pourrais trouver des informations sur l'ajout de textures 2D à une texture 3D?
  • Connaissez-vous des sites Web où je pourrais trouver des informations sur l'initialisation, la liaison et l'utilisation de sampler2DArray?

Je vous serais reconnaissant si vous pouviez me conseiller. Je suis vraiment un débutant en termes d'OpenGL.

Merci Walter

+0

Cela semble très amusant. Va Walter! – karlphillip

+4

«J'ai besoin d'accéder à 30 textures 2d différentes à partir de mon vertex shader.» Ce n'est pas ce que sont les TBO. Ce ne sont que des tableaux 1D de données provenant d'un objet tampon. Ce que vous voulez, ce sont des tableaux de texture. Lisez à propos de glTexImage3D dans la spécification, et l'échantillonneur textureArray2D dans la spécification GLSL. –

Répondre

10

je crois que vous avez mal compris ce qu'est une texture tampon objet (TBO) est. Un TBO est utilisé pour accéder à un objet tampon dans un shader, rien de plus. Il ne contient pas de textures multiples ou quelque chose comme ça.

Si les textures sont de la même taille, vous pouvez utiliser une texture 3D ou un tableau de textures. Un TBO n'est pas utile pour votre problème.

2

Vous pourriez utiliser des uniformes sampler2DArray. Vous pouvez les utiliser pour transmettre plusieurs textures à votre shader.

http://www.opengl.org/registry/specs/EXT/texture_array.txt

Une solution alternative serait d'utiliser un très grand TBO et de stocker toutes les textures dans le TBO. Une texture peut être aussi grand que 11585x11585 texels (2^27)

texture_buffer_object.txt

1

Comme Jotschi a suggéré l'utilisation d'une très grande texture et d'ajuster en conséquence les coordonnées de texture. (ou: écrire un shader qui mappe les coordonnées standard au bon endroit) C'est ce qu'on appelle un atlas de texture. Je suppose que vous pouvez trouver quelques implémentations en cherchant le terme.