iOS将对象渲染到纹理

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

我清除了用绿色绑定到纹理的framebuffer,并且已经能够让该颜色出现在我绘制在另一个具有附加的主渲染缓冲区的帧缓冲区中的三角形上,并且我调用[context presentRenderbuffer:renderbuffer]上。 但是,无论我做什么,在将它清除为绿色背景后,我都无法另外在该纹理中绘制另一个形状,并将其渲染到我绘制的形状上。

对于一些视觉参考,目前我在我的主帧缓冲区中画一个正方形到屏幕上,然后应用一个应该有绿色背景和中间三角形的纹理,但是我得到的只是这个绿色屏幕。

它具有我目前想要的一切,除了中间没有三角形。 从本质上讲,它应该看起来像一个绿色的大方块,在它的中间有一个黑色的三角形,绿色和三角形都来自纹理(正方形本来是黑色的)。

我的纹理绘图方法和主要的帧缓冲区绘图方法包含在下面(没有设置代码):

- (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];
}

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


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

链接地址: http://www.djcxy.com/p/33911.html

上一篇: iOS Rendering a object to a texture

下一篇: OpenGL ES 2.0 cubemap is not showing a texture