2012-01-16 4 views
3

Ahoy!GLKBaseEffect의 적절한 사용

저는 GLKit에 추가 된 새로운 기능을 개선하기 위해 오래된 테스트 코드를 업데이트하려고합니다. 지금까지 GLKViewController를 설정하고 기본적인 모양을 렌더링하기 시작했지만 GLKBaseEffect와 관련된 정보를 찾기 위해 고심했습니다.

GLKBaseEffect 문서 상태 : 초기화시

이 응용 프로그램은 첫 번째는 OpenGL ES 2.0 컨텍스트를 생성하고 현재 수 있습니다. 그런 다음 새 효과 객체를 할당 및 초기화하고 속성을 구성한 다음 prepareToDraw 메서드를 호출합니다. 효과를 바인딩하면 셰이더가 컴파일되어 현재 OpenGL ES 컨텍스트에 바인딩됩니다. 기본 효과를 사용하려면 응용 프로그램에서 정점 데이터를 제공해야합니다. 정점 데이터를 제공하려면 하나 이상의 정점 배열 객체를 만듭니다. 셰이더가 필요로하는 각 속성에 대해 정점 배열 객체는 속성을 활성화하고 정점 버퍼 객체에 저장된 데이터를 가리켜 야합니다.

나는 분별력이 부족합니다.

렌더링 할 각 "모델"에 대해 GLKBaseEffect 객체가 필요합니까? 또는 각 "장면"에 대해 단일 GLKBaseEffect를 사용하고 prepareToDraw를 호출하기 전에 즉석에서 속성을 변경합니까?

게임 엔진 및 렌더러에 대한 튜토리얼을 각 모델에 대해 하나의 GLKBaseEffect를 사용하는 것으로 보았습니다. 그러나 단일 인스턴스로 대신 수행 할 수 있다면 전체적으로 비효율적 인 것으로 보입니다.

설명서를 읽는 것이 가장 좋은 방법 인 것처럼 보이지만 많은 사람들이 여러 인스턴스를 사용하는 것을 보았을 때 나는 이것이 사실이 아니라고 생각하기 시작했습니다.

누구든지이 문제에 관해 밝힐 수 있습니까? GLKit은 여전히 ​​iOS (그리고 나에게)에 대해 상당히 새롭기 때문에 어떤 정보라도 크게 감사 할 것입니다.

+0

통찰력을 제공 할 정도로 GLKBaseEffect를 광범위하게 사용하는 사람이 있습니까? 단일 인스턴스를 사용하거나 여러 인스턴스가 필요한 경우 성능 향상에 대해 궁금합니다. 테스트 앱을 작성하고 관심이있을만한 사람들을 위해 내 결과를 게시하겠습니다. – CaptainRedmuff

답변

5

아니요, 각 개체에 대해 고유 한 GLKBaseEffect를 만들지 않아야합니다. 예를 들어 미로를 그리는 경우 해당 미로의 각 벽돌은 자체 개체 일 수 있지만 모두 동일한 GLKBaseEffect를 공유 할 수 있습니다. GLKBaseEffect는 또한 텍스쳐, 조명, 안개등뿐만 아니라 위치 정보를 저장한다는 것을 기억하십시오. 그래서 당신이 벽돌을 하나 이상의 장소에 그리기를 원한다면 (나는 당신이 다음과 같이 가정합니다 :-) 그들의 변형 행렬을 조정 한 다음 호출합니다 'prepareToDraw'API

이 새로운 프레임 워크에 대한 우수 사례에 대한 자세한 정보를 얻으려면 GLKBaseEffect를 광범위하게 사용하는 사람들이 작성한 자습서가 더 필요하다는 데 동의합니다.

해피 항해 ..

+1

굉장합니다. 나는 지금까지 본 방식이 완전히 정확하다고 생각하지 않았습니다. 테스트 장면을 작성하기 시작했으며 단일 인스턴스가 가능합니다. 귀하의 답변을 주셔서 감사합니다 :) – CaptainRedmuff

4

은 "기본"속성 (lightingType, lightModelTwoSided, colorMaterialEnabled, ...)의 각각의 변화는 새로운 쉐이더 프로그램은 다음 "prepareToDraw"전화 보급하는 것이 원인이됩니다.

렌더링 순서를 사용하지 않으면 렌더링 된 각 개체에 하나의 효과를 사용하거나 모든 개체에 대해 하나의 변경 효과를 사용하면 별 문제가되지 않습니다. 두 경우 모두 불필요한 glUseProgram 호출로 끝나고 그려진 각 객체에 대한 불필요한 OpenGL 상태 변경이 발생합니다. (생성 된 OpenGL 호출을 조사하기 위해 "OpenGL ES Analysis"템플릿을 사용하십시오)

즉, 렌더링을 위해 개체를 주문해야합니다. 적어도 동일한 셰이더 프로그램을 사용하는 모든 개체를 그룹화하십시오.그런 다음 각 그룹에 대해 하나의 GLKBaseEffect 개체를 만들고 사용하십시오. GLKBaseEffect 속성을 변경하면 새로운 쉐이더 프로그램이로드 될지 확실치 않은 경우 Instrument를 사용하여 OpenGL 호출을 조사하는 것이 좋습니다.

관련 문제