2009-07-06 6 views
0

Je suis nouveau à OpenGL, donc je suis sûr que c'est une erreur fictive, mais j'ai lu chaque poste, et examiné le code d'échantillon, et je ne peut pas trouver une différence, expliquant pourquoi glFrustum ne s'affichera pas comme je le voudrais.glFrustumf n'affiche que la couleur claire, les affichages de glOrthof comme prévu (OpenGL ES)

J'initialize OpenGL comme:

- (void) initOpenGL{ 
    glEnable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    //glLoadIdentity(); 
    //glOrthof(0.0f, self.bounds.size.width, self.bounds.size.height, 0.0f, -10.0f, 10.0f); 

    const GLfloat zNear = -0.1, zFar = 1000.0, fieldOfView = 60.0; 
    GLfloat size; 
    size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0); 

    // This give us the size of the iPhone display 
    CGRect rect = self.bounds; 
    glFrustumf(-size, size, -size/(rect.size.width/rect.size.height), size/(rect.size.width/rect.size.height), zNear, zFar); 
    glViewport(0, 0, rect.size.width, rect.size.height); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

#if 0 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
#endif 

    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 

#if TARGET_IPHONE_SIMULATOR 
    glColor4f(0.0, 0.0, 0.0, 0.0f); 
#else 
    glColor4f(0.0, 0.0, 0.0, 0.0f); 
#endif 

    [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"GreenLineTex.png"] filter:GL_LINEAR]; 

    glInitialised = YES; 

Et mon dessin se fait comme:

- (void)drawView { 
    if(!glInitialised) { 
     [self initOpenGL]; 
    } 

    [EAGLContext setCurrentContext:context]; 

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY);   
    glEnable(GL_TEXTURE_2D); 
    static const GLfloat texCoords[] = { 
     0.0, 0.0, 
     1.0, 0.0, 
     0.0, 1.0, 
     1.0, 1.0 
    }; 

    // draw the edges 
    glEnableClientState(GL_VERTEX_ARRAY); 
     glDisableClientState(GL_COLOR_ARRAY); 

    glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
    glBindTexture(GL_TEXTURE_2D, 1); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

    glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA); 

    for (int i = 0; i < connectionNumber; i++){ 

     Vertex2DSet(&vertices[0], connectionLines[i].lineVertexBeginPoint.x, connectionLines[i].lineVertexBeginPoint.y); 
     Vertex2DSet(&vertices[1], connectionLines[i].lineVertexBeginPoint.x+connectionLines[i].normalVector.x, connectionLines[i].lineVertexBeginPoint.y+connectionLines[i].normalVector.y); 
     Vertex2DSet(&vertices[2], connectionLines[i].lineVertexEndPoint.x, connectionLines[i].lineVertexEndPoint.y); 
     Vertex2DSet(&vertices[3], connectionLines[i].lineVertexEndPoint.x+connectionLines[i].normalVector.x, connectionLines[i].lineVertexEndPoint.y+connectionLines[i].normalVector.y); 

     glVertexPointer(2, GL_FLOAT, 0, vertices); 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    } 

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

Lorsque le bloc dans la boucle est un ensemble de sommets qui composent des bandes de triangle.

Si je décommente la ligne glOrthof(), alors je peux voir mon affichage, mais il est orthographique, et je voudrais déplacer l'appareil photo dedans et dehors, pour changer la mise à l'échelle de toute la scène.

Qu'est-ce que j'ai mal fait qui fait que glFrustumf() n'affiche que la couleur claire?

+0

J'ai oublié de mentionner que je vais utiliser glTranslatef() pour déplacer l'appareil photo dans et hors de la secene –

Répondre

2

Réponse courte: vous regardez dans la mauvaise direction.

Réponse longue: Votre tronc de cône est symétrique alors que votre matrice orthographique ne l'est pas. Donc, si votre modèle est configuré pour être visible dans le cas de glOrtho, il peut ne pas être visible avec votre glFrustum. De même, vous ne devez pas utiliser glOrtho et glFrustum ensemble, car les matrices sont multipliées et produiront sûrement une matrice de projection amusante.

Vous pouvez utiliser les tuteurs GL de Nate Robins au http://www.xmission.com/~nate/tutors.html pour expérimenter glFrustum et glOrtho (dans l'application "projection").

Questions connexes