大家好,我又来啦!今天给大家介绍一个OpenGL ES 3.0中的新特性,多渲染目标(Multiple Render Target)。
所谓的多渲染目标就是指将片元着色器中的输出对应到多个纹理上了,在之前的例子上我们的片元着色器都是只有一个输出,只能对应输出到一个目标上(FBO纹理或者屏幕),今天我们使用MRT特性,在片元着色器中定义多个输出,并且附着到多个纹理之上。
首先我们来回顾一下之前在 Opengl ES之FBO 一文中提到的挂在点这张图,上面所说的多渲染目标所用到的技术就是FBO中的多个颜色附着点(GL_COLOR_ATTACHMENT0、GL_COLOR_ATTACHMENT1...)
FBO提供的挂接点如图所示
在FBO中我们通过将texture绑定到color attachment上,这时绑定这个frame buffer进行渲染,就会渲染到绑定的texture。
在OpenGL ES 2.0中,FBO只能绑定到0号的color attachment即GL_COLOR_ATTACHMENT0上,而在Opengl ES3.0中则没有了这个限制,这或许就是为什么在OpenGL ES 2.0中片元着色器给我们内置了一个默认输出变量,而在Opengl ES3.0则需要开发者自定义输出变量的一个原因吧。
下面我们使用MRT特性实现一个小demo,首先使用FBO输出到四个纹理上,分别是原图、R颜色通道分离图、G颜色通道分离图和B颜色通道分离图,然后再将这四个纹理各取四分之一部分组成一张新图渲染到屏幕上。
MRT例子demo
首先我们需要生产一个FBO和四个附着的frame buffer上的纹理,准备代码如下:
然后在片元着色器中分别定义四个颜色输出,分别对应FBO上的四个颜色附着点:
都加上注释了,这里不多说,最后的步骤就是进行FBO的渲染,再将FBO渲染后的四个纹理图组合渲染到屏幕上,也就是绘制两次,一次绘制到FBO,一次是将FBO的内容绘制到屏幕,关于FBO的使用绘制请参考之前的博文 Opengl ES之FBO
这里不同的是两次绘制所使用的片元着色器是不一样的,绘制到屏幕上时所使用到的片元着色器如下:
也就是将FBO中的四张纹理图各取四分之一组合绘制成一张新图。
完整代码如下:
运行结果图:
思考
在一篇博文中我们介绍了纹理数组的使用,那么针对以上这个demo,当绘制到屏幕时,如何使用纹理数组的方式实现呢?
系列教程源码
https://github.com/feiflyer/NDK_OpenglES_Tutorial
Opengl ES系列入门介绍
领取专属 10元无门槛券
私享最新 技术干货