Нарисуйте прямую линию, используя OpenGL ES в iPhone? - PullRequest
2 голосов
/ 16 марта 2012

Наконец, я попытался нарисовать линию, используя платформу OpenGL ES в XCode 4.2 для простого игрового приложения для iPhone. Я изучил кое-что о GLKView и GLKViewController, чтобы нарисовать линию в iPhone. Вот мой пример кода, который я пробовал в моем проекте,

@synthesize context = _context;
@synthesize effect = _effect;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }


    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
    [EAGLContext setCurrentContext:self.context];

    //[self setupGL];
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    NSLog(@"DrawInRect Method");

    [EAGLContext setCurrentContext:self.context];

    // This method is calling multiple times....

    glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


   const GLfloat line[] = 
   {
        -0.5f, -0.5f, //point A 
        0.5f, -0.5f, //point B  
   };
   glVertexPointer(2, GL_FLOAT, 0, line);
   glEnableClientState(GL_VERTEX_ARRAY);
   glDrawArrays(GL_LINES, 0, 2);
}

Когда я запускаю проект, только серый цвет появляется только на экране, строка не отображается. А также - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect делегат вызывает бесконечное время. Пожалуйста, направьте меня туда, где я делаю неправильно. Почему линия не появляется или не рисуется? Можете ли вы помочь? Пытаюсь это 2 дня. Заранее спасибо.

1 Ответ

5 голосов
/ 22 марта 2012

Я, скорее, сам сейчас изучаю OpenGL ES 2.0.Я рекомендую сначала запустить новый проект в Xcode с шаблоном «OpenGL Game», который предоставляет Apple.

Помимо прочего, код шаблона Apple будет включать в себя создание GLKBaseEffect, который предоставляет некоторые функциональные возможности шейдера, которые, по-видимому, необходимы для возможности рисования с помощью OpenGL ES 2.0.(Без GLKBaseEffect вам потребуется использовать GLSL. Шаблон предоставляет пример как с явным кодом шейдера GLSL, так и без него.)

Шаблон создает функцию «setupGL», которую я изменил, чтобы она выглядела так:

- (void)setupGL
{
    [EAGLContext setCurrentContext:self.context];

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

    // Let's color the line
    self.effect.useConstantColor = GL_TRUE;

    // Make the line a cyan color
    self.effect.constantColor = GLKVector4Make(
        0.0f, // Red
        1.0f, // Green
        1.0f, // Blue
        1.0f);// Alpha
}

Мне удалось нарисовать линию, добавив еще несколько шагов.Все это включает в себя отправку данных в графический процессор для обработки.Вот моя функция glkView: drawInRect:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Prepare the effect for rendering 
    [self.effect prepareToDraw];

    const GLfloat line[] = 
    {
        -1.0f, -1.5f, //point A 
        1.5f, -1.0f, //point B  
    };

    // Create an handle for a buffer object array
    GLuint bufferObjectNameArray; 

    // Have OpenGL generate a buffer name and store it in the buffer object array 
    glGenBuffers(1, &bufferObjectNameArray); 

    // Bind the buffer object array to the GL_ARRAY_BUFFER target buffer  
    glBindBuffer(GL_ARRAY_BUFFER, bufferObjectNameArray); 

    // Send the line data over to the target buffer in GPU RAM
    glBufferData(
        GL_ARRAY_BUFFER,   // the target buffer 
        sizeof(line),      // the number of bytes to put into the buffer
        line,              // a pointer to the data being copied 
        GL_STATIC_DRAW);   // the usage pattern of the data 

    // Enable vertex data to be fed down the graphics pipeline to be drawn
    glEnableVertexAttribArray(GLKVertexAttribPosition); 

    // Specify how the GPU looks up the data 
    glVertexAttribPointer(
        GLKVertexAttribPosition, // the currently bound buffer holds the data 
        2,                       // number of coordinates per vertex 
        GL_FLOAT,                // the data type of each component 
        GL_FALSE,                // can the data be scaled 
        2*4,                     // how many bytes per vertex (2 floats per vertex)
        NULL);                   // offset to the first coordinate, in this case 0 

    glDrawArrays(GL_LINES, 0, 2); // render 

}

Кстати, я проходил Изучение OpenGL ES для iOS от Эрика Бака , которую вы можете купить в форме "Rough Cut" черезО'Рейли (ранняя форма книги, поскольку она не будет полностью опубликована до конца года).На этой стадии в книге довольно много опечаток и нет картинок, но я все же нашел ее весьма полезной.Исходный код книги, кажется, очень далеко, и вы можете взять его на его блог .Автор также написал отличную книгу Cocoa Design Patterns.

...