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