2013-10-02 219 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