белый экран при отображении второй текстуры на обратной стороне представления OpenGLES - PullRequest
1 голос
/ 20 мая 2011

То, что я пытаюсь получить, - это перевернутая анимация, где на лицевой стороне изображена миниатюра альбома, и она поворачивается и масштабируется до большего изображения, отображающего детали альбома.Я могу отобразить переднюю текстуру из UIVIew, но для задней текстуры я получаю только белый экран.

    - (void) prepareTexturefrom:(UIView*) fromView To:(UIView*) toView {
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glViewport(0, 0, rect.size.width, rect.size.height);  
    // Turn necessary features on
       glEnable(GL_TEXTURE_2D); 

      /* Create front Texture in texture[0] , which renders fine*/
     ...
     /*Create back Texture in texture[1], I only get white screen */
     maxTextureSize = 1024  
    // Get a image of the screen
    UIGraphicsBeginImageContext(animateTo.size);
    [toView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage* image2 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


    // make space for an RGBA image of the view
    GLubyte *pixelBuffer = (GLubyte*)calloc(maxTextureSize*4, maxTextureSize);  
    // create a suitable CoreGraphics context
    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef textureContext2 =
    CGBitmapContextCreate(pixelBuffer, 
                          maxTextureSize, maxTextureSize, 
                          8, 4*maxTextureSize, 
                          colourSpace, 
                          kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colourSpace);

    CGContextDrawImage(textureContext2, CGRectMake(0, maxTextureSize-animateTo.size.height,animateTo.size.width, animateTo.size.height), 
                       image2.CGImage);
    //CGContextRelease(textureContext);

    glGenTextures(1, &texture[1]);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//  glTexSubImage2D(GL_TEXTURE_2D, 0, (maxTextureSize - toView.bounds.size.width) /2, //(maxTextureSize - toView.bounds.size.height) /2, toView.bounds.size.width, //toView.bounds.size.height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);
    glTexImage2D(GL_TEXTURE_2D, 0, 
                 GL_RGBA,
                 toView.bounds.size.width, toView.bounds.size.height, 0,
                 GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);


    // clean up
    CGContextRelease(textureContext2);
    //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, maxTextureSize, maxTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);
    free(pixelBuffer);
    CADisplayLink *aDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawFrame:)];
    [aDisplayLink setFrameInterval: 2];
    [aDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

В функции DisplayLink:

    - (void) drawFrame:(CADisplayLink*) displayLink {
     /* setup */
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        const GLfloat zNear = 1, zFar = -1000.0, fieldOfView = 45.0; 
        glMatrixMode(GL_PROJECTION); 
        glLoadIdentity();
        glMatrixMode(GL_MODELVIEW);
        glViewport(0, 0, rect.size.width, rect.size.height);  
        glEnable(GL_CULL_FACE);

        // Turn necessary features on
        glEnable(GL_TEXTURE_2D);    



     static const GLfloat vertices[] = {
        - 300.0 / 768 , - 266.0 / 1024 , //bottom left
         300.0 / 768, - 266.0 / 1024 ,  //bottom right
        -  300.0 / 768,  266.0 / 1024 , //top left
         300.0 / 768,  266.0 / 1024   // top right
    };

 GLfloat texcoords[] = {
        0, 1,
        1, 1,
        0, 0,
        1, 0,
    };

   /* Do Rotate, Scale Transformations */
   ......


   /* Draw the textures */

    glEnableClientState(GL_VERTEX_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);    
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glRotatef(180, 0, 1, 0);    
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);


}

1 Ответ

1 голос
/ 20 мая 2011

glDisable(GL_CULL_FACE) вместо glEnable(GL_CULL_FACE);, в общем-то, отключит отбраковку лицевой стороны, которая позволяет рисовать только многоугольники, направленные к камере (для обычных 3D-объектов это отличная оптимизация, но не в вашем случае)

...