Je viens de tester les sampler states disponibles avec OpenGL 3.3 dans Kombustor 2.2.x. Les samplers states servent tout simplement à définir l’état d’une unité de texture, indépendamment de l’objet texture qui y est appliqué. Les sampler states sont décrits dans cette spec OpenGL: GL_ARB_sampler_objects.
Chose intéressante, les sampler states OpenGL 3.3 permettent de coller à la logique de Direct3D 11 qui définit aussi cette abstraction hardware avec la structure D3D11_SAMPLER_DESC et les fonctions CreateSamplerState (device D3D11) et PSSetSamplers (contexte immediat). Avant OpenGL 3.3, l’état d’une unité de texture était lié à un objet texture (créé avec glGenTextures). Maintenant avec les sampler states, on s’approche du niveau hardware / GPU.
Voyons rapidement comment utiliser les sampler states.
1 – Création et initialisation du sampler:
1 2 3 4 5 6 7 | GLuint sampler_state = 0; glGenSamplers(1, &sampler_state); glSamplerParameteri(sampler_state, GL_TEXTURE_WRAP_S, GL_REPEAT); glSamplerParameteri(sampler_state, GL_TEXTURE_WRAP_T, GL_REPEAT); glSamplerParameteri(sampler_state, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glSamplerParameteri(sampler_state, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glSamplerParameterf(sampler_state, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f); |
Je viens de créer un sampler state de filtrage linéaire avec X16 de filtrage anisotropique. Les paramètres sont les mêmes que ceux utilisés lors de la création d’une texture.
2 – Utilisation du sampler
1 2 3 | GLuint texture_unit = 0; glBindSampler(texture_unit, sampler_state); ... |
Rien de plus simple: il suffit de dire sur quelle unité de texture doit on appliquer notre sampler. Une fois appliqué sur une unité de texture, les réglages du sampler sont prioritaires à ceux d’un objet de texture. Donc c’est super simple d’ajouter les sampler states dans votre code OpenGL. Pas besoin de modifier le code existant de création des textures.
Quand on ne veut plus utiliser un sampler sur une unité de texture, il suffit d’appeller le code suivant:
1 | glBindSampler(texture_unit, 0); |
3 – Destruction du sampler:
1 | glDeleteSamplers(1, &sampler_state); |
J’ai testé cette extension avec mon projet d’émulateur PCSP. Sur NVIDIA ça marche de tonnerre. Mais sur ATI, je suis obligé de lier un “shader program” pour que ça marche (il semblerait que le “pipeline” fixe d’ATI ait un bug avec cette extension). Bug vérifié avec 10.7 et 11.8.
Merci de l’info. J’ai rien constaté avec AMD mais dans Kombustor je suis full shader. Il y a peut être un bug quand on utilise les sampler objects avec le pipeline fixe, ce n’est pas exclu. Vu que c’est une extension OpenGL 3.3, AMD n’a peut être pas voulu supporter le pipeline fixe.
effectivement, ce serait une explication.