OpenGL和GLSL有什么区别?

15

我最近开始使用openGL编程。我已经编写了创建基本图元的代码,并在webGL中使用了着色器。我通过谷歌对这个主题进行了广泛的搜索,但它对我来说仍然不是很清楚。基本上,我想知道的是:在GLSL中是否有任何无法在普通的openGL中实现的功能,还是GLSL只是更高效地完成任务?

2个回答

25
简而言之,OpenGL是一个用于呈现图形的API,而GLSL(代表GL着色语言)是一种语言,使程序员能够修改管线着色器。换句话说,GLSL是整个OpenGL框架中的一部分(小)。
为了理解GLSL在大局中的位置,请考虑一个非常简化的图形管道。
指定顶点--(顶点着色器)--->变换顶点--(原始装配)--->原语--(光栅化)--->片段--(片段着色器)--->输出像素
这里的着色器(仅顶点和片段着色器)是可编程的。你可以做各种各样的事情。你可以仅交换红色和绿色通道,或者你可以实现凹凸映射以使你的表面看起来更加详细。编写这些着色器是图形编程的重要组成部分。这里有一个链接,其中包含一些不错的示例,可以帮助您了解使用自定义着色器可以完成什么:http://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderExamples.html
在不久的过去,编程它们的唯一方法是使用GPU汇编语言。在OpenGL的情况下,该语言称为ARB汇编语言。由于这种方法的困难性,OpenGL开发人员给我们提供了GLSL。 GLSL是一种可以在图形硬件上编译和运行的高级语言。因此,总而言之,可编程着色器是OpenGL框架(或任何现代图形API)的重要组成部分,而GLSL使编程它们变得更加容易。

9
作为Mattsills回答所涵盖的,GL Shader Language或GLSL是OpenGL的一部分,它使得在/为OpenGL中创建称为着色器的算法成为可能。着色器在GPU上运行。
着色器对于诸如表面部分的颜色以及表面共享信息(例如反射光)的方式等因素做出决策。顶点着色器、几何着色器、细分着色器和像素着色器是可以用GLSL编写的着色器类型。

问题1:

在OpenGL中,有没有任何GLSL无法完成的任务?

答案:

你可能可以只使用OpenGL而不需要GLSL部分,但如果你想要自己的表面属性,你可能需要一个着色器来使其简单且高效,这个着色器可以使用类似于GLSL的语言编写。以下是一些示例:

enter image description here

enter image description here

enter image description here

enter image description here

问题2:

或者GLSL只是更有效率地执行任务?

答案:

像素着色器特别是非常并行化,独立计算二维网格中每个单元的值,同时也包含重要的限制条件,例如不能很好地处理“if”语句等条件,因此需要使用不同类型的着色器来发挥其优势,在OpenGL的其余部分中描述和处理表面。



问题三:

我猜想您想知道是否只使用GLSL是一种选择,而我只能根据我对一种着色器——像素着色器的了解来回答这个问题。此答案的其余部分涵盖“只”使用GLSL作为可能选项的内容:

答案:

虽然GLSL是OpenGL的一部分,但您可以使用OpenGL的其余部分来设置环境并几乎完全将程序编写为像素着色器,其中像素着色器的每个元素都会给整个屏幕上的一个像素着色。


例如:
(请注意,WebGL有占用CPU的倾向,甚至会导致整个系统停顿,而Windows 8.1允许它这样做,Chrome似乎比Firefox更适合查看这些链接。)
不,这不是真实水的视频剪辑:

https://www.shadertoy.com/view/Ms2SD1

这只蜗牛所需的唯一外部资源是一些容易生成的纹理:

https://www.shadertoy.com/view/ld3Gz2

使用嘈杂的分形点云进行渲染:

https://www.shadertoy.com/view/Xtc3RS

https://www.shadertoy.com/view/MsdGzl

一个完美的球体:1个多边形,1个表面,无棱角或顶点:

https://www.shadertoy.com/view/ldS3DW

使用像粒子系统一样的模拟来模拟赛车在赛道上的行驶,使用第二个狭窄而长的像素着色器作为有关汽车位置的数据表。

https://www.shadertoy.com/view/Md3Szj

随机值相当简单:

fract(sin(p)*10000.)

我发现在某些方面,该语言难以使用,因此在大型项目(如游戏或模拟)中使用GLSL可能不是特别实用。但正如这些演示所展示的那样,电脑游戏不一定要像电脑游戏一样,这种方法应该是一个选项,也许可以与生成的内容和/或外部数据一起使用。
据我了解,在OpenGL中合理地执行像素着色器需要:
- 被加载到小的内存块中。 - 不支持: - 条件语句“if”。 - 递归或while循环等流程控制。 - 受限于少量有效指令和数据类型。
- 包括“sin”,mod,向量乘法,浮点数和半精度浮点数。 - 缺少高级功能,如对象或lambda。 - 并且并行计算所有值。
所有这些的结果是代码看起来更像封闭形式方程的行,并且缺少算法或更高级别的结构,使用模运算类似于条件。

这与回答所提出的问题有什么关系? - Nicol Bolas
1
通过回答GLSL与GL之间的关系,而不是将它们视为替代品,来回答“在一个中可以做什么,在另一个中却不能做什么”的问题。同时展示了只使用GLSL可以做什么,尽管我只知道一些内容,以及GLSL中哪些是高效的,哪些不是。这并不是一个完整的答案,只是提供了一些我所知道的信息,可能有助于回答这个问题。这是目前唯一涵盖只使用GLSL的答案,即使有现成的代码示例,也可能更加高效。 - alan2here
@NicolBolas 不太清楚回答了问题的哪个部分,我重新排列了一些文本并进行了标记,以使事情更加明显。 - alan2here
是的,你使用什么编程语言?! - cmarangu
@alan2here​‌​‌‍‍ - cmarangu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接