2012-04-06 1 views
1

Мне нужна небольшая помощь при рисовании пикселей на экране. Код, который я написал, отлично работает на симуляторе, но когда я развертываю на устройстве, он выводит мусор. Так вот мой код:OpenGL Es 2.0 GLKit Draw Pixel

Я установки GLKViewController и вот viewDidLoad:

- (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.effect = [[GLKBaseEffect alloc] init]; 


    self.effect.useConstantColor = GL_TRUE; 

    self.effect.constantColor = GLKVector4Make(
               0.0, // Red 
               0.0, // Green 
               0.0, // Blue 
               1.0f);// Alpha 

    GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(0, 480, 0, 320, -1024, 1024); 
    self.effect.transform.projectionMatrix = projectionMatrix; 

} 

А вот где я рисую точек/пикселей:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    GLfloat points[] = 
    { 
     110.0f, 110.0f, 
     111.0f, 110.0f, 
     110.0f, 111.0f, 
     111.0f, 111.0f, 

     112.0f, 112.0f, 
     113.0f, 112.0f, 
     112.0f, 113.0f, 
     113.0f, 113.0f, 
    }; 

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

    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 0.0f); 
    self.effect.transform.modelviewMatrix = modelViewMatrix; 


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

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 2*4, points); 
    glDrawArrays(GL_POINTS, 0, 8); 

} 

Когда я бегу на тренажере это работает то есть нарисовать пиксели соответственно, но когда я развертываю на iPod4, он отображает некоторый мусор. Я новичок, поэтому вам нужна помощь в отображении простых пикселей.

ответ

2

Я считаю, что проблема заключается в том, что вам нужно установить встроенную переменную gl_PointSize в вершинном шейдере, поскольку значения по умолчанию различаются на симуляторе и устройстве.

Ответ на вопрос this question объясняет далее.

+1

Это похоже на правильное объяснение, однако, если вы используете GLKBaseEffect, то у вас не будет доступа к вершинному шейдеру. GLKit отлично подходит для простой настройки дисплея и предотвращения буферов, но я бы серьезно советовал против GLKBaseEffect и вместо этого предложил вам написать свои собственные шейдеры. –

+0

Итак, вы можете использовать пользовательские шейдеры в GLKView, если вы избегаете GLKBaseEffect? У меня возникают проблемы с тем, чтобы это работало, но это, вероятно, просто проблема с моим кодом - я учусь, когда я ухожу. –

+2

Да, и я определенно рекомендую! Истинные энтузиасты OpenGL ES предпочитают иметь полный контроль над своими представлениями и буферами, но я люблю GLKView, потому что он делает конечный код более компактным и менее мазным - отсюда смещение фокуса на то, что действительно важно: шейдеры. «Узнайте, как вы идете» - это название игры с мобильной графикой. –