2013-10-02 125 views
1

我想改变一个纹理绘制到一个四边形的透明度,下面的代码工作正常,除了用glColor4f设置的alpha没有任何影响。这有什么可能的原因?该计划可能是否在其他地方设置?alpha混合在opengl es不工作


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); 

编辑: 我设法做到这一点按下面的答案。如果任何人的兴趣,我把我的着色均匀变量,称为α,就像这样:



uniform float alpha; 

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

,然后当我画的情景我用它像这样(例如设置0.5阿尔法):



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

+0

是的,这基本上是我暗示的。虽然在做这件事时实际上有两种选择,但您可以在顶点着色器中使用uniform,并设置变量以传递给片段着色器(这实际上是固定功能管道如何与'glColor(...) )。然而,在片段着色器中使用uniform可以更简单直接,尤其是当你考虑到alpha值是** uniform **时,所以使用per-vertex插值没有意义。 –

回答

0

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

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

如果您想用这种方式定义颜色而不是使用每个顶点属性,则需要使用GLSL uniform。

+0

很好,谢谢 - 关于我如何使用GLSL制服来实现这一点的任何指针? – jonydep