Comment puis-je obtenir le mélange Alpha de transparence de travail en OpenGL ES 2.0?
Je suis en train de faire le portage du code de l'OpenGL ES 1.x pour OpenGL ES 2.0, et j'ai du mal à obtenir la transparence de travail comme il l'a fait avant; tous mes triangles sont rendus complètement opaque.
Mon OpenGL programme d'installation a ces lignes:
//Draw objects back to front
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(false);
Et mes shaders ressembler à ceci:
attribute vec4 Position;
uniform highp mat4 mat;
attribute vec4 SourceColor;
varying vec4 DestinationColor;
void main(void) {
DestinationColor = SourceColor;
gl_Position = Position * mat;
}
et ce:
varying lowp vec4 DestinationColor;
void main(void) {
gl_FragColor = DestinationColor;
}
Ce qui pourrait mal se passer?
EDIT: Si j'ai mis l'alpha dans le fragment shader manuellement à 0.5
dans le fragment shader (ou, d'ailleurs, dans le vertex shader) comme suggéré par keaukraine ci-dessous, puis-je obtenir transparent tout. En outre, si je change les valeurs de couleur, je suis de passage à OpenGL pour être flotteurs au lieu d'octets non signés, alors que le code fonctionne correctement.
De sorte qu'il semble que si quelque chose est incorrect avec le code qui était en train de passer l'information de couleur en OpenGL, et j'ai tout de même envie de savoir quel était le problème.
Mon sommets ont été définis comme suit (inchangé de l'OpenGL ES 1.code x):
typedef struct
{
GLfloat x, y, z, rhw;
GLubyte r, g, b, a;
} Vertex;
Et j'ai été en utilisant le code suivant pour passer en OpenGL (similaire à l'OpenGL ES 1.code x):
glBindBuffer(GL_ARRAY_BUFFER, glTriangleVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * nTriangleVertices, triangleVertices, GL_STATIC_DRAW);
glUniformMatrix4fv(matLocation, 1, GL_FALSE, m);
glVertexAttribPointer(positionSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, x));
glVertexAttribPointer(colorSlot, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, r));
glDrawArrays(GL_TRIANGLES, 0, nTriangleVertices);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Quel est le problème avec le ci-dessus?
OriginalL'auteur Rich | 2013-06-12
Vous devez vous connecter pour publier un commentaire.
Votre Couleur de vertex valeurs d'attribut ne sont pas normalisées. Cela signifie que le vertex shader voit valeurs pour cet attribut dans la gamme de 0 à 255.
Changer le quatrième argument de
glVertexAttribPointer
àGL_TRUE
et les valeurs sont normalisées (à l'échelle de la gamme 0.0-1.0) comme initialement prévu.voir http://www.khronos.org/opengles/sdk/docs/man/xhtml/glVertexAttribPointer.xml
Probablement pas aussi stupide que j'ai fait quand j'ai réalisé un bug dans mon code de la gauche que le drapeau complètement indéfini!
OriginalL'auteur GuyRT
Je soupçonne le DestinationColor variant de votre fragment shader contient toujours la valeur 0xFF pour le canal alpha? Si oui, c'est votre problème. Essayez de la modifier de manière à ce que l'alpha en fait varie.
Mise à jour: Nous avons trouvé 2 solutions:
Utiliser des flotteurs au lieu d'octets non signés pour la varyings qui sont fournis à la DestinationColor dans le fragment shader.
Ou, comme GuyRT souligné, vous pouvez modifier le quatrième argument de glVertexAttribPointer à GL_TRUE dire à OpenGL ES pour normaliser les valeurs lorsqu'ils sont convertis en nombres entiers de flotteurs.
La couleur d'entrée les valeurs doivent être des flotteurs de la gamme 0.0 à 1.0. Parce que vous avez été en utilisant octets, toutes les valeurs entières au-dessus de 0 ont été converties en valeurs de 1,0 et au-dessus, qui saturer à 1,0 pour vous donner entièrement opaque.
Merci! J'ai pensé que c'était ce qui se passait, mais je ne savais pas que c'était tout simplement parce que vous ne pouvez pas utiliser d'octets non signés pour la couleur en OpenGL ES 2.0. Si vous modifiez votre réponse à inclure cette info je vais supprimer ma réponse et accepter la vôtre.
Vous pouvez utiliser octets pour la couleur. Il suffit de changer le quatrième argument de
glVertexAttribPointer
àGL_TRUE
et les valeurs sont normalisées comme initialement prévu.OriginalL'auteur ClayMontgomery
Pour déboguer cette situation, vous pouvez essayer le réglage de la constante alpha et voir si cela fait une différence:
Aussi vous devez vous assurer que vous êtes la cueillette EGL config avec canal alpha.
Et n'oubliez pas de spécifier la précision pour les flotteurs dans les fragment shaders! Lire les spécifications d'OpenGL GL|ES 2.0 (http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf section 4.5.3), et s'il vous plaît voir cette réponse: https://stackoverflow.com/a/6336285/405681
OriginalL'auteur keaukraine