2013-10-02 1 views
1

쿼드에 그려지는 텍스처의 투명도를 다르게하려고합니다. glColor4f로 설정된 알파를 제외하고는 아래 코드가 효과가 없습니다. 이것에 대한 가능한 이유는 무엇입니까? 프로그램의 다른 곳에서 일할 가능성이 있습니까?OpenGL에서 알파 블렌딩이 작동하지 않습니다.


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

예, 이것은 기본적으로 제가 암시하고있는 것입니다. 이 작업을 수행 할 때 실제로 두 가지 선택 사항이 있지만 꼭짓점 쉐이더에서 유니폼을 사용하고 다양한 것을 프래그먼트 쉐이더로 전달할 수 있습니다 (이것은 효과적으로 고정 함수 파이프 라인이'glColor (...) '와 함께 작동하는 방식입니다)). 그러나 조각 쉐이더에서 유니폼을 사용하는 것은 훨씬 간단합니다. 특히 알파 값이 ** uniform **이므로 생각할 때마다 버텍스 별 보간법을 사용할 필요가 없습니다. –

답변

0

당신은 분명히 사실이 조금 당혹하게는 OpenGL ES 2.0 (당신이 glVertexAttribPointerglUniformMatrix4fv을 사용하고 있기 때문에)를 사용하고 있습니다. OpenGL ES 2.0은 glColor<N> (...)을 정의하지 않습니다.이 API는 고정 함수 API의 일부이며 호환되는 OpenGL ES 2.0 구현에서 정의하면 안됩니다.

GLSL ES에서 정의 된 경우에도 셰이더에서 "현재 색"을 가져 오는 메커니즘이 없습니다. Desktop GL은 호환성이있는 GLSL 프로파일에 미리 선언 된 변수 gl_Color을 가지고 있지만 GLSL ES는 그렇지 않습니다.

정점 별 속성 대신이 방법으로 색상을 정의하려면 GLSL 제복을 사용해야합니다.

+0

위대한, 고마워요 - 어떻게 GLSL 유니폼을 이걸 사용하는 방법에 대한 모든 포인터가? – jonydep

관련 문제