2014-11-05 88 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