2013-10-27 2 views
3

OpenGL 2.0을 사용하여 직사각형을 그립니다. 처음에는 뷰포트가 위에서 보았고 예상대로 사각형을 볼 수 있습니다. 그런 다음 x 축을 중심으로이 직사각형을 회전하기 시작합니다. 회전 각도가 -90deg (또는 다른 방향으로 회전하면 +90 °) 일 때 사각형이 사라집니다. 내가 90deg/-90deg를 지나치게 회전했을 때 직사각형의 아래쪽 표면이 보이지만 대신 뷰가 사라지면 어떻게 될지 예상됩니다. 윗면이 거의 표시 될 준비가되었을 때 전체 회전 각은 -270도 (또는 + 270도)로 다시 나타납니다.회전 중에 OpenGL보기가 사라집니다.

내가 회전하는 동안 상단 및 하단 모두가 보일 수 있도록하려면 어떻게해야합니까? 여기

'코드 관련 부분 :

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch * touch = [touches anyObject]; 
    if ([touches count] == 1) { 
     CGPoint currLoc = [touch locationInView:self]; 
     CGPoint lastLoc = [touch previousLocationInView:self]; 
     CGPoint diff = CGPointMake(lastLoc.x - currLoc.x, lastLoc.y - currLoc.y); 

     rotX = -1 * GLKMathDegreesToRadians(diff.y/2.0); 
     rotY = -1 * GLKMathDegreesToRadians(diff.x/2.0); 

     totalRotationX += ((rotX * 180.0f)/3.141592f); 

     NSLog(@"rotX: %f, rotY: %f, totalRotationX: %f", rotX, rotY, totalRotationX); 

     //rotate around x axis 
     GLKVector3 xAxis = GLKMatrix4MultiplyVector3(GLKMatrix4Invert(_rotMatrix, &isInvertible), GLKVector3Make(1, 0, 0)); 
     _rotMatrix = GLKMatrix4Rotate(_rotMatrix, rotX, xAxis.v[0], 0, 0); 
    } 
} 


-(void)update{ 
    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0, 0, -6.0f); 
    modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, _rotMatrix); 
    self.effect.transform.modelviewMatrix = modelViewMatrix; 

    float aspect = fabsf(self.bounds.size.width/self.bounds.size.height); 
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0, 10.0f); 
    self.effect.transform.projectionMatrix = projectionMatrix; 
} 

- (void)setupGL { 

    NSLog(@"setupGL"); 
    isInvertible = YES; 
    totalRotationX = 0; 
    [EAGLContext setCurrentContext:self.context]; 
    glEnable(GL_CULL_FACE); 

    self.effect = [[GLKBaseEffect alloc] init]; 

    // New lines 
    glGenVertexArraysOES(1, &_vertexArray); 
    glBindVertexArrayOES(_vertexArray); 

    // Old stuff 
    glGenBuffers(1, &_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 

    glGenBuffers(1, &_indexBuffer); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); 

    glViewport(0, 0, self.frame.size.width, self.frame.size.height); 

    // New lines (were previously in draw) 
    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position)); 
    glEnableVertexAttribArray(GLKVertexAttribColor); 
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color)); 

    _rotMatrix = GLKMatrix4Identity; 

    // New line 
    glBindVertexArrayOES(0); 

    initialized = 1; 
} 

나는 OpenGL을에 초보자이고 내가 OpenGL을 2.0

감사와 함께 GLKit을 사용하고 있습니다.

+0

가능한 원인은 후면면 제거 (일반적으로 기본적으로 사용하지 않도록 설정 됨)이거나 조명이 완전히 검은 색이어서 배경과 구별 할 수없는 원인 일 수 있습니다. – jozxyqk

+0

니어 클리핑면은 0이 아니어야합니다. 'GLKMatrix4MakePerspective (GLKMathDegreesToRadians (65.0f), aspect, 0.01f, 10.0f);'로 변경해보십시오. 또한 단지'xAxis.v [0]'이 회전에 맞지 않습니다. 'rotX'는 회전이고 다음 세 값은 회전 할 축입니다. 'GLKMatrix4Rotate (_rotMatrix, rotX, 1, 0, 0);'만 시도해보십시오. – jozxyqk

+0

@jozxyqk 내 얼굴 컬링이 내 코드에서 사용 가능합니다. 내 질문을 편집하고 다시 '도형 제거'가 가능한 'setupGL()'메서드를 추가했습니다. –

답변

2

OpenGL에서 렌더링되지 않는 경우 많은 원인이 있습니다. 이 경우 뒷면 면접 (질문에 대한 의견 참조)이었습니다. 배면 컬링은 카메라에서 멀어지는 삼각형을 무시하고 일부 래스터 화/조각 처리 시간을 절약 할 수 있기 때문에 유용합니다. 많은 메쉬/물체가 방수 상태이므로 내부를 보지 않으려 고합니다. 양면 음영을 실제로 원하는 것은 드뭅니다. 이 기능은 삼각형의 앞면/뒷면을 정의하는 것으로 시작됩니다. 이것은 꼭지점이 주어진 순서대로 이루어집니다 (굴곡 방향이라고도 함).

glEnable(GL_CULL_FACE); //discards triangles facing away from the camera 
glDisable(GL_CULL_FACE); //default, two-sided rendering 

일부 다른 : glFrontFace (나는 몇 가지가 모두 필요에별로 포인트를 주장 할 수 추측) 그리고 마지막으로 활성화/비활성화 다시 하나가 전면 또는 도태하는 glCullFace이 선택하는 전달을 정의하는 방향 시계 방향/반 시계 방향을 선택 지오메트리가 보이지 않는지 확인합니다.

  • 지오메트리 색상이 배경과 동일합니까? 흑백이 아닌 배경을 선택하면 편리합니다.
  • 지오메트리는 실제로보기 볼륨 내에서 그립니다. 간단한 객체를 던져 (즉각적인 모드가 도움이됩니다.) 신원 투영/모델 뷰를 사용하여이를 배제 할 수 있습니다.
  • 보기 음량이 정확한지 확인하십시오. 가까운/먼 비행기가 너무 멀리 떨어져서 (z- 싸움을 일으킴) 또는 0.0f 비행기 근처가 일반적인 문제입니다. 또한 투영 행렬로 전환 할 때 Z = 0 평면에서 아무 것도 그리지 않으면 더 이상 표시되지 않습니다.
  • 블렌딩이 활성화되어 있으며 모든 것이 투명합니다.
  • 깊이 버퍼가 지워지지 않고 후속 프레임이 삭제됩니다.
  • 고정 파이프 라인 렌더링에서 glTranslate/glRotate 변환이 이전 프레임에서 이월되어 개체가 멀리 떨어져 나가게합니다. 항상 디스플레이 기능의 상단에 glLoadIdentity을 유지하십시오. 명확한/그릴/swapbuffers 물론
  • 더 힙을있다 - -
  • 이 제대로 구조화 렌더링 루프가 지오메트리 쉐이더, 같은 위치에 정점을 변환 정점 셰이더 아무것도 출력하지 (그래서 그들은 모든 타락한 것), 조각 쉐이더 통화 VBO 바인딩/인덱싱 문제 등을 버려야합니다.GL 오류를 확인하는 것은 필수적이지만 모든 실수를 포착해서는 안됩니다.
관련 문제