2012-04-07 4 views
0

GLKit을 사용하여 OpenGL es 2.0을 선택합니다. 사각형, 삼각형, 정육면체와 같은 도형을 성공적으로 그릴 수 있습니다.GLKit : GL_POINTS를 사용하는 도면 점

점 (그림 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.glsl

void main() 
{ 
    gl_PointSize = 10.0; 
} 

FragmentShader.glsl

:

나는 VertexShader.glslFragmentShader.glsl 파일이

void main() 
{ 

} 
나는 쉐이더를 설정하고 63,210

가 나는 효과를 바로 전에 나는 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 방법 위 업데이트 한 . 큰 값으로 버텍스 쉐이더에 gl_PointSize 변수를 설정 http://dl.dropbox.com/u/36638938/Template.zip

답변

1

시도 : 여기

이 프로젝트에 대한 링크입니다. 장치에서 단일 픽셀을 볼 수없는 경우 일 수 있습니다.

+0

저는 OpenGL ES 2.0을 처음 사용합니다. 어떻게하는지 조금 설명 할 수 있습니까? 나는 shadres에 대해 많이 모른다. – Asymptote

+0

이 [프로젝트] (https://bitbucket.org/xissburg/glkit-sample/src/6fb22a86e487/GLKSample/)에는 정점 셰이더가있는 glKit 샘플이 나와 있습니다. 버텍스 쉐이더의 main()에서 gl_PointSize = 5.0을 설정할 수 있습니다; –

+0

지적 해 주셔서 고맙습니다. 질문을 업데이트했으며 프로젝트에 대한 링크를 추가했습니다. 언제든지 glUseProgram (_program); 시뮬레이터 화면에는 아무 것도 표시되지 않습니다. – Asymptote