2013-11-13 3 views
1

Я пытаюсь провести две параллельные линии. Я могу нарисовать одну строку, но когда я иду, чтобы нарисовать вторую строчку, то никто не рисует. Не знаю, почему.Рисовать сетку в OpenGL ES 2.0

У меня есть класс Line, который выглядит следующим образом:

#import "Line.h" 

    static GLKBaseEffect *effect; 

    @implementation Line 

    typedef struct { 
     GLKVector3 positionCoordinates; 
     GLKVector4 colorCoordinates; 
    } VertexData; 

    VertexData unitLine[] = { 
    //{ { position x, position y, position z}, {red, blue, green, alpha} } 
     { { -0.5f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f} }, 
     { { 0.5f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f} } 
    }; 

    - (id) initWithEffect:(GLKBaseEffect *) effect { 

    if (self = [super init]) { 

     self.effect = effect; 

     glGenVertexArraysOES(1, &_vertexArray); 
     glBindVertexArrayOES(_vertexArray); 

     glGenBuffers(1, &_vertexBuffer); 
     glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
     glBufferData(GL_ARRAY_BUFFER, sizeof(unitLine), unitLine, GL_STATIC_DRAW); 

     glEnableVertexAttribArray(GLKVertexAttribPosition); 
     glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (GLubyte *)0 + offsetof(VertexData, positionCoordinates)); 
     glEnableVertexAttribArray(GLKVertexAttribNormal); 
     glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (GLubyte *)0 + offsetof(VertexData, normalCoordinates)); 

     glBindVertexArrayOES(0); 

    } 

    return self; 
} 

- (GLuint) getVertexArray 
{ 
    return _vertexArray; 
} 

- (void) render { 
    glClear(GL_COLOR_BUFFER_BIT); 
    [self.effect prepareToDraw]; 
    glDrawArrays(GL_LINES, 0, 2); 
} 

- (void) update { 

} 

- (void) tearDown 
{ 
    glDeleteBuffers(1, &_vertexBuffer); 
    glDeleteVertexArraysOES(1, &_vertexArray); 
} 

@end 

Тогда, в GLKview, я пытаюсь сделать эти две линии, как это:

В ViewController.m, у меня есть это:

@interface ViewController() { 
    GLuint _program, _program1; 
    GLint i; 
    GLfloat j; 

    GLKMatrix4 _modelViewProjectionMatrix; 
    GLfloat _model_translate_x; 
    GLfloat _model_translate_y; 
    GLfloat _model_translate_z; 

    Cube *my_cube; 
    Line *my_line[20]; // for the grid lines  
} 

- (void)viewDidLoad 
{ 
    ... 
    for (i=0; i<20; i++) { 
     my_line[i] = [[Line alloc] initWithEffect: self.effect]; 
    } 
    ... 
} 

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    ... 
    modelViewMatrix = GLKMatrix4MakeTranslation(_model_translate_x, _model_translate_y, _model_translate_z); 
    modelViewMatrix = GLKMatrix4Scale(modelViewMatrix, 10.0, 1.0, 1.0); 

    glBindVertexArrayOES([my_line[0] getVertexArray]); 
    modelViewMatrix = GLKMatrix4Translate(modelViewMatrix, 0.0f, 0.0f, 0.0f); 
    [my_line[0] render]; 

    modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.5f, 0.0f); 
    [my_line[1] render]; 
} 

Если я прокомментирую последнюю строку, то получаю одну строку. Если я оставлю это, у меня не будет линий. В любом случае, я также получаю сообщение об ошибке консоли 0x0502. Что я делаю не так? Благодаря!

ОБНОВЛЕНИЕ: У меня есть другие объекты, которые были сделаны до этого кода. До сих пор эти объекты правильно рисовались. Кажется, что как только [my_line[0] render] выполняет, все остальные объекты исчезают. Что мне делать, чтобы исправить это?

+0

Является ли 'modelViewMatrix 'локальной или переменной экземпляра? Если вы ничего не делаете с свойством 'transform' вашего экземпляра' GLKBaseEffect' (и вызывая его метод 'prepareToDraw' после каждого изменения и перед рисованием), вы не увидите никаких изменений. – rickster

+0

'modelViewMatrix' является локальной переменной. Я добавил больше кода на свой пост, чтобы вы могли видеть больше того, что я делаю. Может быть, я инициализирую свой массив объектов «Line» неправильно? – Alex

+0

Спасибо за совет. Что мне нужно сделать для свойства 'transform' и где я должен называть' prepareToDraw'. Как вы можете сказать, я новичок в этом материале ES 2.0, так что это то, с чем я борюсь. Благодаря! – Alex

ответ

0

Чтобы нарисовать линии, вы вызываете рендер и визуализируете цветной буфер. Поэтому все, что вы нарисовали, исчезает.

+0

Спасибо. Даже когда я вынимаю эти прозрачные цветовые буферы, у меня все равно нет линий для рисования. Мое сообщение об ошибке исчезло, хотя ... – Alex