2017-07-17 2 views
3

Quelle est la meilleure façon d'obtenir un masque alpha d'objets qui se chevauchent dans OpenGL? Dans la première image ci-dessous j'ai trois grilles qui se chevauchent avec l'ellipsoïde, le test de profondeur est activé. Mon objectif est d'obtenir un résultat similaire à la deuxième image, où le blanc représente l'alpha. Voici les drapeaux de test de profondeur que j'utilise.Masque alpha d'objets se chevauchant dans OpenGL

glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 
glDepthFunc(GL_LEQUAL); 

Main image

Alpha Mask

Répondre

2

Avant de dessiner votre rouge, jaune et grilles bleues vous devez activer le test de gabarit et définissez vos opérations de pochoir glStencilOp fonction comme ceci:

glEnable(GL_STENCIL_TEST); 
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); 
glStencilFunc(GL_ALWAYS, 0, 1); // these are also the default parameters 

Cela signifie que le stencil buffer est conservé tel quel est si le test de profondeur échoue et augmente si le test de profondeur passe. Après avoir dessiné le tampon stencil contient le masque, où 0 signifie noir et> 0 signifie blanc dans votre cas. Vérifiez que votre tampon stencil doit être effacé avant de dessiner (glClear(GL_STENCIL_BUFFER_BIT)).

Si vous devez obtenir ce masque à une texture, vous devez lier une texture au tampon pochoir:

GLint with = ...; 
GLint height = ...; 

GLuint depthAndStencilMap; 
glGenTextures(1, &depthAndStencilMap); 
glBindTexture(GL_TEXTURE_2D, depthAndStencilMap); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL, with, height, 0, GL_DEPTH_STENCIL, GL_FLOAT, NULL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

GLuint frameBuffer; 
glGenFramebuffers(1, &frameBuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); 

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, depthAndStencilMap, 0); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 

Avant de dessiner, vous devez lier et vider la mémoire tampon de trame:

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 

Après avoir dessiné la texture depthAndStencilMap contient le tampon de profondeur dans le canal Red et le tampon stencil, qui est votre masque, dans le canal 'Blue'. Notez que la scène est dessinée dans le tampon d'image et pas plus loin que la fenêtre d'affichage.

1

"meilleur" est un mot de quatre lettres;)

Vous pouvez soit

  1. utiliser le stencil buffer
    • clair à 0/faux pour « pas vos-grilles »
    • pochoir en 1/vrai pour « est vos-réseaux »
  2. tirer une deuxième passe
    • ne comprennent les objets que vous veulent dans le masque
    • ne voit pas clairement le tampon de profondeur
    • utiliser une profondeur == Test
    • utiliser un autre fragment shader pour « est vos-réseaux »