이유는 분명합니다. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
으로, 우리는 실제로 대상 알파 채널을 무시하고 항상 1로 가정합니다. 프레임 버퍼를 불투명 한 것으로 처리 할 때 이것은 정상입니다.
하지만 올바른 알파 값이 필요한 경우 어떻게해야합니까? glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
으로 설정하고 소스를 으로 미리 곱한 (미리 곱해진 텍스처/정점 색상 또는 알파 성분을 gl_FragColor로 설정하기 전에 알파 성분으로 곱하십시오).
glBlendFunc는 원본 색상 구성 요소에 하나의 요소 만 곱할 수 있지만 알파 합성에는 대상이 one_minus_src_alpha
과 dst_alpha
으로 곱 해져야합니다. 따라서 미리 곱해야합니다. 프레임 버퍼에서 미리 곱셈을 수행 할 수는 없지만 소스와 대상이 모두 사전 처리되는 한 결과는 사전 처리됩니다. 즉, 미리 곱해진 임의의 색상으로 프레임 버퍼를 지우고 (예 : 1.0, 1.0, 1.0, 0.5
대신 50 % 투명 흰색의 경우 0.5, 0.5, 0.5, 0.5
) 미리 곱한 부분을 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
으로 그립니다. 그러면 결과에 올바른 알파 채널이 생깁니다. 최종 결과가 바람직하지 않으면 미리 곱하기를 취소하십시오.
고려해야 할 또 다른 중요한 사항 : 프레임 버퍼에 대상 알파 비트 평면도 있습니까? 이것은 일반 픽셀 형식이 아니라 믿거 나 말거나입니다. 일반적으로 RGBA를 명시 적으로 요구하지 않는 한 RGBx8 (x는 무시 됨), Depth : Stencil (24 : 8)과 같은 것을 얻습니다. 당신은 이것이 명백 할 것이라고 생각 하겠지만, 목적지 alpha는 일반적인 알파 블렌딩에 필요하지 않기 때문에 사람들은 종종 이것을 간과합니다. –
glBlendFuncSeparate를 사용하여 rgb와 alpha에 대한 별도의 블렌드 함수를 지정할 수 있습니다. 그러면 올바른 알파를 얻을 수 있습니다 미리 곱셈 된 알파를 사용할 필요없이 합성을위한 값. – rdb