在OpenGL ES(iPhone)中绘制到屏幕外渲染缓冲区
我正在尝试在iPhone上的OpenGL ES中创建一个屏幕外渲染缓冲区。我创建了如下缓冲区:在OpenGL ES(iPhone)中绘制到屏幕外渲染缓冲区,iphone,opengl-es,Iphone,Opengl Es,我正在尝试在iPhone上的OpenGL ES中创建一个屏幕外渲染缓冲区。我创建了如下缓冲区: glGenFramebuffersOES(1, &offscreenFramebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreenFramebuffer); glGenRenderbuffersOES(1, &offscreenRenderbuffer); glBindRende
glGenFramebuffersOES(1, &offscreenFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreenFramebuffer);
glGenRenderbuffersOES(1, &offscreenRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, offscreenRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, offscreenRenderbuffer);
但我不知道如何渲染存储。苹果的文档中说要使用EAGLContext renderBufferStorage:fromDrawable:方法,但这似乎只适用于一个渲染缓冲区(正在显示的主渲染缓冲区)。如果我使用普通的OpenGL函数glRenderBufferStorageOES,那么我似乎无法显示它。代码如下:
// this is in the initialization section:
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGB8_OES, backingWidth, backingHeight);
// and this is when I'm trying to draw to it and display it:
glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreenFramebuffer);
GLfloat vc[] = {
0.0f, 0.0f, 0.0f,
10.0f, 10.0f, 10.0f,
0.0f, 0.0f, 0.0f,
-10.0f, -10.0f, -10.0f,
};
glLoadIdentity();
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vc);
glDrawArrays(GL_LINES, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, offscreenRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
这样做,屏幕上不会显示任何内容。但是,如果我将对“offscreen…Buffer”的引用切换到使用renderBufferStorage方法创建的缓冲区,则效果很好
有什么建议吗?您不能显示正常的renderbuffer(使用glRenderbufferStorage创建),它始终在屏幕外
presentRenderbuffer:
只能用于使用renderbufferStorage:fromDrawable:
创建的renderbuffer。如果您检查了该presentRenderbuffer:
的返回值,您应该会发现它失败了
你想做什么?既然你不能对屏幕外FBO使用
presentRenderbuffer
,你应该使用glFramebufferTexture2DOES
将其与纹理对象关联,然后渲染一个带纹理的全屏四元体。@david好主意。。你需要做的是@prideout说的。。创建纹理并对其进行渲染。。每次都使用四边形上的纹理。确保只绘制一次纹理,因为在您的情况下,对象是持久的
- (void)setUpTextureBuffer
{
glGenFramebuffersOES(1, &texturebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, texturebuffer);
// create the texture
glGenTextures(1, &canvastexture);
glBindTexture(GL_TEXTURE_2D, canvastexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, canvastexture, 0);
GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
if(status != GL_FRAMEBUFFER_COMPLETE_OES) {
NSLog(@"failed to make complete framebuffer object %x", status);
}
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glClearColor(1.0, 1.0, 1.0, 1.0);
glViewport(0, 0, 512, 512);
glClear(GL_COLOR_BUFFER_BIT);
}
//setTargetToTexture() function
glBindFramebufferOES(GL_FRAMEBUFFER_OES, tbuffer);
glBindTexture(GL_TEXTURE_2D, allbrushes);
glViewport(0, 0, 512, 512);
//reset pointers after finishing drawing to textures
glViewport(0, 0, BWIDTH, BHEIGHT);
glVertexPointer(2, GL_FLOAT, 0, canvas); //canvas vertices
glTexCoordPointer(2, GL_FLOAT, 0, texels);
glBindTexture(GL_TEXTURE_2D, boundtexture); //bind to the texture which is the special render target
glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbuffer); //back to normal framebuffer
我在写一个游戏,在这个游戏中,我在屏幕上画一些东西,这些东西应该在一帧到另一帧之间保持不变。我想把这些持久性的东西画到一个屏幕外的缓冲区,然后在每一帧上把它“blit”到屏幕上,并在上面画出非持久性/易失性的东西。我真的希望避免维护持久对象的列表,并在每一帧中重新创建它们,因为对象的数量可能会很快变得难以处理。