블렌딩(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: 각각의 색상에 적용되는 계수 (가중치). 블렌딩 함수에서 이 가중치를 설정함.
glEnalbe(GL_BLEND), glDisable(GL_BLEND)블랜딩 옵션을 끄고 켜는 함수.
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 - 소스 알파) 값을 곱하여 최종 색상을 계산한다. 결과적으로 투명한 오브젝트는 배경과 섞여서 보인다.
glBlendEquation()glBlendEquation() 함수는 소스와 대상 색상을 더하는 대신, 다른 방식으로 색상을 결합할 때 사용. 기본적으로는 더하는 방식(GL_FUNC_ADD)이지만, 다음과 같은 다른 방식도 존재:
glBlendEquation(GL_FUNC_ADD); // 기본값, 두 색상을 더함
glBlendEquation(GL_FUNC_SUBTRACT); // 소스 색상에서 대상 색상을 뺌
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT); // 대상 색상에서 소스 색상을 뺌
glBlendEquation(GL_MIN); // 두 색상 중 작은 값을 선택
glBlendEquation(GL_MAX); // 두 색상 중 큰 값을 선택
렌더링 순서는 화면에 그려지는 오브젝트들이 어떤 순서로 그려지는지 결정하는 중요한 요소이다. 특히 투명 오브젝트가 포함된 장면에서는 렌더링 순서가 매우 중요하다.
기본적으로 렌더링은 Z-버퍼를 사용해 각 픽셀의 깊이 값을 기록하고 비교하여 어떤 오브젝트가 앞에 있는지 결정한다.
glEnable(GL_DEPTH_TEST);를 사용하면 GPU가 오브젝트를 그릴 때 깊이 값을 비교하여 앞에 있는 오브젝트가 뒤에 있는 오브젝트를 가리는 방식으로 렌더링한다.
불투명한 오브젝트의 경우 Z-버퍼에 의해 자동으로 렌더링 순서가 관리되지만, 투명 오브젝트는 깊이 값만으로는 제대로 처리되지 않는다. 깊이 값이 있으면 뒤쪽 오브젝트가 앞쪽 오브젝트를 가리는 현상이 발생할 수 있기 때문.
Face Culling은 삼각형의 앞면이나 뒷면을 렌더링하지 않도록 하는 최적화 기법이다. 예를 들어, glEnable(GL_CULL_FACE);를 사용하여 앞면 또는 뒷면을 렌더링하지 않게 할 수 있다.
Face Culling은 보통 불투명한 오브젝트에서 사용되며, 렌더링할 필요가 없는 삼각형을 제거하여 성능을 최적화한다.