在上一篇博客中,关于Transform Feedback的基本原理和知识都已经做了一个普及,这篇博客着重要描述的OpenGL ES3里面对于Transform Feedback的描述以及各家厂商对于Transform Feedback未来的一些想法。
Transform Feedback作为图形学渲染管线的一个新的管道被正式引入到OpenGL ES3里面,OpenGL ES3从OpenGL的扩展GL_ARB_transform_feedback2和GL_ARB_transform_feedback3借鉴了大量的特性,包括了以下API,
大部分的函数以及变量在上面一篇博客中都已经详细地描述过了,这里就不再重复了。但是细心的读者应该发现了,录音机的播放录音功能不见了!的确,glDrawTransformFeedback这个函数没有出现在OpenGL ES的spec里面,这也是百思不得其解的一个地方。很有可能glDrawTransformFeedback这个函数并不是很实用,这只是笔者的一个猜测。
可以看到,OpenGL ES3在没有引入Geometry Shader的前提下,非常经济实用地引入Transform Feedback的大部分功能。对于可以进行Transform Feedback的几何图元类型也限定在了GL_POINTS,GL_LINES以及GL_TRIANGLES。
这个ARB的扩展是AMD公司提供的,其实是参考glDrawArray/ElementInstance的实现开发的,它添加了两个新的函数
让我们拿glDrawTransformFeedbackInstanced作为例子来讲清楚这个扩展,它的实现其实就是
for (int i = 0; i < primcount; i++) { instanceID = i; glDrawTransformFeedback(mode, count, type, indices, i); }
其本质就是用当前Transform Feedback的缓存作为一个VBO来实现多次绘制(primcount),Vertex Shader里面可以通过一个系统变量gl_InstanceID来控制不同的instance拥有不同的顶点输出。
glDrawTransformFeedbackStreamInstanced是同理的,但是它稍微复杂点,因为是针对Geometry Shader里面的stream开发的。glDrawTransformFeedbackInstanced就相当于glDrawTransformFeedbackStreamInstanced中stream为0的情况。
这个扩展是VMware公司提供的,主要用于查询Transform Feedback的缓存有没有发生溢出的情况,比如某个几何图元的顶点数据的大小超过了缓存的大小以至于无法存储。
它提供了两种查询的方式
一种是针对Transform Feedback这个对象的,另一种是针对Transform Feedback里面的每一个stream的。
这个扩展相对比较简单,开发者即使不用这个扩展也可以得到有没有溢出这个结论。无非应用程序这一端需要多写一些代码来检查缓存大小和将要写进缓存的顶点数据的大小。
这是AMD公司针对自己的GPU提出的一个扩展,非常简单。之前我们说过,如果我们选择从Geometry Shader中进行Transform Feedback操作的话几何图元类型只能是GL_POINTS,AMD公司移除了这个限制,把它改为所有stream的几何图元类型都必须相同。相当于他们可以在Geometry Shader中支持GL_POINTS, GL_LINES和GL_TRIANGLES输出到Transform Feedback缓存。
这又是AMD公司提供的一个扩展,可以看作是AMD公司对他们上一个扩展GL_AMD_transform_feedback3_lines_triangles的再一次突破,继上一次扩展规定了现在Geometry Shader的所有stream的Transform Feedback可以接受相同图元类型外,这一次他们规定了现在所有的stream可以输出不同的图元类型了。
一个新的系统变量被引入到Fragment Shader去选择不同的stream,就是说Fragment Shader可以根据不同的图元类型去做不同的图元绘制。
同时增加了对于GL_RASTERIZER_DISCARD在Geometry Shader中的支持,新引入的变量是基于stream id的,GL_STREAM_RASTERIZATION_AMD。
Transform Feedback作为一个非常好的特性丰富了OpenGL/OpenGL ES/DirectX的渲染管线,如果能把这个特性应用于一些有规律的粒子系统,往往可以达到事半功倍的结果。OpenGL ES和OpenGL对于这个特性最大的区别就在于glDrawTransformFeedback的支持。
各家厂商对于这个新特性也是非常的兴奋,可以看到有很多非常好的建议已经上传到OpenGL的扩展列表中了。我们完全可以期望更多的好玩有趣的扩展在未来会被添加到OpenGL ES的扩展中,即使对于OpenGL ES2而言,Transform Feedback也是完全可以支持的。