2016-07-27 115 views
0

我目前正在嘗試將OpenGL ES 2.0繪圖過程分爲兩部分:第一部分將感興趣的對象(即立方體或三角形)呈現給幀緩衝區,該幀緩衝區具有貼在它上面的紋理,下半部分我將紋理應用到在另一個幀緩衝區(即另一個立方體或三角形)中繪製的形狀的表面上。iOS將對象渲染爲紋理

我清除綁定到具有綠色的紋理的framebuffer,並且已經能夠獲得該顏色以顯示在我已經繪製在另一個具有附加的主要渲染緩衝區並且我調用[上下文presentRenderbuffer:渲染緩衝]。但是,無論我做什麼,在將它清除爲綠色背景後,我都無法另外在該紋理中繪製另一個形狀,並將其渲染到我繪製的形狀上。

對於一些視覺參考,目前我正在繪製一個正方形到我的主幀緩衝區中的屏幕,然後應用一個應該具有綠色背景加上中間三角形的紋理,但我所得到的是這green screen

它擁有我目前想要的一切,除了沒有也在中間的三角形。從本質上講,它應該看起來像一個綠色的大方塊,在它的中間有一個黑色的三角形,綠色和三角形都來自紋理(正方形本來是黑色的)。

我的紋理繪製方法和主幀緩衝區繪製方法如下(無需設置代碼):

- (BOOL) loadModelToTexture: (GLuint*) tex { 
    GLuint fb; 
    GLenum status; 

    glGenFramebuffers(1, &fb); 

    // Set up the FBO with one texture attachment 
    glBindFramebuffer(GL_FRAMEBUFFER, fb); 
    glGenTextures(1, tex); 
    glBindTexture(GL_TEXTURE_2D, *tex); 

    NSLog(@"Error1: %x", glGetError()); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, 
       GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
          GL_TEXTURE_2D, *tex, 0); 

    status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 

    if (status != GL_FRAMEBUFFER_COMPLETE) { 
     // Handle error here 
     NSLog(@"Loading model to texture failed"); 
     return FALSE; 
    } 

    glClearColor(0.0f, 1.0f, 0.0f, 1.0f); // Set color's clear-value to red 
    glClearDepthf(1.0f);   // Set depth's clear-value to farthest 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glViewport(0, 0, self.frame.size.width*self.contentsScale, self.frame.size.height*self.contentsScale); 

    NSLog(@"Error2: %x", glGetError()); 

    // Update attribute values. 
    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, vertices); 
    glEnableVertexAttribArray(ATTRIB_VERTEX); 
    NSLog(@"Error3: %x", glGetError()); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

    return TRUE; 
} 

- (void) draw { 
    [EAGLContext setCurrentContext:context]; 

    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 

    glClearColor(0.0f, 0.5f, 0.5f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glViewport(0, 0, self.frame.size.width*self.contentsScale, self.frame.size.height*self.contentsScale); 

    // Use shader program. 
    glUseProgram(program); 

    // Update attribute values. 
    glEnableVertexAttribArray(ATTRIB_VERTEX); 
    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, vertices); 

    //for some reason this is unneeded, but I'm not sure why 
    glVertexAttribPointer(ATTRIB_TEXTURE_COORD, 2, GL_FLOAT, 0, 0, texCoords); 
    glEnableVertexAttribArray(ATTRIB_TEXTURE_COORD); 

    glBindTexture(GL_TEXTURE_2D, textureName0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glDrawArrays(GL_TRIANGLES, 3, 3); 

    [context presentRenderbuffer:renderbuffer]; 
} 

做什麼其他步驟我需要得到它正確繪製紋理/正確適用到主框架緩衝區繪圖?

回答

0

沒關係,事實證明我正在繪製我的三角形紋理,但三角形自動默認爲與背景紋理相同的顏色,所以這是一個完全不同的問題。