[openGL] Blending

나우히즈·2024년 10월 10일

Graphics

목록 보기
14/17

Blending

블렌딩(Blending)은 그래픽스에서 여러 색상을 합성하는 과정으로, 한 픽셀의 색상과 이미 그려진 다른 픽셀의 색상을 결합하여 최종 색상을 결정하는 기능. 주로 투명하거나 반투명한 오브젝트를 렌더링할 때 사용.

OpenGL에서는 glEnable(GL_BLEND)를 통해 블렌딩 기능을 활성화하고, glBlendFunc()와 같은 함수로 블렌딩 방식을 설정한다

블렌딩 기본 개념

블렌딩은 렌더링할 오브젝트의 출력 색상(Source Color)과 이미 렌더링된 대상 색상(Destination Color)을 섞는 과정이다. 두 색상을 어떻게 섞을지를 결정하는 것이 블렌딩 함수의 역할.

  • 블렌딩 공식 :
    Final Color = (Source Color * Source Factor) + (Destination Color * Destination Factor)

    •	Source Color: 현재 그리려는 오브젝트의 색상
    •	Destination Color: 이미 렌더링된 색상 (프레임 버퍼에 저장된 값)
    •	Source Factor와 Destination Factor: 각각의 색상에 적용되는 계수 (가중치). 블렌딩 함수에서 이 가중치를 설정함.

블렌딩 함수

  1. glEnalbe(GL_BLEND), glDisable(GL_BLEND)

블랜딩 옵션을 끄고 켜는 함수.

  1. glBlendFunc()

glBlendFunc() 함수는 소스와 대상 색상의 가중치(Factor)를 설정하는 함수. 이 함수는 두 개의 인자를 받아 각각 소스 색상과 대상 색상에 적용할 블렌딩 계수를 정한다.

glBlendFunc(GLenum sfactor, GLenum dfactor);

•	sfactor: 소스 색상에 적용될 계수
•	dfactor: 대상 색상에 적용될 계수

일반적으로 사용되는 몇 가지 계수 값은 다음과 같다:

•	GL_ZERO: 0
•	GL_ONE: 1
•	GL_SRC_ALPHA: 소스 색상의 알파 값 (투명도)
•	GL_ONE_MINUS_SRC_ALPHA: 1 - 소스 색상의 알파 값

가장 일반적인 블렌딩 방식은 투명도를 구현하는 방식. 예를 들어, 투명한 오브젝트를 렌더링하려면 소스 색상의 알파 값(투명도)을 기반으로 대상 색상과 혼합한다.

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

이 경우, 소스 색상에 소스 알파 값을 곱하고, 대상 색상에 (1 - 소스 알파) 값을 곱하여 최종 색상을 계산한다. 결과적으로 투명한 오브젝트는 배경과 섞여서 보인다.

  1. glBlendEquation()

glBlendEquation() 함수는 소스와 대상 색상을 더하는 대신, 다른 방식으로 색상을 결합할 때 사용. 기본적으로는 더하는 방식(GL_FUNC_ADD)이지만, 다음과 같은 다른 방식도 존재:

glBlendEquation(GL_FUNC_ADD);  // 기본값, 두 색상을 더함
glBlendEquation(GL_FUNC_SUBTRACT);  // 소스 색상에서 대상 색상을 뺌
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);  // 대상 색상에서 소스 색상을 뺌
glBlendEquation(GL_MIN);  // 두 색상 중 작은 값을 선택
glBlendEquation(GL_MAX);  // 두 색상 중 큰 값을 선택

블렌딩 고려사항

렌더링 순서

렌더링 순서는 화면에 그려지는 오브젝트들이 어떤 순서로 그려지는지 결정하는 중요한 요소이다. 특히 투명 오브젝트가 포함된 장면에서는 렌더링 순서가 매우 중요하다.

  1. Z-버퍼 (Depth Buffer)
  • 기본적으로 렌더링은 Z-버퍼를 사용해 각 픽셀의 깊이 값을 기록하고 비교하여 어떤 오브젝트가 앞에 있는지 결정한다.

  • glEnable(GL_DEPTH_TEST);를 사용하면 GPU가 오브젝트를 그릴 때 깊이 값을 비교하여 앞에 있는 오브젝트가 뒤에 있는 오브젝트를 가리는 방식으로 렌더링한다.

  • 불투명한 오브젝트의 경우 Z-버퍼에 의해 자동으로 렌더링 순서가 관리되지만, 투명 오브젝트는 깊이 값만으로는 제대로 처리되지 않는다. 깊이 값이 있으면 뒤쪽 오브젝트가 앞쪽 오브젝트를 가리는 현상이 발생할 수 있기 때문.

  1. 투명 오브젝트 렌더링 순서
  • 투명 오브젝트의 경우, Z-버퍼만으로는 제대로 처리가 어려워 렌더링 순서를 직접 관리해야함.
    • 불투명 오브젝트는 앞에서 뒤로(front-to-back) 그려야 하고, 투명 오브젝트는 뒤에서 앞으로(back-to-front) 그려야 올바르게 처리.
    • 불투명한 오브젝트를 먼저 그려서 깊이 버퍼에 기록하고, 투명한 오브젝트는 그 뒤에 그리면서 중첩되는 부분을 적절히 처리. 이를 위해서 보통 오브젝트를 카메라와의 거리에 따라 정렬한 후, 투명한 오브젝트들을 나중에 렌더링하는 방식으로 처리함.
  1. 블렌딩과 Face Culling의 연관성

Face Culling은 삼각형의 앞면이나 뒷면을 렌더링하지 않도록 하는 최적화 기법이다. 예를 들어, glEnable(GL_CULL_FACE);를 사용하여 앞면 또는 뒷면을 렌더링하지 않게 할 수 있다.

  • Face Culling은 보통 불투명한 오브젝트에서 사용되며, 렌더링할 필요가 없는 삼각형을 제거하여 성능을 최적화한다.
  • 블렌딩이 적용된 투명 오브젝트의 경우, face culling을 사용할 때 주의가 필요하다. 투명 오브젝트는 양면 모두 그려야 하는 경우가 많기 때문에 culling을 비활성화해야 올바르게 그릴 수 있다.
  • 불투명 오브젝트에서는 뒷면을 그릴 필요가 없기 때문에 culling을 사용하는 것이 성능상 이점이 있다.

0개의 댓글