opengl和GLSL有什么区别?

时间:2013-05-19 06:18:43

标签: opengl glsl

我最近开始用openGL编程。我已经完成了创建基本图元的代码,并在webGL中使用了着色器。我已经广泛搜索了这个主题,但对我来说仍然不是那么清楚。基本上,这就是我想知道的。有没有什么可以在GLSL中完成,无法在普通的openGL中完成,或者GLSL是否只是更有效地做事?

2 个答案:

答案 0 :(得分:16)

简短版本是:OpenGL是用于渲染图形的API,而GLSL(代表GL着色语言)是一种使程序员能够修改管道着色器的语言。换句话说,GLSL是整个OpenGL框架的一个(小)部分。

要了解GLSL在大局中的适用性,请考虑使用非常简化的图形管道。

Vertexes指定---(顶点着色器)--->变换顶点---(原始汇编)--->原语---(光栅化)--->片段---(片段着色器)--->输出像素

着色器(此处,只是顶点和片段着色器)是可编程的。你可以用它们做各种各样的事情。您可以只交换红色和绿色通道,也可以实现凹凸贴图,使曲面看起来更加细致。编写这些着色器是图形编程的重要组成部分。这里有一些很好的示例链接,可以帮助您了解使用自定义着色器可以完成的任务:http://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderExamples.html

在不久的将来,编程它们的唯一方法是使用GPU汇编程序。在OpenGL的情况下,该语言称为ARB汇编程序。由于这个难度,OpenGL人员给了我们GLSL。 GLSL是一种可以在图形硬件上编译和运行的高级语言。总而言之,可编程着色器是OpenGL框架(或任何现代图形API)不可或缺的一部分,而GLSL使编程它们变得非常容易。

答案 1 :(得分:4)

正如Mattsills所述,GL Shader Language或GLSL是OpenGL的一部分,可以在OpenGL中创建称为着色器的算法。着色器在GPU上运行。

着色器会决定诸如曲面部分颜色等因素以及曲面共享信息(如反射光)的方式。顶点着色器,几何着色器,Tesselation着色器和像素着色器是可以用GLSL编写的着色器类型。

Q1:

  

在GLSL中有什么可以用普通的OpenGL完成的吗?

A:

你可以在没有GLSL部件的情况下使用OpenGL,但是如果你想要自己的表面属性,你可能需要一个着色器使这个相当简单和高性能,在GLSL之类的东西中创建。以下是一些例子:

enter image description here

enter image description here

enter image description here

enter image description here

Q2:

  

或者GLSL是否只是更有效地做事?

A:

像素着色器特别是非常平行,为2D网格的每个单元独立计算值,同时还包含重要的警告,就像不能非常有效地处理“if”语句一样,所以这是使用不同类型的情况在其他OpenGL中描述和处理的表面上有着色的着色器。

Q3:

我怀疑你想知道是否只使用GLSL是一个选项,我只能用我对一种着色器Pixel Shaders的了解来回答这个问题。本答案的其余部分涵盖“仅仅”使用GLSL作为可能的选项:

A:

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

例如:

(请注意,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中合理地执行Pixel Shaders:

  • 必须加载到一小段记忆中。
  • 不支持:
    • “if”声明如条件。
    • 递归或像流控制一样循环。
  • 仅限于一小段有效指令和数据类型。
    • 包括“sin”,mod,向量乘法,浮点数和半精度浮点数。
  • 缺乏对象或lambda等高级功能。
  • 并行地同时有效地计算价值。

所有这一切的结果是代码看起来更像是封闭形式的方程线,并且缺乏算法或更高级别的结构,使用模块化算法来处理类似于条件的东西。