【发布时间】:2018-04-16 17:21:57
【问题描述】:
我无法理解 OpenGL 中较小着色器的概念。它是如何工作的?例如:我是否需要创建一个着色器用于在空间中定位对象,然后为另一个着色器着色以进行照明或什么?有人可以向我解释一下吗?提前致谢。
【问题讨论】:
我无法理解 OpenGL 中较小着色器的概念。它是如何工作的?例如:我是否需要创建一个着色器用于在空间中定位对象,然后为另一个着色器着色以进行照明或什么?有人可以向我解释一下吗?提前致谢。
【问题讨论】:
这是一个非常复杂的话题,尤其是因为您的问题不是很具体。首先,有各种着色器阶段(顶点着色器、像素着色器等)。着色器程序由不同的着色器阶段组成,至少有一个像素和一个顶点着色器(计算着色器程序除外,它们都是单个计算着色器)。顶点着色器计算屏幕上点的位置,所以这里的对象正在移动。像素着色器计算每个像素的颜色,这些像素被您的顶点着色器生成的渲染几何体所覆盖。现在,在照明方面,有不同的做法:
前向着色
这是直截了当的方法,您只需在移动到对象的同一着色器程序的像素着色器中计算光照。这是计算光照最古老的方法,也是最简单的方法。但是,它的能力非常有限。
延迟着色
多年来,这是游戏中的首选变体。在这里,您有一个着色器程序(顶点 + 像素着色器),它在一个(或多个)纹理上渲染几何图形(因此它移动对象,但它不保存光照颜色,而是保存基本颜色和表面之类的东西法线进入纹理),然后另一个着色器程序为您要渲染的每个灯光在屏幕上渲染一个四边形,这个着色器程序的像素着色器读取之前由第一个着色器程序在纹理中渲染的信息,并使用它在另一个纹理上渲染被照亮的对象(然后是最终图像)。与前向着色相比,这允许(理论上)场景中的任意数量的灯光,并允许更轻松地使用阴影贴图
平铺/群集着色
这是一种相当新且非常复杂的光照计算方法,可以建立在延迟或前向着色之上。它基本上使用计算着色器来计算 gpu 上的加速结构,然后使用它非常快速地绘制大量灯光。这允许在一个场景中实时渲染数千个灯光,但是为这些灯光使用阴影贴图非常困难,而且算法比以前的算法复杂得多。
【讨论】:
编写较小的着色器意味着将您的一些着色器功能分离到另一个文件中。然后,如果您正在编写一个包含闪电算法、抗锯齿算法和任何其他着色器计算算法的大型着色器,您可以将它们分成较小的着色器文件(light.glsl、fxaa.glsl 等等......)在您的 main 着色器文件(包含 void main() 函数的着色器文件)中链接这些文件,因为在 OpenGL 中,顶点数组只能有 一个 着色器程序(由渲染管线期间的顶点着色器、片段着色器、几何着色器等)。
编写较小着色器的方式还取决于您的渲染算法(正向渲染、延迟渲染或正向+渲染)。 p>
需要注意的是,编写大量着色器会增加着色器的编译时间,而且,编写带有大量制服的大着色器也会减慢速度......
【讨论】:
render() 函数您不能为顶点数组设置多个着色器程序。并不意味着不能同时为多个顶点数组设置相同的着色器程序。而且,是的……“forward+”是一个可怕的名字……:-)