iOS将对象渲染到纹理

时间:2016-07-27 23:08:51

标签: ios opengl-es textures opengl-es-2.0 render

我目前正试图将OpenGL ES 2.0绘图过程划分为两半:前半部分,我将感兴趣的对象(即立方体或三角形)渲染到附有纹理的帧缓冲区,并且下半部分,我将该纹理应用到另一个帧缓冲区(即另一个立方体或三角形)中绘制的形状的面上。

我清除了用绿色绑定到纹理的帧缓冲区,并且能够将该颜色显示在我在另一个附加了主渲染缓冲区的帧缓冲区中绘制的三角形上,并且我调用[context presentRenderbuffer :renderbuffer] on。然而,无论我做什么,在我将其清除为绿色背景后,我都无法在该纹理中另外绘制另一个形状,并将其渲染到我绘制的形状上。

对于某些视觉参考,目前我正在我的主帧缓冲区中绘制一个正方形的屏幕,然后应用一个应该具有绿色背景和中间三角形的纹理,但我得到的只是这个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];
}

我需要采取哪些其他步骤才能使其正确绘制到纹理/正确应用于主帧缓冲区绘图?

1 个答案:

答案 0 :(得分:0)

没关系,事实证明我正在将三角形绘制到纹理上,但三角形只是自动默认为与背景纹理相同的颜色,因此它是一个完全不同的问题。