简单的2d纹理渲染

时间:2014-11-05 16:30:08

标签: ios opengl-es

我在过去的两个半小时里一直试图在ios上使用opengl es来制作一个简单的2D纹理渲染器。我尝试过跟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%完全相同的代码工作?

1 个答案:

答案 0 :(得分:0)

从该代码开始,您似乎无法绑定着色器。

glUseProgram(program);

在运行程序时,还要确保着色器编译时没有错误。

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