3

我很难尝试在 OpenGL ES 2.0 中设置渲染到纹理环境。

我需要的是呈现给屏幕的主 FrameBuffer 和连接到纹理的辅助 FrameBuffer。然后在主 FrameBuffer 中使用此纹理。

我首先使用以下代码初始化主 FrameBuffer:

-(void)initializeBuffers{

    //Build the main FrameBuffer
    glGenFramebuffers(1, &frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

    //Build the color Buffer
    glGenRenderbuffers(1, &colorBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer);

    //setup the color buffer with the EAGLLayer (it automatically defines width and height of the buffer)
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:EAGLLayer];
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &bufferWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &bufferHeight);

    //Attach the colorbuffer to the framebuffer
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBuffer);

    //Check the Framebuffer status
    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

    NSAssert(status == GL_FRAMEBUFFER_COMPLETE, ERROR_FRAMEBUFFER_FAIL);

}

然后我调用一个函数来初始化辅助缓冲区

-(void)setupRenderToTexture{

    glGenTextures(1, &gridTextureID);
    glBindTexture(GL_TEXTURE_2D, gridTextureID);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

    glGenRenderbuffers(1, &textureColorBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, textureColorBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, bufferWidth, bufferHeight);
    glBindRenderbuffer(GL_RENDERBUFFER, 0);

    glGenFramebuffers(1, &textureFrameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, textureFrameBuffer);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gridTextureID, 0);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, textureColorBuffer);

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
    if(status != GL_FRAMEBUFFER_COMPLETE) {
        NSLog(@"failed to make complete framebuffer object %x", status);
    }else{
        NSLog(@"Buffer ok");
    }

    glBindFramebuffer(GL_FRAMEBUFFER, 0);

}

在这一点上,当是绘制的时候,我调用了一个render调用该函数的函数renderToTexture

- (void)render:(CADisplayLink*)displaylink{

    [self renderToTexture];

    glBindBuffer(GL_FRAMEBUFFER, frameBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer);

    glClearColor(0.0, 1.0, 0.0, 1.0);
    glViewport(0, 0, bufferWidth, bufferHeight);
    glClear(GL_COLOR_BUFFER_BIT);


    for(GLNode *node in sceneNodes){
        [node draw]; //Draw some triangles...
    }

    [context presentRenderbuffer:GL_RENDERBUFFER];
}

这里的renderToTexture函数:-(void)renderToTexture{

glBindFramebuffer(GL_FRAMEBUFFER, textureFrameBuffer);

glClearColor(1.0, 0.0, 0.0, 1.0);
glViewport(0, 0, bufferWidth, bufferHeight);
glClear(GL_COLOR_BUFFER_BIT);

//Render something to texture

}

如果我只使用与主缓冲区相关的代码(因此函数initializeBuffersrender),主 FrameBuffer 的内容会正确显示在屏幕上。如果我尝试使用与渲染到纹理(setupRenderToTexturerenderToTexture)相关的功能,则不再在屏幕上绘制主帧缓冲区。

我想知道这个配置是否有问题,我能做些什么来纠正这种行为。

4

0 回答 0