【问题标题】:What is the difference between opengl and GLSL?opengl 和 GLSL 有什么区别?
【发布时间】:2013-05-19 06:18:42
【问题描述】:

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

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    简短的版本是: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 使它们的编程变得更加容易。

    【讨论】:

      【解决方案2】:

      正如 Mattsills 回答中所涵盖的,GL 着色器语言或 GLSL 是 OpenGL 的一部分,它支持在/用于 OpenGL 中创建称为着色器的算法。着色器在 GPU 上运行。

      着色器会根据一些因素做出决定,例如表面部分的颜色,以及表面共享反射光等信息的方式。顶点着色器、几何着色器、曲面细分着色器和像素着色器是可以用 GLSL 编写的着色器类型。


      第一季度:

      有什么可以在 GLSL 中完成而在普通 OpenGL 中无法完成的事情?

      答:

      您可以只使用没有 GLSL 部分的 OpenGL,但如果您想要自己的表面属性,您可能需要一个着色器,使其相当简单和高性能,用 GLSL 之类的东西创建。以下是一些示例:

      第二季度:

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

      答:

      像素着色器特别是非常并行的,为 2D 网格的每个单元独立计算值,同时还包含重要的警告,例如无法非常高效地处理类似条件的“if”语句,因此这是使用不同类型的情况在 OpenGL 的其余部分描述和处理的表面上,着色器的优势。



      第三季度:

      我怀疑您想知道是否只使用 GLSL 是一种选择,我只能根据我对一种着色器 Pixel Shaders 的了解来回答这个问题。该答案的其余部分涵盖了“仅”使用 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 等高级功能。
      • 并有效地同时并行计算所有值。

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

      【讨论】:

      • 这与回答所提问题有什么关系?
      • 通过回答 GLSL 与 GL,它实际上是关系的一部分,而不是替代方案,重申了“一个可以做什么但另一个不能做什么”的问题。除了展示“仅”GLSL 可以做什么,尽管我只知道一些事情,以及 GLSL 中什么是有效的,什么不是。这不是一个完整的答案,它只是提供了大量我知道的可能有助于解决问题的信息。到目前为止,这是仅涵盖使用 GLSL 的唯一答案,如果这样会更有效,即使使用实时代码示例也是如此。
      • @NicolBolas 不清楚是什么回答了问题的哪一部分,我重新排列了一些文字并标明以使事情更加明显。
      • 是的,你使用什么语言?!
      • @alan2here​‌​‌‍‍
      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2014-06-08
      • 2013-03-29
      • 2010-10-02
      相关资源
      最近更新 更多