2009-09-08 4 views
5

전체 iPhone 화면 크기를 그리기 화면으로 사용하지 않는 OpenGL ES 앱을 만드는 방법을 아는 사람이 있습니까? 내가 지금까지 본 적이전체 화면이 아닌 OpenGL ES보기 지정

모든 것이 EAGLView (또는 무엇이든) 0 드로잉, 0, 320, 480

내가, 100, 100, 100을 내 EAGLView을 가지고 싶습니다

, 100 있다 이것이 가능한가? glViewport() 호출을 변경하는 것만으로는 충분하지만 확실하지는 않습니다 ... glViewport는 전체 화면 OpenGL ES보기에 클리핑 사각형을 설정하기 만합니까? 또는 원점 (0, 0)이 실제로 정의되어 있습니까?

특히 UIView와 관련하여 생각해 볼 때 매우 혼란 스럽습니다. CGView를 초기화 함수에 전달하여 glViewport와 그 밖의 모든 것들을 사각형에 설정하고 싶습니다.

감사합니다.

답변

6

EAGLView 클래스를 시작할 때 원하는 프레임으로 [super initWithFrame : frame]을 호출하기 만하면됩니다. 이 예제는 왼쪽 상단 모서리에 투명한 OpenGL 뷰를 생성하고 컨트롤러 뷰에 추가합니다. 내가 이렇게 내 컨트롤러에서 EAGLView를 생성 한 후

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     // get the layer 
     CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; 
     eaglLayer.opaque = NO; 
     eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithBool:NO], 
             kEAGLDrawablePropertyRetainedBacking, 
             kEAGLColorFormatRGBA8, 
             kEAGLDrawablePropertyColorFormat, 
             nil]; 
     context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];  
     if (!context || ![EAGLContext setCurrentContext:context]) { 
      [self release]; 
      return nil; 
     } 
     [EAGLContext setCurrentContext:context]; 
     [self destroyFramebuffer]; 
     [self createFramebuffer];   
    } 
    return self; 
} 

을 그리고 :

theEAGLView = [[EAGLView alloc] initWithFrame:CGRectMake(30.0f, 30.0f, 
                 90.0f, 70.0f)]; 
theEAGLView.opaque = NO; 
[self.view addSubview:theEAGLView]; 

의 실제 드로잉을 수행하는 코드

내 EAGLView 클래스에 다음 코드를 가지고 내 EAGLView 클래스가 컨트롤러에서 호출되어 다음과 같이 표시됩니다.

- (void)render { 
    glViewport(0, 0, backingWidth, backingHeight); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrthof(0.0f, backingWidth, 0.0f, backingHeight, 1000.0f, -1000.0f); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    // this is where we draw our stuff 
    // ... 
    // ... 

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 
+0

감사합니다. 나는 아직도 당신이 이것을 할 이유에 대해 혼란 스럽다 : glViewport (0, 0, backingWidth, backingHeight); glOrthof (0.0f, backingWidth, 0.0f, backingHeight, 1000.0f, -1000.0f); backingWidth 및 height가 320x480으로 설정되어 있고 드로잉 표면 (EAGLView)이 더 이상 전체 화면이 아닙니다. glViewport()와 EAGLView의 CGRect 사이의 관계는 무엇입니까? 아니면 완전히 독단적입니까? 또한 glOrtho() 호출에서 0에서 320이 아닌 EAGLView에서 너비가 최대 0이 되길 원하십니까? 도움 주셔서 감사합니다. – yozzozo

+0

EAGLView의 backingWidth 및 backingHeight는 EAGLView를 초기화 할 때 사용되는 CGRect의 크기로 설정됩니다. 그래서이 예에서 그들은 둘 다 30이 될 것입니다. –

관련 문제