OpenGL 光照着色器

Posted

技术标签:

【中文标题】OpenGL 光照着色器【英文标题】:OpenGL Lighting Shader 【发布时间】:2018-04-16 17:21:57 【问题描述】:

我无法理解 OpenGL 中较小着色器的概念。它是如何工作的?例如:我是否需要创建一个着色器用于在空间中定位对象,然后为另一个着色器着色以进行照明或什么?有人可以向我解释一下吗?提前致谢。

【问题讨论】:

【参考方案1】:

这是一个非常复杂的话题,尤其是因为您的问题不是很具体。首先,有各种着色器阶段(顶点着色器、像素着色器等)。着色器程序由不同的着色器阶段组成,至少有一个像素和一个顶点着色器(计算着色器程序除外,它们都是单个计算着色器)。顶点着色器计算屏幕上点的位置,所以这里的对象正在移动。像素着色器计算每个像素的颜色,这些像素被您的顶点着色器生成的渲染几何体所覆盖。现在,在照明方面,有不同的做法:

前向着色

这是直截了当的方法,您只需在移动到对象的同一着色器程序的像素着色器中计算光照。这是计算光照最古老的方法,也是最简单的方法。但是,它的能力非常有限。

延迟着色

多年来,这是游戏中的首选变体。在这里,您有一个着色器程序(顶点 + 像素着色器),它在一个(或多个)纹理上渲染几何图形(因此它移动对象,但它不保存光照颜色,而是保存基本颜色和表面之类的东西法线进入纹理),然后另一个着色器程序为您要渲染的每个灯光在屏幕上渲染一个四边形,这个着色器程序的像素着色器读取之前由第一个着色器程序在纹理中渲染的信息,并使用它在另一个纹理上渲染被照亮的对象(然后是最终图像)。与前向着色相比,这允许(理论上)场景中的任意数量的灯光,并允许更轻松地使用阴影贴图

平铺/群集着色

这是一种相当新且非常复杂的光照计算方法,可以建立在延迟或前向着色之上。它基本上使用计算着色器来计算 gpu 上的加速结构,然后使用它非常快速地绘制大量灯光。这允许在一个场景中实时渲染数千个灯光,但是为这些灯光使用阴影贴图非常困难,而且算法比以前的算法复杂得多。

【讨论】:

你有什么想法我应该如何创建照明着色器,我只需要调用例如 AmbientLight light(pos);? @OlafSzymański 你的意思是抽象层。着色器本身不是面向对象的。您可能想要的是延迟着色,然后 AmbientLight 实例要么正在调用相应的灯光着色器程序,要么它们被记录在一个列表中,并且在渲染期间您迭代这个列表并在每次迭代时调用相应的灯光着色器。 (取决于您何时要创建这些实例)。然后该实例填充一些制服(如颜色),然后告诉 gpu 在屏幕上的给定位置渲染一个四边形。 @OlafSzymański 也可以参考rastertek.com/tutgl40.html 这个小命令框里面有很好的教程可以解释的比我还多 xD 里面的directX 教程内容比较多,大家不妨看看它们也是如此(DirectX 和 openGL 并没有不同)【参考方案2】:

编写较小的着色器意味着将您的一些着色器功能分离到另一个文件中。然后,如果您正在编写一个包含闪电算法、抗锯齿算法和任何其他着色器计算算法的大型着色器,您可以将它们分成较小的着色器文件(light.glslfxaa.glsl 等等......)在您的 ma​​in 着色器文件(包含 void main() 函数的着色器文件)中链接这些文件,因为在 OpenGL 中,顶点数组只能有 一个 着色器程序(由渲染管线期间的顶点着色器、片段着色器、几何着色器等)。

编写较小着色器的方式还取决于您的渲染算法(正向渲染延迟渲染正向+渲染)。 p>

需要注意的是,编写大量着色器会增加着色器的编译时间,而且,编写带有大量制服的大着色器也会减慢速度......

【讨论】:

顶点数组和着色器程序之间没有联系。渲染管线在任何时候只能设置一个着色器程序。但是,您可以使用多个着色器程序(一个接一个地)处理一个顶点数组,并且您可以使用同一个着色器程序处理多个顶点数组。我还可以补充一点,“forward+”是一种名为“平铺着色”的算法的糟糕且具有误导性的名称,它既可以用于正向着色,也可以用于延迟着色。 我并没有说顶点数组和着色器程序之间存在联系,而是顶点数组在渲染管道期间只能有一个着色器程序,即每次调用render() 函数您不能为顶点数组设置多个着色器程序。并不意味着不能同时为多个顶点数组设置相同的着色器程序。而且,是的……“forward+”是一个可怕的名字……:-) “一个顶点数组只能有一个着色器程序”这句话听起来就像顶点数组和着色器程序之间有联系,而实际上顶点数组并不“有”一个着色器程序。事实上,您甚至可以在完全不设置顶点数组的情况下进行渲染,同时仍然使用不同的着色器程序。但我猜你想说的是对的,而措辞听起来不对:) 如果措辞听起来有问题,抱歉...我不是以英语为母语的人...

以上是关于OpenGL 光照着色器的主要内容,如果未能解决你的问题,请参考以下文章

着色器中的 OpenGL 法线变换

OpenGL片段着色器不照亮场景

OpenGL ES着色语言-光照效果之散射光

OpenGL ES着色语言-光照效果之散射光

OpenGL ES着色语言-光照效果之散射光

问题理解 OpenGL 中的光照