我正在尝试在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];
我得到的是这个 - 我的线条显示在屏幕的“后面”(我画三角扇的方式意味着我可以看到它背后)这意味着我的线条被绘制到渲染缓冲区,即使我从来没有绑定它。最重要的是,我将我的纹理绘制为一些奇怪的颜色,而不是我预期的线条。
所以我在这里遇到两个问题:
如果我没有将它们写入渲染缓冲区,为什么我的线条仍会出现在屏幕背面?
我正确地写了纹理吗?如果是这样,为什么不显示?
答案 0 :(得分:2)
您需要使用Framebuffer对象(FBO)直接绘制到纹理中,以下教程应该可以帮助您:
http://www.flashbang.se/archives/48
请注意,这些教程适用于OpenGL,因为OpenGL ES是相同的,但EXT在大多数方法和枚举中都更改为OES。
另请注意,绑定帧缓冲区(glBindFramebufferEXT / OES)会使所有渲染都转到该帧缓冲区(并且它附加了纹理/渲染缓冲区),因此您需要在再次绘制到屏幕之前先取消绑定帧缓冲区,这是通过以下方式进行的:
glBindFramebuffer(GL_FRAMEBUFFER, 0);