2014-11-05 4 views
1

저는 지난 2 시간 반 동안 ios에서 OpenGL es를 사용하여 간단한 2D 텍스처 렌더러를 사용하려고 노력해 왔습니다. 나는 this 튜토리얼을 따르지 않으려 고 노력했다. 내 gl 오류를 점검하고, 삼각형 순서를 검사하고, ES1로 다시 전환하여 고정 기능 파이프 라인을 사용하여 전혀 쓸모 없음을 시도했습니다. 나는 완전한 손실에 처해있다. 무엇이 잘못 될까? 완전성 '을 위해, 여기 나의 설정은 코드 그릴 : 그 접근 방식을 폐기 한 후간단한 2D 텍스처 렌더링

- (void)setupGL 
{ 
    [EAGLContext setCurrentContext:self.context]; 

    GLenum err = 0; 

    glEnable(GL_TEXTURE_2D); 
    CHECK_GL_ERR(); 
    glEnable(GL_BLEND); 
    CHECK_GL_ERR(); 
    glBlendFunc(GL_ONE, GL_SRC_COLOR); 
    CHECK_GL_ERR(); 

    glGenTextures(1, &texture); 
    CHECK_GL_ERR(); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    CHECK_GL_ERR(); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    CHECK_GL_ERR(); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    CHECK_GL_ERR(); 

    UIImage *image = [UIImage imageNamed:@"GL_Target"]; 
    if (image == nil) 
     NSLog(@"Do real error checking here"); 

    GLuint width = CGImageGetWidth(image.CGImage); 
    GLuint height = CGImageGetHeight(image.CGImage); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    void *imageData = malloc(height * width * 4); 
    CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 
    CGContextClearRect(context, CGRectMake(0, 0, width, height)); 
    CGContextTranslateCTM(context, 0, height - height); 
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 
    CHECK_GL_ERR(); 

    CGContextRelease(context); 

    free(imageData); 

    effect = [[GLKBaseEffect alloc] init]; 
} 


-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
GLfloat rot = 0.0; 

    GLenum err = 0; 

    glColor4f(0.0, 0.0, 0.0, 0.0); 
    CHECK_GL_ERR(); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    CHECK_GL_ERR(); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    CHECK_GL_ERR(); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    CHECK_GL_ERR(); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    CHECK_GL_ERR(); 

    static const GLfloat vertices[] = { 
     -1.0, 1.0, -0.0, 
     1.0, 1.0, -0.0, 
     -1.0, -1.0, -0.0, 
     1.0, -1.0, -0.0 
    }; 
    static const GLfloat normals[] = { 
     0.0, 0.0, 1.0, 
     0.0, 0.0, 1.0, 
     0.0, 0.0, 1.0, 
     0.0, 0.0, 1.0 
    }; 
    static const GLfloat texCoords[] = { 
     0.0, 1.0, 
     1.0, 1.0, 
     0.0, 0.0, 
     1.0, 0.0 
    }; 

    glLoadIdentity(); 
    CHECK_GL_ERR(); 
    glTranslatef(0.0, 0.0, -3.0); 
    CHECK_GL_ERR(); 
    glRotatef(rot, 1.0, 1.0, 1.0); 
    CHECK_GL_ERR(); 

    glBindTexture(GL_TEXTURE_2D, texture); 
    CHECK_GL_ERR(); 
    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    CHECK_GL_ERR(); 
    glNormalPointer(GL_FLOAT, 0, normals); 
    CHECK_GL_ERR(); 
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
    CHECK_GL_ERR(); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    CHECK_GL_ERR(); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    CHECK_GL_ERR(); 
    glDisableClientState(GL_NORMAL_ARRAY); 
    CHECK_GL_ERR(); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    CHECK_GL_ERR(); 

    static NSTimeInterval lastDrawTime; 
    if (lastDrawTime) 
    { 
     NSTimeInterval timeSinceLastDraw = [NSDate timeIntervalSinceReferenceDate] - lastDrawTime; 
     rot+= 60 * timeSinceLastDraw; 
    } 
    lastDrawTime = [NSDate timeIntervalSinceReferenceDate]; 
} 

편집

을 내가 실제로 빌드 얻을 수 있었기 때문에, 지금, this project을 반영하기 위해 노력하고 있어요 실행하고 렌더링 할 수 있습니다. 중요하다고 생각한 코드를 복사 한 다음 한 줄씩 복사 한 다음 전체 파일 내용을 복사 한 다음 전체 파일을 복사 한 다음 새로운 프로젝트를 만들고보기 컨트롤러, 스프라이트 및 스토리 보드 파일에 복사 한 다음 작동하지 않습니다. 내가 누락시킨 프로젝트 설정의 어떤 부분은 새로운 프로젝트가 작동하는 프로젝트와 완전히 동일한 코드를 100 % 사용하지 못하게 만드는 것입니까?

+0

이 줄이 맞습니까? CGContextTranslateCTM (context, 0, height - height) - height - height는 항상 0이 될 것입니다. –

답변

0

그냥 코드에서 쉐이더 바인딩이 누락 된 것 같습니다.

glUseProgram(program); 

또한 프로그램을 실행할 때 쉐이더가 오류없이 컴파일되는지 확인하십시오.

블로그 작성자는 github에서 XCode 용 OpenGL ES 2.0 프로젝트 샘플을 가지고 있습니다. 제발 봐, https://github.com/jlamarche/iOS-OpenGLES-Stuff

+0

그러나 고정 기능을 사용할 때는 셰이더가 필요하지 않습니다. 고정 기능을 더 이상 사용할 수 없습니까? –