在opengl中的alpha混合不起作用

时间:2013-10-02 15:28:51

标签: opengl-es

我正在尝试改变绘制到四边形上的纹理的透明度,下面的代码工作正常,但使用glColor4f的alpha设置无效。这有什么可能的原因?它可能是程序中其他地方的gl设置吗?


glEnable(GL_BLEND);
glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glColor4f(1.0f, 1.0f, 1.0f, 0.3f);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, quadTexCoords);
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionButton.data[0] );
glDrawElements(GL_TRIANGLES, NUM_QUAD_INDEX, GL_UNSIGNED_SHORT, quadIndices);
glDisableVertexAttribArray(vertexHandle);
glDisableVertexAttribArray(normalHandle);
glDisableVertexAttribArray(textureCoordHandle);

编辑: 我按照下面的答案设法做到了。如果有人有兴趣,我在我的着色器中放置一个统一变量,称为alpha,如下所示:



uniform float alpha;

void main()
{
    gl_FragColor = texture2D(texSampler2D, texCoord);
    gl_FragColor = gl_FragColor * alpha;
}

然后当我正在绘制场景时我会像这样使用它(例如设置0.5 alpha):



GLint alphaLocation = glGetUniformLocation(shaderProgramID, "alpha");
glUniform1f(alphaLocation, 0.5);

1 个答案:

答案 0 :(得分:0)

您显然正在使用OpenGL ES 2.0(因为您正在使用glVertexAttribPointerglUniformMatrix4fv),这实际上让这有点令人费解。 OpenGL ES 2.0没有定义glColor<N> (...),这是固定功能API的一部分,不应该在兼容的OpenGL ES 2.0实现中定义。

即使已定义,GLSL ES中也没有机制来获取当前颜色&#34;在着色器中。 Desktop GL在兼容性GLSL配置文件中具有预先声明的变量gl_Color,但GLSL ES没有。

如果要以这种方式定义颜色而不是使用每顶点属性,则需要使用GLSL制服。