FBO를 주로 쓰고 이것을 겹쳐서 랜더링 할때 보면 한참 BlendFunction을 보게 된다.
상당히 중요하다. :D
보통 투명한 걸 그리고자 할때는
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
이렇게 표현을 많이 한다.
이게 무슨 뜻이냐면 내가 지금 그리고자 하는것을 SRC라 보고 이미 그려져 있는걸 DST라 칭해서
SRC RGBA는 SRC Alpha에 의해 칠해지고, DST RGBA는 (1 - SRC Alpha) 로 칠하겠다~ 라는 거다. 당연한거다!
옵션으로 쓸수 있는건 대충 아래와 같다
GL_ZERO, : 그냥 의미 그대로 0,
GL_ONE, : 있는 그대로 그림
GL_SRC_COLOR, : SRC Color비율 대로 칠함
GL_ONE_MINUS_SRC_COLOR, : 1.0 - (SRC Color) 비율대로 칠함
GL_DST_COLOR, : 칠해져 있는 Color 비율에 의해 결정
GL_ONE_MINUS_DST_COLOR, : 1.0 - DST COLOR
GL_SRC_ALPHA, : 일반적인 SRC Blending 옵션, 소스의 알파 비율대로 색,알파 결정
GL_ONE_MINUS_SRC_ALPHA, : 일반적인 DST Blending 옵션, 1.0 - 소스의 알파 비율대로 색, 알파 결정
GL_DST_ALPHA,
GL_ONE_MINUS_DST_ALPHA,
GL_CONSTANT_COLOR, : 이건 glBlendColor로 설정한 Constant값에 의해 결정
GL_ONE_MINUS_CONSTANT_COLOR, : 1.0 - constant
GL_CONSTANT_ALPHA,
GL_ONE_MINUS_CONSTANT_ALPHA,
GL_SRC_ALPHA_SATURATE : Saturate 한 값 , 클램핑이라 생각하면됨!
이걸 왜 제대로 알아야 하는가 하면. FBO를 통해 뭔가를 그려내고 그것을 다른 FBO위에 덮어 쓰고 하는 식의 프로그램에서는
상당히 중요 할 수 있다! 눈에 보이는값과 저장되는 값이 다를 수 있기 때문이다.
흠흠. 그리고 그... RGBA 채널에 어떤 Data를 가공하여 다음 Shader로 넘겨 줄때도, Alpha 채널에 의해 RGB 값을 어떤식으로 가공?
할건지때도 필요하다.
만약에 RGB 랑 Alpha에 대해 다른 블랜딩 펑션을 주고 싶을 땐
void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);함수를 쓰면 된다.
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glBlendFuncSeparate.xml
위 사이트 가보면 알겠지만 RGB Factor 와 Alpha Factor가 분리 되어 있다.
오.. 좋다. 처음에 이거 몰라서 한참 해맨기억이 있어서. 흠흠..
아무튼 열코딩!
아래껀 구글 이미지 퍼옮