OpenGL ES Как правильно сочетать Ортоф и Фрустум - PullRequest
1 голос
/ 03 февраля 2012

Я начинаю изучать OpenGL ES 1.1 для iPhone и хотел бы нарисовать двухмерное изображение в ортографической проекции за несколькими трехмерными объектами. Используя учебники Джеффа Ламарша и книгу Pro OpenGL ES для iPhone, я разработал следующие несколько методов, чтобы попытаться это сделать. Если я отключу вызов на drawSunInRect, 3D-объекты будут отображаться очень хорошо, и я смогу перемещать их с помощью сенсорного управления и т. Д. Если я раскомментирую этот вызов и попытаюсь нарисовать изображение солнца, изображение появляется в CGRect, который я поставляю, но я не вижу никаких других моих трехмерных объектов - остальная часть экрана черная. Я пытался отключить / включить проверку глубины в разных местах, передать различные параметры в glOrthof() и перемещаться по прямоугольнику, но я продолжаю получать изображение солнца только при вызове метода drawSunInRect. Я предполагаю, что это покрывает мои трехмерные объекты.

// Draw Sun in Rect and with Depth
- (void)drawSunInRect:(CGRect)rect withDepth:(float)depth {

    // Get screen bounds
    CGRect frame = [[UIScreen mainScreen] bounds];

    // Calculate vertices from passed CGRect and depth
    GLfloat  vertices[] = 
    {
        rect.origin.x, rect.origin.y, depth,

        rect.origin.x + rect.size.width , rect.origin.y, depth,

        rect.origin.x, rect.size.height+rect.origin.y , depth,

        rect.origin.x + rect.size.width , rect.size.height+rect.origin.y ,depth
    };

    // Map the texture coords - no repeating
    static  GLfloat textureCoords[] = 
    {               
        0.0, 0.0,
        1.0, 0.0,
        0.0, 1.0,
        1.0, 1.0
    };

    // Disable DEPTH test and setup Ortho
    glDisable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glOrthof(0,frame.size.width,frame.size.height,0,0.1f,1000.0); 

    // Enable blending and configure
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);

    // Enable VERTEX and TEXTURE client states
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    // Enable Textures
    glEnable(GL_TEXTURE_2D); 

    // Projection Matrix Mode for ortho and reset
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();     
    glLoadIdentity();      

    // No lighting or Depth Mask for 2D - no Culling
    glDisable(GL_LIGHTING);                                                                                          
    glDepthMask(GL_FALSE);
    glDisable(GL_CULL_FACE);
    glDisableClientState(GL_COLOR_ARRAY);   

    // Define ortho
    glOrthof(0,frame.size.width,frame.size.height,0,0.1f,1000); 

     // From Jeff Lamarche Tutorials
     // glOrthof(-1.0,                                          // Left
     // 1.0,                                                    // Right
     // -1.0 / (rect.size.width / rect.size.height),            // Bottom
     // 1.0 / (rect.size.width / rect.size.height),             // Top
     // 0.01,                                                   // Near
     // 10000.0);                                               // Far

    // Setup Model View Matrix
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    // Bind and draw the Texture
    glBindTexture(GL_TEXTURE_2D,sunInt);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glTexCoordPointer(2, GL_FLOAT,0,textureCoords);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix();

    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    // Re-enable lighting 
    glEnable(GL_LIGHTING);  
    glDisable(GL_TEXTURE_2D);   
    glDisable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDepthMask(GL_TRUE);

}


// Override the draw in rect function
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{

    // Initialize and init the rotation stuff for the object
    // Identity Matrix
    glLoadIdentity();
    static GLfloat rot = 0.0;

    // Clear any remnants in the drawing buffers
    // and fill the background with black
    glClearColor(0.0f,0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Render the Sun - 2D Sun Image in CGRect
    //[self drawSunInRect:CGRectMake(100, 100, 50, 50) withDepth:-30.0]; // 2D Sun Image

    // Render the BattleCruiser - 3D Battlecruiser
    [self renderTheBattleCruiser];

    // Calculate a time interval to use to rotate the cruiser lives
    static NSTimeInterval lastDrawTime;
    if (lastDrawTime)
    {
        NSTimeInterval timeSinceLastDraw = [NSDate timeIntervalSinceReferenceDate] - lastDrawTime;
        rot += 75 * timeSinceLastDraw;                
    }
    lastDrawTime = [NSDate timeIntervalSinceReferenceDate];

}

UPDATE

Я изменил метод отрисовки солнца, чтобы у него было только 1 толчок и 1 щелчок для GL_PROJECTION. У меня все еще та же проблема. Изображение солнца появляется, но я не вижу свои 3D-объекты. Я попытался изменить порядок вызовов методов рендеринга, чтобы сначала отображались трехмерные объекты, но я получаю те же результаты. Я был бы признателен за другие идеи о том, как увидеть мою орфографическую текстуру и трехмерные объекты вместе.

// Draw Sun in Rect and with Depth
- (void)drawSunInRect:(CGRect)rect withDepth:(float)depth {

    // Get screen bounds
    CGRect frame = [[UIScreen mainScreen] bounds];

    // Calculate vertices from passed CGRect and depth
    GLfloat  vertices[] = 
    {
        rect.origin.x, rect.origin.y, depth,

        rect.origin.x + rect.size.width , rect.origin.y, depth,

        rect.origin.x, rect.size.height+rect.origin.y , depth,

        rect.origin.x + rect.size.width , rect.size.height+rect.origin.y ,depth
    };

    // Map the texture coords - no repeating
    static  GLfloat textureCoords[] = 
    {               
        0.0, 0.0,
        1.0, 0.0,
        0.0, 1.0,
        1.0, 1.0
    };

    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);

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

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();     
    glLoadIdentity();      

    glDisable(GL_LIGHTING);                                                                                          
    glEnable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);
    glDisableClientState(GL_COLOR_ARRAY);   

    glOrthof(0,frame.size.width,frame.size.height,0,0,1000);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    glColor4f(1,1,1,1);

    glBindTexture(GL_TEXTURE_2D,sunInt);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glTexCoordPointer(2, GL_FLOAT,0,textureCoords);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix();

    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    glEnable(GL_LIGHTING);  
    glDisable(GL_TEXTURE_2D);   
    glDisable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

1 Ответ

0 голосов
/ 05 февраля 2012

Я понял, что вызывал setClipping только один раз в моем viewController viewDidLoad. Я переместил его в свой метод glkView, и теперь я получаю свое изображение Солнца и мой трехмерный объект.

...