养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

openGL如何渲染到三维纹理?

时间:2024-11-15 02:50:27

FrameBuffer是OpenGLES中重溴溢菏确要基础组件之一,经常被缩写成FBO(FrameBufferObject),它用来承载G霸烹钟爷PU计算出来的数据,包括颜色(Color),深度(Depth),遮罩(Stencil)。FrameBuffer包括3个缓冲区,颜色缓冲区,深度缓冲区,遮罩缓冲区,每个缓冲区就是一块内存,存储着对应的像素数据。比如颜色缓冲区,一般像素格式都是RGBA,一共4个字节,如果是一个大小1024乘以1024的FrameBuffer,那么颜色缓冲区所占的内存就是1024x1024x4个字节。深度和遮罩缓冲区也有自己的格式。GLKView默认为我们创建了一个FrameBuffer,并且绑定了刚才说的3个缓冲区到这个FrameBuffer上。我们所有绘制的操作,最终都被写入到这个FrameBuffer的缓冲区中。这个FrameBuffer里的颜色缓冲区的数据最终会被呈现在GLKView上

方法/步骤

1、手动创建FrameBuffer既然GLKView可以帮我们创建FrameBuffer,那么我们自己是不是也可以手动创建FrameBuffer呢?自然是可以的。创建FrameBuffer分为下面几个步骤。创建FrameBuffer对象,并绑定到GL_FRAMEBUFFER上,等待后续处理。

openGL如何渲染到三维纹理?

2、生成颜色缓冲区并附加到FrameBuffer上。这里我们使用一个纹理对象作为颜色缓冲区,这意味着所有绘制到FrameBuffer的颜色数据都会存储到framebufferColorTexture中。更酷的是我们可以把这个纹理framebufferColorTexture当做贴图使用,比如用作漫反射贴图(diffuseMap)。

openGL如何渲染到三维纹理?

3、生成深度缓冲区并附加到framebuffer上。这里我们同样使用了纹理对象作为缓冲区。

openGL如何渲染到三维纹理?

4、如果你不需要使用纹理作为深度缓冲区,可以使用下面的写法替代。创建一个RenderBuffer,而不是Texture。

openGL如何渲染到三维纹理?

5、本文不会使用遮罩(Stencil)缓冲区,所以这里不做详细介绍。检查FrameBuffer的创建状态

openGL如何渲染到三维纹理?

6、使用FrameBuffer接下来我们就要在创建好的FrameBuffer上绘制物体了。步骤很简单,绑定FrameBuffer,设置Viewport,绘制。

openGL如何渲染到三维纹理?

7、Viewport是绘制区域的大小,我们把Viewport设置为FrameBuffer的尺寸,这样绘制区域就可以撑满整个FrameBuffer了。我还设置了新的clearColor,新的投影矩阵,观察矩阵,这样就可以在FrameBuffer中呈现出不一样的绘制效果。[selfdrawObjects];里简单的封装了之前3D物体的绘制。

openGL如何渲染到三维纹理?

8、使用FrameBuffer的颜色缓冲区纹理经过上面的步骤,我们成功的在FrameBuffer上进酚祯馄嫱行了绘制。此时颜色缓冲区纹理已经存储了刚刚的绘制结果。接下来我们将这个纹理显示在一个平面上撅掏浑锌。Plane类绘制了一个1x1面朝z轴正方向的平面,并且接受一个diffuseMap作为漫反射贴图。我为它单独写了一个非常简单的FragmentShader(frag_framebuffer_plane.glsl),没有光照处理,直接显示diffuseMap的像素

openGL如何渲染到三维纹理?

9、[viewbindDrawable];将GLKView生成的FrameBuffer绑定咦筋庑檗到GL_FRAMEBUFFER,并设置好V足毂忍珩iewport,这样后面绘制的内容将呈现在GLKView上。接着重新设置投影矩阵和观察矩阵。绘制3D物体[selfdrawObjects];。绘制平面[selfdrawPlane];。值得一提的是,绘制平面时,我使用了正交投影矩阵,这样平面就不会有透视效果,这正是我想要的

openGL如何渲染到三维纹理?

10、至于Plane的实现代码很简单,读者可以自行clone代码查看。右上角显示的是使用了颜色缓冲区纹理作为漫反射贴图的平面

openGL如何渲染到三维纹理?

© 一点知识