2009-08-24 1 views
2

현재 2D 게임의 블렌딩 및 깊이 테스트가 있습니다. 내 텍스처를 그릴 때 "위쪽"텍스처는 더 낮은 텍스처가 교차 할 경우 일부 텍스처를 제거합니다. 분명히 텍스처의 투명한 픽셀이 깊이 테스트의 고려 대상이되며, 텍스처가 교차하는 경우 그려진 낮은 텍스처의 모든 색상을 제거합니다. 또한 알파 블렌딩이 잘못 렌더링됩니다. 투명 픽셀을 깊이 테스트에 포함시키지 않도록 OpenGL에 알릴 수있는 함수가 있습니까?iPhone OpenGL ES : 2D 게임용 투명 픽셀이있는 텍스처에 깊이 테스트 적용

답변

2

아니요. 불가능합니다. 이는 모든 하드웨어 깊이 테스트에 해당됩니다.

GL (전체 또는 ES - 및 D3D)은 모두 동일한 모델을 가지고 있습니다. 사용자가 지정한 다각형 순서로 그립니다. 폴리곤 B 이전에 폴리곤 A를 그렸고 논리적으로 폴리곤 A가 폴리곤 B 앞에 있어야한다면 폴리곤 B는 페인트되지 않습니다 (깊이 테스트의 예의).

해결 방법은 현재보기 원점에서 가장 가까운 것부터 가장 가까운 것부터 순서대로 다각형을 그리는 것입니다. 행복하게 2D 게임에서 이것은 단순한 정렬이어야합니다 (아마도 매우 자주 할 필요조차하지 않을 것입니다).

3D 게임에서 BSP는이 문제에 대한 기본 솔루션입니다.

3
glEnable(GL_ALPHA_TEST); 
glAlphaFunc(GL_EQUAL, 1.0f); 

이렇게하면 알파가 완전히 불투명 한 모든 픽셀이 삭제됩니다. 그러면 이러한 픽셀은 Z 버퍼에 렌더링되지 않습니다. 그러나 이는 다양한 Z-Buffer 파이프 라인 최적화에 영향을 미치므로 심각한 속도 저하를 유발할 수 있습니다. 이 실제로 인 경우에만 사용하십시오.

0

어떤 유형의 블렌딩을 사용하고 있습니까?

glEnable(GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

알파가 0 인 조각은 깊이 버퍼에 쓰지 않아야합니다.

+0

는 알파 블렌딩 아닌가요 알파 픽셀을 폐기 할 수는 Z-시험 후에 간다? – noop

2

당신이 쉐이더를 사용하는 경우, 혼합을 해제 시도하고 0

if(texColor.w == 0.0) 
    discard;