2013-10-16 1 views
4

문서가 말한 것처럼 알파 합성에 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)을 사용하고있었습니다. (사실은 Direct3D 문서에서도 마찬가지입니다).OpenGL을 사용하여 알파 합성을 올바르게 처리하는 방법

GPU에서 결과를 다운로드하고 PNG 이미지를 만들 때까지는 처음에는 아무 문제가 없었습니다. 결과 알파 구성 요소가 잘못되었습니다. 그리기 전에 불투명 한 검은 색 프레임 버퍼를 지웠습니다. 그리고 내가 반투명 한 것을 그린 후에, 프레임 버퍼는 반투명이되었습니다.

답변

6

이유는 분명합니다. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)으로, 우리는 실제로 대상 알파 채널을 무시하고 항상 1로 가정합니다. 프레임 버퍼를 불투명 한 것으로 처리 할 때 이것은 정상입니다.

하지만 올바른 알파 값이 필요한 경우 어떻게해야합니까? glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)으로 설정하고 소스를 으로 미리 곱한 (미리 곱해진 텍스처/정점 색상 또는 알파 성분을 gl_FragColor로 설정하기 전에 알파 성분으로 곱하십시오).

glBlendFunc는 원본 색상 구성 요소에 하나의 요소 만 곱할 수 있지만 알파 합성에는 대상이 one_minus_src_alphadst_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)으로 그립니다. 그러면 결과에 올바른 알파 채널이 생깁니다. 최종 결과가 바람직하지 않으면 미리 곱하기를 취소하십시오.

+0

고려해야 할 또 다른 중요한 사항 : 프레임 버퍼에 대상 알파 비트 평면도 있습니까? 이것은 일반 픽셀 형식이 아니라 믿거 나 말거나입니다. 일반적으로 RGBA를 명시 적으로 요구하지 않는 한 RGBx8 (x는 무시 됨), Depth : Stencil (24 : 8)과 같은 것을 얻습니다. 당신은 이것이 명백 할 것이라고 생각 하겠지만, 목적지 alpha는 일반적인 알파 블렌딩에 필요하지 않기 때문에 사람들은 종종 이것을 간과합니다. –

+0

glBlendFuncSeparate를 사용하여 rgb와 alpha에 대한 별도의 블렌드 함수를 지정할 수 있습니다. 그러면 올바른 알파를 얻을 수 있습니다 미리 곱셈 된 알파를 사용할 필요없이 합성을위한 값. – rdb

관련 문제