opengl 或者早期的固定管线问题,以前一直没有很理解固定管线和可编程管线的区别。
现在看opengl1.1的很多代码,终于理解啥意思了。固定管线其实就是把渲染的过程,光照过程都封装到了opengl里边了,代码执行流程都写死了,比如光照 漫反射 环境光 高光计算都写死到了opengl里,你不能改变渲染流程,只能改变各种参数,标记。甚至雾效处理也内置好了,都是调用API调整参数来调整效果。
opengl1.5开始的可编程管线就是就是加入了shader脚本语言,很多流程不内置,包括光照处理都让你在外部自己写。我提供脚本编译框架在opengl底层,并且在特定流程里去调用你自己的光照脚本。这样你可以自己控制写什么样的光照模型,甚至更复杂的pbr物理渲染模型等。
其实对于渲染的实现难度是提高了,因为功能没有提供给你,要你自己写。但是带来的是灵活性的提高。从opengl的具体渲染功能角度来讲,功能是变弱了,但是从抽象的框架功能来讲,你可以自己定制,功能是变强了。
包括unity前期内置的builtin管线相当于引擎层面渲染的固定管线,后期的srp,urp架构,也是说是可编程管线,是引擎渲染流程可定制,通过继承接口类等改写渲染流程。刚开始说unity的可编程管线以为是在说底层的opengl和dx,就觉得本来不就是可编程的吗?现在想想他说的不是更底层的dx和opengl,他说的是属于引擎那一部分的固定和可以编程,但是这种说法的方式其实跟opengl的固定和可编程层面相近。因为从本质上不管是opengl还是引擎,对于渲染功能整体来讲,都只是一部分渲染功能。只是代码写在哪个层级,写在内部不能脚本化控制的都可以说是固定管线。能够类似脚本话控制的可以叫可编程。其实就是代码写在哪个层级。但是可编程管线从具体功能来讲因为没有提供要你自己写,所以是要求更高了,你必须具备自己开发原来属于引擎或者opengl之前内置的功能的能力,要你自己写在外部。从框架抽象功能来讲,可扩展功能是更强了。
所以,固定管线和可编程管线的本质区别,从整个渲染到应用的全体实现来讲,其实没有本质区别,因为流程都不能少,只是代码写在外部还是内部的问题。当然代码写到外部,框架的抽象功能变强了,但是具体功能变弱了,让你自己定制,其实具体功能的实现要求是变高了,不是变低了。
本文探讨了OpenGL从固定管线到可编程管线的发展,解释了两者间的区别:固定管线封装了渲染流程,限制灵活性;可编程管线引入Shader,提升定制能力但要求更高技能。

797

被折叠的 条评论
为什么被折叠?



