RenderMan规范[1],简称RISpec,是一个开放的应用程序接口(API),由皮克斯开发,用于描述三维模型并把它转换成逼真的数字图像。RenderMan规范作为建模程序和渲染程序之间的通信协议(或称为接口),用于生成逼真的数字图像。规范类似于PostScript,不过是用来描述三维场景而非二维页面布局。因此,理解RenderMan接口的建模软件,可以输出场景数据到符合规范的渲染器(以下简称RenderMan渲染器),而无需关心后者使用什么算法来渲染出图像。
RenderMan规范最初发布于1988年,版本号为3.0,3.1版发布于1989年,并在1995年进行了修订,2000年7月,规范发布3.2版。规范的当前版本是3.2.1版,发布于2005年11月[1]。后来的事实证明了规范的前瞻性,规范在多年之后也无需过多改动就能引入新技术。
RenderMan规范和当时的其他标准的不同之处在于它允许使用高级的几何图元,比如二次曲面或双三次曲面来表示图形,而非依赖于建模程序事先生成多边形逼近模型,规范的另一个创新之处是引入着色语言。
RenderMan和OpenGL有很多相同之处,虽然两个API是针对不同的用户(OpenGL用于实时硬件辅助渲染,而RenderMan规范则用于逼真图像的离线渲染),两个API都是基于栈的状态机机制直接渲染出几何图形。
RenderMan渲染接口,主要包括两大部分,第一部分是RenderMan Interface,定义了着色计算所必须的一些基本数据类型,和RenderMan接口字节流协议(RenderMan Interface Bytestream Protocol),简写为RIB,rib也是RenderMan场景描述文件的扩展名;规范的第二部分,是RenderMan着色语言,RenderMan Shading Language,简称RSL,使用RenderMan着色语言编写的源程序,其源代码文件扩展名通常是sl。
RenderMan接口,定义了一些基本的数据类型,以规范的C语言实现为例,规范把C语言的short、int、float、char数据类型,分别映射至其RtBoolean、RtInt、RtFloat和*RtToken类型,另外,规范还定义了RtColor、RtPoint、RtVector、RtMatrix等特定于图形学着色计算必要的数据类型。
规范的图形状态(graphics state),包括了渲染一个模型所需的全部信息,RenderMan接口的命令,要么改变图形状态,要么渲染一个模型。图形状态又分为两部分,其一是全局状态,在渲染一幅图像或序列中的一帧时,保持不变;其二是当前状态,针对不同待渲染的模型,可以发生改变。全局状态中的参数,称为选项(Options);当前状态中的参数,称为属性(Attributes)。选项包括相机和显示(指输出像素的)参数,还有其他影响渲染质量的参数;属性包括控制模型外观和材质的参数(比如颜色、透明度、着色模型等),还有模型的位置、朝向和细分程度等参数。
RenderMan规范支持多边形、曲面片、细分曲面、二次曲面、点和曲线、元球、程序图元等多样的几何模型
RenderMan规范引入了RenderMan着色语言,使三维场景的外观不只用很少的参数来描述,而是允许使用类似C语言的程序来编写任意复杂的着色函数,通常称之为程序纹理和着色器(shader)。光照以及表面置换也是可编程的,能用着色语言编程来修改。RSL允许每个语句以单指令流多数据流的方式执行,但不强制使用此方式。另一个使RenderMan渲染器区别于许多其他渲染器的功能是它允许输出着色函数里的任意信息,不管是表面法线、单独的灯光通道还是什么别的信息,都可以使用RenderMan渲染器输出到单独的通道里。
一个RSL编写的着色器,可以用于任何符合RenderMan渲染规范的RenderMan渲染器,比如皮克斯的PRMan、DNA Research的3Delight,以及开源的Pixie和Aqsis。
RSL可以编写独立的函数和RenderMan渲染规范定义的五种类型的着色器:surface,light,volume,imager和displacement着色器。
以下是定义塑料表面材质的一个示例着色器:
surface plastic (float Ka = 1, Kd = 0.5, Ks = 0.5, roughness = 0.1;
color specularcolor = 1;) {
normal Nf = faceforward (normalize(N),I);
Ci = Cs * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks*specular(Nf,-normalize(I),roughness);
Oi = Os;
Ci *= Oi;
}
着色器通过接收一些可以由艺术家调节的变量比如Cs(表面颜色),Os(表面透明度)等,结合RenderMan渲染规范定义的内置变量N(着色点的法线),P(着色点位置)等,依据一定的算法计算出Ci(最终表面颜色),Oi(最终表面透明度)或任意所需信息,从而完成着色过程。
一个着色器可以用于不同的三维几何模型,每个着色器实例的参数数值可不一样。着色器没有返回值,而是利用“输出变量”存储计算的数值。但函数可以接受参数,并返回一个值。比如,以下函数通过点积操作符“.”计算矢量的长度并将之返回。
float length(vector v) {
return sqrt(v . v);
}
一个RenderMan渲染器,必须实现以下功能:
此外,渲染器还可以实现以下的某项功能: