我正在将一些代码从 OpenGL ES 1.x 移植到 OpenGL ES 2.0,我正在努力让透明度像以前一样工作;我所有的三角形都被渲染成完全不透明的。
我的 OpenGL 设置有以下几行:
// Draw objects back to front
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(false);
我的着色器看起来像这样:
attribute vec4 Position;
uniform highp mat4 mat;
attribute vec4 SourceColor;
varying vec4 DestinationColor;
void main(void) {
DestinationColor = SourceColor;
gl_Position = Position * mat;
}
和这个:
varying lowp vec4 DestinationColor;
void main(void) {
gl_FragColor = DestinationColor;
}
可能出了什么问题?
编辑:如果我按照下面的keaukraine0.5
的建议将片段着色器中的alpha手动设置为片段着色器(或者实际上是顶点着色器),那么我会得到透明的一切。此外,如果我将传递给 OpenGL 的颜色值更改为浮点数而不是无符号字节,则代码可以正常工作。
因此,将颜色信息传递给 OpenGL 的代码看起来好像有问题,我仍然想知道问题出在哪里。
我的顶点是这样定义的(与 OpenGL ES 1.x 代码相同):
typedef struct
{
GLfloat x, y, z, rhw;
GLubyte r, g, b, a;
} Vertex;
我正在使用以下代码将它们传递给 OpenGL(类似于 OpenGL ES 1.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);
以上有什么问题?