我最近开始用openGL编程.我已经完成了创建基本图元的代码,并在webGL中使用了着色器.我已经广泛搜索了这个主题,但对我来说仍然不是那么清楚.基本上,这就是我想知道的.有没有什么可以在GLSL中完成,无法在普通的openGL中完成,或者GLSL是否只是更有效地做事情?
小智 17
简短版本是: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使编程它们变得非常容易.
正如Mattsills回答的那样,GL Shader Language或GLSL是OpenGL的一部分,它可以在OpenGL中/为OpenGL创建称为着色器的算法。着色器在GPU上运行。
着色器决定诸如表面零件的颜色之类的因素,以及表面共享诸如反射光之类的信息的方式。顶点着色器,几何着色器,镶嵌着色器和像素着色器是可以用GLSL编写的着色器类型。
Q1:
在GLSL中有什么可以在普通OpenGL中无法完成的工作吗?
A:
您也许可以只使用不带GLSL部件的OpenGL,但是如果您想要自己的表面特性,则可能希望着色器使之像GLSL这样创建的相当简单和高性能。这里有些例子:
Q2:
还是GLSL只是做事更有效率?
A:
像素着色器尤其是非常并行的,可以为2D网格的每个单元独立地计算值,同时还包含很多警告,例如无法像性能一样出色地处理“ if”语句,因此使用不同类型的着色器在OpenGL的其余部分中描述和处理的表面上有优势。
第三季度:
我怀疑您想知道是否仅使用GLSL是一种选择,而我只能以我对一种着色器Pixel Pixel着色器的了解来回答这个问题。该答案的其余部分涵盖了使用GLSL作为可能选项的“公正”:
A:
虽然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.)
Run Code Online (Sandbox Code Playgroud)
我发现该语言在某些方面很难使用,以这种方式将GLSL用于大型项目(例如游戏或模拟)可能会或可能不会特别实用,但是正如这些演示所示,这是一种计算机游戏不必看起来像电脑游戏,这种方法应该是一种选择,可能与生成的内容和/或外部数据一起使用。
据我了解,它可以在OpenGL中合理地执行Pixel Shaders:
所有这些的结果是,代码看起来更像是封闭式方程式的行,并且缺少算法或更高级别的结构,而是使用类似于条件的模块化算法。