2016-06-04 2 views
0

J'ai une application qui peut fonctionner avec ou sans multi-échantillonnage. Je récupère des échantillons de textures multi-échantillons précédemment rendues dans un shader. Est-il nécessaire de compiler différentes versions du shader, soit avec un sampler2D ou un sampler2DMS pour accéder à la texture, selon qu'il s'agit d'une texture multi-échantillon ou non?GLSL: est-ce une erreur d'utiliser une texture non multi-échantillonnée avec un sampler2DMS

J'ai essayé d'extraire d'une texture non multisamplée à travers un sampler2DMS et cela fonctionne, mais je ne sais pas si c'est un comportement indéfini selon la spécification, ou combien je peux compter sur cela pour fonctionner.

Est-ce que quelqu'un sait s'il s'agit d'un comportement défini par le projet?

Répondre

0

Chaque objet de texture que vous créez has target associated with it. Lorsque vous avez lié cet objet pour la première fois au contexte, vous avez transmis glBindTexture une énumération cible spécifique. GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP, etc. La cible que vous utilisez dans votre premier appel de liaison devient inextricablement liée à l'objet de texture; Si vous essayez de lier avec une cible différente, glBindTextureéchouera.

GL_TEXTURE_2D et GL_TEXTURE_2D_MULTISAMPLE sont différentes cibles. Si vous liez un objet de texture nouvellement créé avec glBindTexture(GL_TEXTURE_2D, obj), vous ne pouvez pas le lier plus tard avec GL_TEXTURE_2D_MULTISAMPLE. Et vice versa.

GLSL samplers types, comme vous avez pu le remarquer, ont des suffixes sur eux. Eh bien, ces suffixes indiquent le type de texture avec lequel travaille le type d'échantillonneur. sampler2D est un échantillonneur à virgule flottante qui fonctionne avec les textures GL_TEXTURE_2D. Il ne trouvera donc qu'une texture avec la cible correspondante.

Si vous définissez un uniforme sampler2D utiliser l'unité de texture 0 et lier somethign à GL_TEXTURE_2D_MULTISAMPLE, que sampler ne voir. Il ne recherchera qu'un GL_TEXTURE_2D lié à cet échantillonneur. Vous pouvez maintenant avoir entendu parler de view textures. Ce sont des textures qui partagent le stockage avec d'autres textures. Mais la vue peut avoir différentes dimensions et même des cibles de texture. Vous pouvez afficher une seule couche à partir d'une texture de tableau 2D en tant que texture 2D. Et ainsi de suite. Parmi les conversions que vous ne pouvez pas faire est voir une texture multi-échantillon comme une texture non-multi-échantillon. Ou vice versa. Donc, si ce que vous avez décrit fonctionnait, c'était un comportement indéfini. Et vous ne pouvez pas compter dessus.

Cela dit:

Est-il nécessaire de compiler les différentes versions du shader

Non; vous ne pouvez pas utiliser une variable. Il est parfaitement possible d'avoir deux variables d'échantillonnage de types différents et de décider conditionnellement d'échantillonner l'une par rapport à l'autre. Si la condition est dynamiquement uniforme (pour GL 4.x), vous won't even lose your implicit derivatives

La seule chose que vous devez faire est de les utiliser différentes unités de texture.N'essayez pas de jouer à des jeux où vous leur attribuez la même unité de texture et décidez lequel utiliser en fonction de ce que vous avez lié. Cela ne fonctionne pas (ou si c'est le cas, c'est UB).

+0

Nous vous remercions de votre réponse détaillée. Savez-vous si une ramification uniforme dans le fragment shader est aussi performante que la compilation de deux shaders différents? (en considérant qu'une seule version sera utilisée pendant l'exécution du programme, donc aucun programme supplémentaire ne sera lié) – user1282931