Existe-t-il un moyen rapide (pour la performance) de détecter dans glsl si un fragment a été multisamplé, mais dans un second passage (léger) en utilisant des textures où a été rendu 1ère passe. Ou comment opengl stocke-t-il des informations sur le multi-échantillonnage?Comment détecter dans glsl si un fragment est multi-échantillonné?
Répondre
Ils sont plusieurs. L'habitude est de vérifier que les coordonnées du courant (gl_FragCoord) sont (0.5, 0.5). Si c'est le cas, cela signifie que vous êtes au milieu d'un polygone: il est échantillonné une seule fois.
Ce n'est pas, c'est probablement l'un des 4 (pour 4xMSAA) coins tournés-carrés: Vous êtes sur un bord, et openGL a détecté qu'un seul échantillon ne suffit pas.
Voir aussi http://www.opengl.org/pipeline/article/vol003_6/
Afin d'avoir ces informations dans une deuxième passe, vous devrez le stocker dans un g-tampon, cependant.
EDIT: Voici un extrait de code que je viens de faire. Testé sur gtx 470 avec une texture 4xMSAA 1024x1024.
Vertex shader:
#version 400 core
uniform mat4 MVP;
noperspective centroid out vec2 posCentroid;
layout(location = 0) in vec4 Position;
void main(){
gl_Position = MVP * Position;
posCentroid = (gl_Position.xy/gl_Position.w)*512; // there is a factor two compared to 1024 because normalized coordinates have range [-1,1], not [0,1]
}
shader Fragment:
#version 400 core
out vec4 color;
noperspective centroid in vec2 posCentroid;
void main()
{
if (abs(fract(posCentroid.x) - 0.5) < 0.01 && abs(fract(posCentroid.y) - 0.5) < 0.01){
color = vec4(1,0,0,0);
}else{
color = vec4(0,1,0,0);
}
}
bords sont verts, centre de polygone est rouge.
Pour votre question initiale, je vous recommande cet article: http://www.gamasutra.com/view/feature/3591/resolve_your_resolves.php
gl_FragCoord est la position [0, taille_de_cran]. J'ai essayé de détecter la position relative par ce code (vec2 a = gl_FragCoord.xy - plancher (gl_FragCoord.xy)! \t si (ax = 0,5 && ay = 0,5) \t \t gl_FragColor = vec4 (1,0 , 0,1); \t else { \t \t gl_FragColor = vec4 (0,1,0,1); \t}), mais il a fonctionne pas – kravemir
C'est normal. Vous devez utiliser un centroïde variable (gl_FragCoord n'est pas centroïde). Je dois vérifier cela, je reviendrai à vous quand je sais comment le faire. – Calvin1602
@Miro http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=277450 Donc quelque chose comme: VS -> hors centroid fragcoord; main() {fragcoord = MVP * in_Position; fragcoord.xy/= fragcoord.w;} et FS -> ce que vous avez fait, mais avec fragcoord – Calvin1602
Le multi-échantillonnage est activé lors de la création du contexte lors du choix du format de pixel. Après cela, vous ne pouvez pas l'éteindre ou le rallumer. Mais lorsque vous restituez une texture, OpenGL n'utilisera pas le multi-échantillonnage quel que soit le paramétrage du contexte.
- 1. GLSL vérifier si le fragment est sur la géométrie
- 2. Dans un fragment de fragment GLSL, comment accéder à texel à un niveau de mipmap spécifique?
- 3. GLSL Fragment Shader texturant un cylindre, devenant gris?
- 4. GLSL avec rendu de fragment shader seulement noir GL_POINTS
- 5. Comment détecter si un microphone est présent
- 6. Pourquoi est-ce que je n'arrive pas à joindre cette texture à mon fragment de fragment GLSL?
- 7. Fragment ARB Si/Else
- 8. Comment détecter si un lecteur spécifique est un disque dur?
- 9. Comment détecter si un nombre donné est un nombre entier?
- 10. Détecter si un noeud Gtk.TreeNode est développé
- 11. comment détecter si PHPSESSID est modifié
- 12. Détecter si Tooltip est affiché?
- 13. Comment détecter si HPET est disponible
- 14. Détecter si IIS est activé
- 15. Détecter si une page est dans un iframe - côté serveur
- 16. Quartz.NET - comment détecter si un travail est en pause?
- 17. Comment détecter si Vista UAC est activé?
- 18. Comment détecter si un débogueur OpenGL est utilisé?
- 19. Comment détecter si un fichier est PDF ou TIFF?
- 20. Comment détecter si un moniteur est grand écran sous Windows
- 21. Nombre maximal d'instructions GLSL
- 22. Détecter si Javascript est activé?
- 23. Comment détecter si le type est un autre type générique
- 24. Comment puis-je détecter si un contrôle ActiveX est chargé?
- 25. Comment détecter si un moniteur est en mode veille?
- 26. Comment détecter si un widget est activé/désactivé?
- 27. Comment détecter si un service Web asmx est appelé?
- 28. Comportement de branchement GLSL
- 29. Algorithme pour détecter si un pixel est dans une limite
- 30. Détecter si ADOBE est installé
Pourquoi voulez-vous détecter dans votre programme fragment GLSL? Il sera plus facile d'avoir deux shaders différents, un lorsque le multi-échantillonnage est activé et un autre lorsqu'il est éteint, donc pas besoin de le vérifier pendant le rendu, et pas de test de surcharge. – tibur
Pour réduire l'utilisation de la mémoire dans le rendu différé. Quand le fragment est multi-échantillonné alors faites l'éclairage pour tous les échantillons, sinon pour un seul échantillon. – kravemir