2012-04-06 114 views
1

我需要一點幫助,在屏幕上繪製像素。我寫的代碼在模擬器上工作正常,但是當我在設備上部署時,它輸出垃圾。因此,這裏是我的代碼:OpenGL Es 2.0 GLKit繪製像素

我有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,並建議您編寫自己的着色器。 – 2013-02-07 02:01:02

+0

所以你可以在GLKView中使用自定義着色器,只要你避免GLKBaseEffect?我在解決這個問題時遇到了麻煩,但這可能只是我的代碼問題 - 我正在學習。 – 2013-02-07 02:57:32

+2

是的,我肯定會推薦它!真正的OpenGL ES愛好者更喜歡完全控制他們的視圖和緩衝區,但我喜歡GLKView,因爲它使得最終代碼變得更加精簡,而且不那麼麻煩,因此將焦點轉移到了真正重要的地方:着色器。 「隨你學習」是移動圖形遊戲的名稱。 – 2013-02-07 03:06:12