2010-07-07 150 views
1

我想要在OpenGLES中完成一堆东西,但这里是我开始的地方 - 将东西绘制到纹理,然后显示该纹理。渲染到纹理仍渲染到OpenGLES中的屏幕

我创造了一些缓冲:

glGenFramebuffersOES(1, &frameBuffer); 
glGenRenderbuffersOES(1, &colorRenderbuffer); 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBuffer); 

然后,我给自己定了画一些线条的帧缓冲区。

glViewport(0, 0, backingWidth, backingHeight); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glEnableClientState(GL_VERTEX_ARRAY); 
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colours); 
glEnableClientState(GL_COLOR_ARRAY); 
glDrawArrays(GL_LINES, 0, 2000); 

然后,我尝试将其复制到新制纹理中。

glGenTextures(1, &textureId); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, 128, 128); 

然后显示纹理。

GLfloat vertices[] = {-1,1,1,1,-1,-1,1,-1}; 
GLfloat texcoords[] = { 0,1, 
          1,1, 
         0,0, 
         1,0,}; 

glColor4f(0.5, 0.5, 0.5, 0.1); 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glEnableClientState(GL_VERTEX_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
GL_RENDERBUFFER_OES, colorRenderbuffer); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 
[context presentRenderbuffer:GL_FRAMEBUFFER_OES]; 

我所得到的是这样的 - 在这意味着我的台词屏幕(我画的三角形扇意味着我可以在后面看到的样子)的“后退”显示我的台词都被吸引到了渲染,尽管我从来没有约束过它。最重要的是,我将我的纹理绘制成一些奇怪的颜色,而不是我预期的那样。

所以,我有两个问题在这里:

为什么我的线仍然出现在如果我不写他们的渲染屏幕的后面?

我是否正确写入纹理?如果是这样,为什么不显示?

+1

您遗漏了很多重要的代码,如glFramebuffer *电话(glFramebufferRenderbuffer等),但我真的不明白,就是如果你绑定的帧缓冲,这会使它,而不是屏幕。 另外,你为什么不使用FBO直接绘制纹理? – 2010-07-07 15:30:11

+0

FBO是FramebufferObject,对吧?你能详细说明可能涉及的内容吗?我已经在其他地方看到过这种情况,但没有提供可靠的代码。 关于渲染目标,这也正是我的问题。没有理由为什么应该出现在屏幕上,但它是。仍然用更简单的例子来处理它。 – mtrc 2010-07-07 15:37:16

+1

其实更好的问题是,你想要做什么? – 2010-07-07 16:26:43

回答

2

你需要使用一个帧缓冲区对象(FBO)直接绘制到纹理,下面教程应该可以帮助您:

http://www.flashbang.se/archives/48

注意,这些教程是对OpenGL,支持OpenGL ES是相同,但EXT在大多数方法和枚举中更改为OES。

另请注意,绑定帧缓冲区(glBindFramebufferEXT/OES)会使所有渲染都转到该帧缓冲区(以及它附加的纹理/渲染缓冲区),因此,在再次绘制屏幕之前需要先解除帧缓冲区的绑定, :

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
+0

我看过那篇教程。它很有意义,尽管他提供的代码还没有工作。我会坚持下去,谢谢你! – mtrc 2010-07-07 16:57:39