Quick Comparison
일반 알파는 RGB에 SRC_ALPHA를 곱하고, 미리 알파를 곱한 색은 RGB 소스 인수를 ONE으로 둡니다. 텍스처·셰이더 출력·혼합식의 계약이 같아야 가장자리 색이 맞습니다.
// GL 3.3 Core, 일반(straight) alpha 출력을 누적합니다.
glEnable(GL_BLEND);
glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
// premultiplied RGB이면 첫 GL_SRC_ALPHA를 GL_ONE으로 바꿉니다.식과 상태
ADD 혼합은 출력 = 소스 × 소스인수 + 대상 × 대상인수입니다. RGB와 알파를 별도로 정하면 대상 알파가 필요한 후처리·합성에서도 의도를 유지하기 쉽습니다. 한쪽은 straight, 다른 쪽은 premultiplied인 자료를 혼합식만 그대로 둔 채 바꾸지 않습니다.
| 상태 | 기본값 | 설정·의존 관계 |
|---|---|---|
| BLEND | 비활성 | 켜도 정수 색 출력에는 일반 혼합이 적용되지 않음 |
| src/dst factor | ONE / ZERO | 0·1·소스/대상 색·알파 및 반대값·상수 등 |
| equation | FUNC_ADD | ADD·SUBTRACT·REVERSE_SUBTRACT·MIN·MAX |
| blend constant | (0,0,0,0) | 상수 인수를 선택했을 때만 의미 있음 |
| color write mask | RGBA 모두 true | false 성분은 출력·clear 기록 제한 |
MIN·MAX 식은 일반 가중합처럼 인수를 적용하지 않습니다. 상수 색·알파 인수 조합에는 허용 제약이 있으므로 목적에 맞는 API 조합을 고릅니다. sRGB 출력에서 선형 혼합이 필요하면 첨부 형식과 FRAMEBUFFER_SRGB 상태도 확인합니다.
투명도와 깊이
알파가 0이어도 프래그먼트의 깊이 기록이 자동으로 꺼지는 것은 아닙니다. 일반 투명 패스는 불투명 패스 다음에 그리고 깊이 비교는 유지하되 깊이 기록을 끄며, 대개 뒤에서 앞으로 정렬합니다. 서로 교차하는 투명 면은 단순 물체 단위 정렬만으로 완벽히 해결되지 않을 수 있습니다.
나뭇잎처럼 잘라내는 표면은 임계값 아래에서 discard하는 경로를 비교합니다. 이는 부분 투명도를 누적하는 블렌딩과 다른 결과입니다. MSAA의 alpha-to-coverage도 별도 방법이며 MSAA에 연결됩니다.
1.0의 Alpha Test와 이후 기능
구형 alpha test 상태는 프래그먼트 셰이더의 조건부 discard로 역할을 옮길 수 있지만 현대 Core에서 glAlphaFunc를 다시 켜는 방식은 아닙니다. 기본 blending은 오래된 기능이며, 색과 알파의 분리 인수·식은 이후 버전에서 추가된 호출입니다.
같은 임계값의 구형·현대 코드
레거시 1.0의 다음 상태는 alpha가 0.5보다 큰 프래그먼트만 통과시킵니다.
// 레거시 컨텍스트, 고정 기능 프래그먼트 alpha를 사용합니다.
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);GLSL 330 core에서 같은 통과 조건을 표현하려면 0.5 이하를 discard합니다. 아래는 일반 텍스처 바인딩과 UV가 준비된 프래그먼트 셰이더입니다.
#version 330 core
in vec2 uv;
uniform sampler2D image;
out vec4 color;
void main() {
vec4 texel = texture(image, uv);
if (texel.a <= 0.5) discard;
color = texel;
}이 비교는 통과 조건을 옮기는 예입니다. discard는 부분 투명도를 섞는 연산이 아니고, 셰이더의 부수 효과·early test 조건까지 구형 alpha test와 같다는 뜻은 아닙니다. 해당 패스가 블렌딩도 사용할지 별도로 정합니다.
여러 렌더 타깃의 혼합 인수를 각각 다루는 glBlendFunci 계열은 4.0 코어 또는 대응 확장 조건을 확인합니다. 3.3에서 출력별 활성화를 할 수 있다는 사실과 모든 식·인수를 독립 지정할 수 있다는 사실은 구분합니다. HDR·정수 출력·기본 창 버퍼가 같은 혼합 동작을 한다고 가정하지 않습니다.
참고 링크
5 sources