2012-04-07 35 views
0

我正在採用GLKit的opengl ES 2.0。我可以成功地繪製像正方形,三角形,立方體等形狀GLKit:繪製點使用GL_POINTS

我有問題繪圖點,這裏是我的代碼,它不是在設備上工作(iPod 4),雖然我可以看到點/點在視網膜模擬器。

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 

    //White background color 
    glClearColor(1.0, 1.0, 1.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    [self.effect prepareToDraw]; 

    //USING _program 
    glUseProgram(_program); 

    GLfloat vert[] = {0,0, 0.1,0.1, 0.2,0.2, 0.3,0.3, 0.4,0.4, 0.5,0.5}; 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, vert); 
    glDrawArrays(GL_POINTS, 0, 5); 
    glDisableVertexAttribArray(GLKVertexAttribPosition); 
} 

,這裏是我的更新方法只是參考:

- (void)update { 
    float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 4.0f, 10.0f);  
    self.effect.transform.projectionMatrix = projectionMatrix; 

    //Since visible range is 4 to 10 so have to mave back in z 
    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -6.0f); 
    self.effect.transform.modelviewMatrix = modelViewMatrix; 
} 

和下面的是我如何我定義的效果:

self.effect = [[GLKBaseEffect alloc] init]; 
self.effect.useConstantColor = GL_TRUE; 
self.effect.constantColor = GLKVector4Make(0.0, 0.0, 1.0, 1.0); //Blue color 

所以這點是在白色背景上可見。

有人可以指出這個代碼中的任何缺陷?我不知道爲什麼它不顯示在設備上,因爲三角形,正方形和立方體都是可見的。 任何幫助表示讚賞。

編輯:

我沒有使用着色器之前,所以這是我的第一次。正如Ben提到的示例代碼。下面是我現在在做什麼:

VertexShader.glslFragmentShader.glsl文件:

VertexShader.glsl

void main() 
{ 
    gl_PointSize = 10.0; 
} 

FragmentShader.glsl

void main() 
{ 

} 

我設立的着色器就在我創建的影響,並就在我設置EAGLContext:

// Setup shader 
GLuint vertexShader = [self createShaderWithFile:@"VertexShader.glsl" type:GL_VERTEX_SHADER]; 
GLuint fragmentShader = [self createShaderWithFile:@"FragmentShader.glsl" type:GL_FRAGMENT_SHADER]; 
_program = glCreateProgram(); 

glAttachShader(_program, vertexShader); 
glAttachShader(_program, fragmentShader); 
glLinkProgram(_program); 

GLint linked = 0; 
glGetProgramiv(_program, GL_LINK_STATUS, &linked); 
if (linked == 0) { 
    glDeleteProgram(_program); 
    return; 
} 

這裏是createShaderWithFile方法:

- (GLuint)createShaderWithFile:(NSString *)filename type:(GLenum)type 
{ 
    GLuint shader = glCreateShader(type); 

    if (shader == 0) { 
     return 0; 
    } 

    NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:filename]; 
    NSString *shaderString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; 
    const GLchar *shaderSource = [shaderString cStringUsingEncoding:NSUTF8StringEncoding]; 

    glShaderSource(shader, 1, &shaderSource, NULL); 
    glCompileShader(shader); 

    GLint success = 0; 
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success); 

    if (success == 0) { 
     char errorMsg[2048]; 
     glGetShaderInfoLog(shader, sizeof(errorMsg), NULL, errorMsg); 
     NSString *errorString = [NSString stringWithCString:errorMsg encoding:NSUTF8StringEncoding]; 
     NSLog(@"Failed to compile %@: %@", filename, errorString); 
     glDeleteShader(shader); 
     return 0; 
    } 

    return shader; 
} 

我也更新上述drawRect方法。

這裏是鏈接到這個項目:http://dl.dropbox.com/u/36638938/Template.zip

回答

1

嘗試在頂點着色器設置gl_PointSize變量爲較大的值。也許你無法在設備上看到一個像素。

+0

我是opengl es 2.0的新手,你能解釋一下怎麼做。我對莎德爾瞭解不多。 – Asymptote 2012-04-07 08:13:36

+0

這個[項目](https://bitbucket.org/xissburg/glkit-sample/src/6fb22a86e487/GLKSample/)展示了一個帶有頂點着色器的glKit示例。在頂點着色器的main()中,可以設置gl_PointSize = 5.0; – 2012-04-07 08:31:21

+0

感謝您指出,我已經更新了這個問題,並且添加了鏈接到我的項目中。每當我使用glUseProgram(_program);模擬器屏幕上沒有畫任何東西。 – Asymptote 2012-04-07 09:23:37