2014-11-05 76 views
1

我一直在尝试最后两个半小时,以获得一个简单的2D纹理渲染器在ios上使用opengl工作。我试过下面的this教程无济于事。我检查了我的gl错误,检查了我的三角形排序,甚至尝试切换回ES1以使用固定的函数管道,这完全无济于事。我在这里完全失去了,出了什么问题?为了完整起见,这里是我的设置和借鉴代码:简单的二维纹理渲染

- (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(上下文,0,高度 - 高度) - 高度 - 高度始终为零......你的意思是 - 高度? – 2014-11-05 21:46:58

回答

0

从这段代码看来,你似乎缺少绑定着色器。

glUseProgram(program); 

还要确保着色器在运行程序时无错地编译。

该博客的作者还为github中的XCode提供了OpenGL ES 2.0项目示例。请看看它,https://github.com/jlamarche/iOS-OpenGLES-Stuff

+0

但使用固定功能时,着色器不应该是必需的。是否使用固定功能不再是一个选项? – 2014-11-05 17:41:11