블로그 이미지
대갈장군

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

Notice

2010. 2. 24. 03:30 OpenGL
OpenGL에서 블렌딩은 예상외로 조금 복잡하다. 일단 함수의 인자부터 헷갈린다. glBlendFunc() 함수가 입력으로 들어오는 화소와 프레임 버퍼에 이미 그려져 있는 화소의 블렌딩 비율을 지정하는 놈인데 이 놈의 인자들을 살펴보면, 첫번째 인자가 source이고 두번째가 destination 이다. 

이거 마치 source가 원래 그려져 있던 화소 같이 들리지만 그 반대다. source인 첫번째 인자가 들어오는 화소고 두번째 인자인 destination이 목적지인 그려질 위치에 있던 화소를 말한다.

아래에 두 가지 대표적인 블렌딩의 예를 그림으로 표현했는데 우선 첫번째 인자가 GL_SRC_ALPHA이고 두번째 인자가 GL_ONE_MINUS_SRC_ALPHA 이면 입력으로 들어오는 화소의 알파값이 입력 화소의 블렌딩 비율이되고 1에서 입력으로 들어오는 화소의 알파값을 뺀 나머지 값이 원래 버퍼에 들어있던 화소의 블렌딩 비율이 되게 하라는 말이다.

고로 소스로 들어온 사각형의 알파값이 아래 그림 첫번째 처럼 50% 였다면, 1 - 0.5를 뺀 값인 0.5가 원래 있던 화소들인 빨강색 삼각형에 적용되어 둘이 합쳐져 오른쪽의 그림처럼 스크린에 나타난다.

만약 입력으로 들어오는 사각형의 알파값이 20%라면 삼각형은 80% (100 - 20)로 블렌딩 되어 그림 내부의 아래 그림 처럼 블렌딩 된다.


것을 코드로 표현하자면 아래와 같다. 우선 블렌딩을 활성화하고 사각형을 그리는데 블렌딩 옵션을 입력으로 들어오는 화소만 그려지라는 의미의 GL_ONE, GL_ZERO 로 주고 삼각형을 그린다. 그리고나서 블렌딩 옵션을 바꿔서 사각형을 그리면 된다.


  glEnable(GL_BLEND);  // 블렌딩활성화

  glBlendFunc(GL_ONE, GL_ZERO);  // 소스(Incoming) 만그리기

 

  glBegin(GL_TRIANGLES);  // Drawing Using Triangles

  glColor4f(1.0f, 0.0f, 0.0f, 1.0f);

  glVertex4f( 0.0f, 1.2f, 0.0f, 1.0f); 

  glVertex4f(-1.2f,-1.0f, 0.0f, 1.0f); 

  glVertex4f( 1.2f,-1.0f, 0.0f, 1.0f); 

  glEnd(); 


  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  

 

  glBegin(GL_QUADS);  // Draw A Quad

  glColor4f(0.0f, 0.0f, 1.0f, 0.5f);

  glVertex4f(-1.0f, 1.0f, 0.0f, 1.0f); 

  glVertex4f( 1.0f, 1.0f, 0.0f, 1.0f); 

  glVertex4f( 1.0f,-1.0f, 0.0f, 1.0f); 

  glVertex4f(-1.0f,-1.0f, 0.0f, 1.0f); 

  glEnd(); 

 

또 다른 예로는 3개의 물체를 균일한 값으로 블렌딩 하는 것인데 여기서는 3개의 물체 (원, 사각형, 삼각형)가 나온다. 이것도 위와 유사한 방법이지만 glBlendFunc() 함수의 인자를 GL_SRC_ALPHA와 GL_ONE으로 준다. 소스로 들어오는 화소의 블렌딩은 들어오는 알파값을 그대로 사용하되 먼저 그려져 있던 화소는 GL_ONE을 줌으로써 가지고 있던 알파값을 그대로 유지하게 한다. 결국 이 의미는 '중첩'시키라는 의미다. 고로 33%씩 세번 중첩 하면 100% 하얀 부분이 3개의 물체가 겹치는 부분에 나타나야 한다. 근데 아래 그림은 좀 약하다... 파워 포인트로 작업한지라 제대로 중첩이 안되고 있다.. -_-  

그래서 프로그램을 돌려 나온 결과를 스크린 캡쳐하여 첨부하였다. 아래 그림을 보면 아... 세개의 도형이 겹치는 부분은 100% 흰색이구나 하는 느낌이 올 것이다. 


소스 코드는 다음과 같다.

  glEnable(GL_BLEND);  // 블렌딩활성화

  glBlendFunc(GL_SRC_ALPHA,GL_ONE); 

 

  glBegin(GL_TRIANGLES);  // Drawing Using Triangles

  glColor4f(1.0f, 1.0f, 1.0f, 0.33333f);

  glVertex4f( 0.0f, 1.2f, 0.0f, 1.0f); 

  glVertex4f(-1.2f,-1.0f, 0.0f, 1.0f); 

  glVertex4f( 1.2f,-1.0f, 0.0f, 1.0f); 

  glEnd(); 

 

  glBegin(GL_QUADS);  // Draw A Quad

  glColor4f(1.0f, 1.0f, 1.0f, 0.33333f);

  glVertex4f(-1.0f, 1.0f, 0.0f, 1.0f); 

  glVertex4f( 1.0f, 1.0f, 0.0f, 1.0f); 

  glVertex4f( 1.0f,-1.0f, 0.0f, 1.0f); 

  glVertex4f(-1.0f,-1.0f, 0.0f, 1.0f); 

  glEnd(); 


  glColor4f(1.0f, 1.0f, 1.0f, 0.33333f);

  glutSolidSphere(1.0f, 36, 36);

posted by 대갈장군