2012-09-02 4 views
0

OpenGL 프로젝트에서 GLKit을 사용하고 있습니다. 모든 것은 GLKView와 GLKBaseEffect (사용자 정의 쉐이더 없음)를 기반으로합니다. 내 프로젝트에서 나는 3D 객체를 보여주기 위해 GLKViews를 가지고있는 여러 개의 뷰를 가지고 있으며 때때로 그러한 뷰 중 일부는 한 번에 (예 : 모달 뷰 스택에) "열어"있을 수 있습니다.텍스처를로드하지 않는 GLKBaseEffect (텍스처가 텍스처에 검은 색으로 표시됨)

지금까지 모든 것이 훌륭하게 작동했지만, 새로운 관점에서 필자는 내 앱의 3D 세계를위한 측정 테이프를 시뮬레이션하기 위해 텍스처가있는 사각형이 필요했습니다. GLKTextureLoader에 의해 텍스처가 오른쪽으로로드되지만, 사각형을 그릴 때 검은 색으로 표시되고 디버그에서 OpenGL 프레임을 볼 때 알 수있는 것처럼 볼 수있는 이유는이 뷰에서만 텍스처가 OpenGL 컨텍스트에로드되지 않습니다. 빈 텍스처가로드됩니다 (텍스처에 대한 참조가 있지만 모두 0이나 null입니다). (원래 삼각형 스트립했지만, 나는 그것이 문제가 아니다 확인하기 위해 삼각형에 대한 전환) 나는 같은 효과 변수를 설정

static const GLfloat initTape[] = { 
    -TAPE_WIDTH/2.0f, 0, 0, 
    TAPE_WIDTH/2.0f, 0, 0, 
    -TAPE_WIDTH/2.0f, TAPE_INIT_LENGTH, 0, 

    TAPE_WIDTH/2.0f, 0, 0, 
    TAPE_WIDTH/2.0f, TAPE_INIT_LENGTH, 0, 
    -TAPE_WIDTH/2.0f, TAPE_INIT_LENGTH, 0, 
}; 
static const GLfloat initTapeTex[] = { 
    0, 0, 
    1, 0, 
    0, 1.0, 

    1, 0, 
    1, 1, 
    0, 1, 
}; 

:

내가 그리는거야 모양은에 의해 정의됩니다

effect.transform.modelviewMatrix = modelview; 
    effect.light0.enabled = GL_FALSE; 

    // Projection setup 
    GLfloat ratio = self.view.bounds.size.width/self.view.bounds.size.height; 
    GLKMatrix4 projection = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(self.fov), ratio, 0.1f, 1000.0f); 
    effect.transform.projectionMatrix = projection; 


    // Set the color of the wireframe. 
    if (tapeTex == nil) { 
     NSError* error; 
     tapeTex = [GLKTextureLoader textureWithContentsOfFile:[[[NSBundle mainBundle] URLForResource:@"ruler_texture" withExtension:@"png"] path] options:nil error:&error]; 
    } 
    effect.texture2d0.enabled = GL_TRUE; 
    effect.texture2d0.target = GLKTextureTarget2D; 
    effect.texture2d0.envMode = GLKTextureEnvModeReplace; 
    effect.texture2d0.name = tapeTex.name; 

그리고 렌더링 루프는 다음과 같습니다

 [effect prepareToDraw]; 
     glDisable(GL_DEPTH_TEST); 
     glDisable(GL_CULL_FACE); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glEnable(GL_BLEND); 
     glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
     glEnableVertexAttribArray(GLKVertexAttribPosition); 
     glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
     glVertexAttribPointer(GLKVertexAttribPosition, COORDS, GL_FLOAT, GL_FALSE, 0, tapeVerts); 
     glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, tapeTexCoord); 

     glDrawArrays(GL_TRIANGLES, 0, TAPE_VERTS); 

     glDisableVertexAttribArray(GLKVertexAttribPosition); 
     glDisableVertexAttribArray(GLKVertexAttribTexCoord0); 

가 나는 또한 항문 텍스처 자체를 테스트 한 다른 개체와 함께보기 및 그것은 잘 작동하므로 텍스처 파일 오류가 아니에요.

3 일 동안이 문제에 봉착 했으므로 도움을 주시면 대단히 감사하겠습니다.

업데이트 : 또한 렌더링 루프 중에 glErrors가 없습니다.

+0

사람들이 답변 할 수 있도록 다른 질문을 추가 할 수 있습니까? –

답변

2

많은 실수로 마침내 실수를 발견했습니다. 여러 개의 OpenGL 컨텍스트를 사용하는 경우 shareGroup을 사용하여 GLKTextureLoader를 만드는 것이 중요합니다. 그렇지 않으면 텍스처가 반드시 올바른 컨텍스트에로드되지 않을 수 있습니다.

클래스 메서드 인 textureWithContentOf를 사용하는 대신 모든 컨텍스트에는 context.sharegroup으로 초기화 된 자체 GLKTextureLoader가 필요하며 해당 뷰에는 해당 텍스처 로더 만 사용됩니다. 실제로 텍스처는 다른 컨텍스트간에 저장 될 수 있지만 공유 그룹의 기능은 필요하지 않았습니다.

0

쉬운 튜토리얼 http://games.ianterrell.com/how-to-texturize-objects-with-glkit/ 나는 그것이 당신을 도울 것 같아요.

+0

감사합니다.하지만 몇 달 전에이 (및 기타 여러) 자습서를 살펴 보았습니다. 내가 일반적으로 작동하도록 텍스처를 얻을 수 없다는 것은 아닙니다. 대부분의 앱이 완벽하게 작동합니다. 특정 관점에서 볼 때 왜 그런지는 모르겠지만 이유는 알 수 없습니다. 기본적으로 똑같습니다. 나는 지금까지 해왔다. 그것은 과거에 일했다. –

+0

질감의 크기는? 그리고 당신의 tapeTex가 0이 아닌 것은 확실합니까? – SAKrisT

+0

512x512이며 tapeTex는 0이 아닙니다. 또한 다른 객체의 다른 뷰에서 같은 텍스처를 확인하고 잘 동작합니다. 활성 그래픽 컨텍스트의 수에 제한이있을 수 있습니까? –