2014-03-26 2 views
0

내 앱은 8888 형식의 전체 화면 glSurface 오버레이를 사용합니다. 대부분의 장치에서이 작업은 정상적으로 작동합니다. OpenGL ES를 사용하여 반투명 이미지를 그릴 수 있으며, 실제로 다른 기본 뷰 위에 투명도가 적용됩니다.Android EGL 오버레이 투명도 문제, 스크린 샷과 디스플레이의 차이점

하지만 Nexus 10 및 Note 2 (대부분 다른 일부 기기)에서는 DDMS를 통해 캡쳐 한 화면이 완전히 올바른 것처럼 보였지만 실제 디스플레이에서는 반투명 픽셀이 올바르게 표시되지 않습니다. 이것은 저를 곤란하게합니다 - 시각적 인 디스플레이가 스크린 샷과 어떻게 다르게 보일 수 있습니까?

프레임 버퍼의 알파 값이 1 (0xff) 또는 0 (0x00) 이외의 모든 픽셀에 대해 이상한 현상이 발생하는 것으로 보입니다.

Nexus 10의 DDMS 스크린 샷을 첨부하여 테스트 카드 이미지를 정확하게 보여줍니다. 또한 디스플레이에서 사진을 첨부하여 매우 다른 이미지를 표시했습니다 ... 설명한 것처럼 EGL 오버레이 알파 값이 0x00 또는 0xff가 아닌 픽셀이 잘못 표시됩니다. 주 2는 동일합니다.

누구든지이 문제를 어떻게 해결할 수 있는지 알고 있습니까? 장치 디스플레이에 문제가 발생하는지 프로그래밍 방식으로 판단하는 방법조차 모르기 때문에이 점이 우리에게 가장 큰 방해물입니다. 안드로이드에

Nexus 10 display photograph, looks incorrect Nexus 10 DDMS screenshot, looks correct

답변

1

반투명 창은 알파가 미리 곱셈 색상을 포함 할 것으로 예상된다. 윈도우 컴포 지터에 의해 사용되는 블렌딩 방정식은 다음과 항상

dest.rgb = src.rgb + dest.rgb*(1 - src.a) 

유효한 미리 곱셈 색상이 < = color.a color.rgb있다. 그렇지 않은 경우 혼합 방정식의 결과는 1.0보다 클 수 있습니다. OpenGL ES에서 1.0보다 큰 색상을 쓰려고하면 1.0으로 고정됩니다 (부동 소수점 색상 버퍼로 렌더링하지 않는 한). 따라서 미리 지정된 유효하지 않은 색상은 GL 렌더링이나 창 합성기에서 합성을 위해 GL을 사용하는 경우에 종종 눈에 띄지 않게됩니다.

그러나 Android는 특수 합성 하드웨어 (요즘 거의 모든 Android 기기)가있는 기기가 오버 플로우가 혼합 될 때 1.0으로 클램핑 할 것을 요구하지 않습니다. 대부분의 장치는 클램프를하지만 Nexus 10의 Exynos 5250은 그렇지 않습니다. 8 비트 고정 소수점의 블렌딩 수학을 수행하고 오버플로 (0xFF + 0x2 == 0x01)를 래핑합니다. 비고 2의 Exynos 4412가 같은 방식으로 작동한다면 놀라지 않을 것입니다.

이 문제를 해결하려면 프레임의 끝에 프레임 버퍼에 유효한 미리 곱한 색상이 있어야합니다. 안드로이드 UI 프레임 워크를 포함한 많은 응용 프로그램은 불투명하지 않은 입력 (텍스처, 정점 색상 등)이 미리 곱셈되어 있는지 확인하여이를 수행합니다. 대부분의 수학은 그 이후에 자동으로 작동합니다. 미리 곱한 입력을 보장 할 수없는 경우 조각 쉐이더 끝에

gl_FragColor.rgb *= gl_FragColor.a; 

을 추가하면됩니다. 블렌딩을 할 경우 사용하는 블렌드 방정식/요소를 조정해야합니다.