2010-03-30 1 views
1

OpenGL을 사용하여 iPhone 그래픽을 만들고 있습니다. 내 프로젝트 중 하나에서 이미지를 사용해야하는데 OpenGL에서 텍스처로 사용해야합니다. .png 이미지의 크기는 512 * 512이고 배경은 투명하며 이미지의 가운데에는 두꺼운 청색 선이 있습니다.OpenGL ES에서 블렌딩 대신 사용할 수있는 것은 무엇입니까?

이미지를 OpenGL의 폴리곤에 적용하면 이미지의 투명 부분이 검은 색이고 두꺼운 파란색 선이 그 자체로 보이는 것처럼 텍스처가 나타납니다. 검은 부분을 제거하기 위해 블렌딩을 사용했습니다.

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

그런 다음 다각형의 텍스처의 검은 부분이 제거됩니다. 이제는 파란색 밴드 만 보입니다. 따라서 문제는 해결됩니다.

하지만 많은 이미지를 추가하고 OpenGL에서 많은 개체를 만들고 싶습니다. 나는 그것을 할 수 있지만, 더 많은 이미지를 객체에 추가 할 때 프레임 속도는 매우 낮습니다. 그러나 블렌딩을 주석 처리하면 프레임 속도는 정상이지만 이미지는 보이지 않습니다.

나는 좋은 fps가 없기 때문에 그래픽이 약간 느리고 흔들리는 효과가 있습니다.

그래서 :

1) 내 문제를 해결하기 위해 혼합 이외의 다른 방법이 있습니까?

2) OpenGL 앱의 프레임 속도를 어떻게 향상시킬 수 있습니까? 내 그래픽을 올바르게 구현하려면 모든 단계를 수행해야합니까?

답변

0

오브젝트의 투명한 부분을 원하면 유일한 방법은 현재 버퍼에있는 것 (현재 수행중인 작업)으로 삼각형의 픽셀 데이터에 블렌드하는 것입니다. 일반적으로 솔리드 텍스처를 사용할 때 삼각형에 대한 새로운 픽셀 데이터는 버퍼에 있던 내용을 덮어 씁니다 (클로저 인 경우 z 버퍼). 그러나 투명성과 함께, 텍스처의 해당 부분의 투명도를 살펴보고, 그 뒤에 무엇이 있는지 살펴 봅니다. 단단한 것으로 돌아갑니다. 그런 다음 최종 이미지를 얻을 때까지 투명한 소재의 레이어를 래핑하는 모든 레이어를 결합합니다.

당신이 투명성을 원한다면 단순한 나무 스프라이트와 같은 것이고 트렁크면을 '재료'형태로 제거하는 것입니다. 그러면 실제로 모양을 정의하는 더 복잡한 형상을 제공하는 것이 더 나을 것입니다. 트렁크가 아니므로 투명성을 고집하지 않아도됩니다.

슬프게도, 나는 당신이 당신의 FPS를 가속화하려고 노력할 수 있다고 생각하지 않는다. 그렇지 않으면 계산중인 투명도를 줄인다. 이미지를 검사하여 알파 블렌딩이이 이미지에 대해 바뀔 수 있는지 여부를 확인하는 최적화를 추가 할 수도 있습니다. 얼마만큼 밀어 넣으려고하는지에 따라 오랜 시간을 절약 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 여기 내 프로젝트에서 나는 거의 90 %가 투명한 부분 인 512 * 512 텍스처를 사용하고 있습니다. 그래서 당신의 말로 표현하면 텍스처의 투명한 비율을 줄여서 속도를 높일 수있을 것 같습니다. 저에게 좋은 정보입니다. 하지만 이렇게하면 아이폰 화면에서 내 물건을 조금 더 크게 볼 수 있습니다. 그래서 텍스처의 검은 부분을 제거하기 위해 OpenGL inorder에서 블렌딩하는 것 외에는 다른 방법이없는 것 같습니다.? – quint

+0

블렌딩 대신 알파 테스트를 시도 할 수 있습니다. 블렌딩 할 필요가 없을 때 약간 더 빨라질 수 있으며 전체 불투명 및 완전 투명 영역 만 원할 수 있습니다. 'glEnable (GL_ALPHA_TEST); glAlphaTest (GL_LESS, 1.0)'는 100 % 불투명하지 않은 모든 픽셀을 버립니다. 타일 ​​기반 렌더러는 여전히 알파가 없을 때와 같은 방법으로 숨겨진 픽셀을 버릴 수 없으므로이 방법으로 성능이 크게 향상 될 것으로 기대하지는 않습니다. – codewarrior

+0

기본적으로 하드웨어는 완전히 불투명 한 텍스처에 최적화되어 있기 때문에 iPhone에서는 투명성이 높습니다. 성능을 높이려면 혼합 및 알파 사용을 최소화해야합니다. 완전히 불투명 한 텍스처만을 사용하여 진행할 수 없다면, 실제로 블렌딩이 필요한 부분 만 사용하고 나머지 장면은 블렌딩을 사용하지 않도록 먼저 렌더링해야합니다. – codewarrior