我对GLSL的工作原理有些了解,但是Open Shader Language(OSL)对我来说是新的。

据我了解,OSL用作电影生产级CG渲染器的着色器语言,并旨在与开拓性的Renderman软件套件中的等效语言(RSL)竞争。

据我所知,OSL和GLSL一样,是基于C的简洁DSL,具有许多专门为处理计算机图形基元(如曲面,像素,顶点等)上的操作而编写的基元值和BIF。

但是乍看之下,似乎存在许多差异。 OSL似乎比GLSL更容易阅读,因为命名函数似乎是OSL的关键特性。

另一个观察结果是,GLSL如何将着色器仅应用于绘制顶点(顶点着色器)和栅格化场景(片段/像素着色器)的时间点。但是,在调用着色器程序时,OSL似乎具有很大的自由度。

可能还有许多其他差异(在OSL中似乎没有引用“统一”变量,但在OSL程序中甚至需要它们吗?),但我真正想要的是对两种语言的范围进行了博学的比较。相互之间的关系,并解释两种语言的程序之间实际上可以共享的内容(如果有的话)。

我已经在网上搜索了一些信息,但是对这两种语言相对于每种语言的范围进行清楚的比较似乎是遥不可及的。

将不胜感激的指导。

最佳答案

GLSL通常在GPU上实时运行,而OSL通常在CPU上离线运行。这是一个非常粗糙的陈述,但是解释了为什么没有供应商在消费级硬件上实现GLSL noise()原语,而OSL却具有在半球上有效集成的函数调用的原因。

您关于GLSL的函数命名和按原语操作的观点似乎是错误的。您可以在GLSL中具有命名函数,并且使用计算着色器[0]可以对任意缓冲区数据进行操作。

请注意,RSL现在已过时,因为新的RenderMan体系结构将OSL用于模式定义,将C++用于集成器和Bxdf插件。还有许多其他渲染器,实时和脱机渲染器都使用C++作为其着色语言...想到了Arnold和Metal。

但总的来说,我从阅读RSL的Gritz和Cortes书籍中学到的关于着色语言的知识最多。它们都有相似的语法,重要的是基础。您可能会喜欢Rob Cook撰写的有关可编程着色的第一篇论文:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.93.9645&rep=rep1&type=pdf

另一本不错的书是《 Cg教程》,与GLSL相比,与OSL更为相似:

http://developer.download.nvidia.com/CgTutorial/cg_tutorial_chapter01.html

VEX是一种类似的矢量语言,在Houdini套件中用于几何和着色操作:

http://www.sidefx.com/docs/houdini/vex/_index

最后,既然Vulkan和OpenGL都支持SPIR-V中间表示,那么可能会有更多的人设计自己的着色语言以供实时使用:

https://www.khronos.org/news/press/khronos-releases-opengl-4.6-with-spir-v-support

[0]您还可以通过使用“变换反馈”(甚至在WebGL中可用)或仅将输入纹理视为全局数据来对任意数据进行操作。这项技术称为GPGPU。

关于opengl - Open Shader Language和GLSL之间的主要区别是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46093694/

10-10 20:10