RenderMan规范

RenderMan规范，简称RISpec，是一个开放的应用程序接口（API），由皮克斯开发，用于描述三维模型并把它转换成逼真的数字图像。RenderMan规范作为建模程序和渲染程序之间的通信协议（或称为接口），用于生成逼真的数字图像。规范类似于PostScript，不过是用来描述三维场景而非二维页面布局。因此，理解RenderMan接口的建模软件，可以输出场景数据到符合规范的渲染器（以下简称RenderMan渲染器），而无需关心后者使用什么算法来渲染出图像。

RenderMan规范最初发布于1988年，版本号为3.0，3.1版发布于1989年，并在1995年进行了修订，2000年7月，规范发布3.2版。规范的当前版本是3.2.1版，发布于2005年11月。后来的事实证明了规范的前瞻性，规范在多年之后也无需过多改动就能引入新技术。

RenderMan规范和当时的其他标准的不同之处在于它允许使用高级的几何图元，比如二次曲面或双三次曲面来表示图形，而非依赖于建模程序事先生成多边形逼近模型，规范的另一个创新之处是引入着色语言。

RenderMan和OpenGL有很多相同之处，虽然两个API是针对不同的用户（OpenGL用于实时硬件辅助渲染，而RenderMan规范则用于逼真图像的离线渲染），两个API都是基于栈的状态机机制直接渲染出几何图形。

## RenderMan接口规范内容

RenderMan渲染接口，主要包括两大部分，第一部分是RenderMan Interface，定义了着色计算所必须的一些基本数据类型，和RenderMan接口字节流协议（RenderMan Interface Bytestream Protocol），简写为RIB，rib也是RenderMan场景描述文件的扩展名；规范的第二部分，是RenderMan着色语言，RenderMan Shading Language，简称RSL，使用RenderMan着色语言编写的源程序，其源代码文件扩展名通常是sl。

### RenderMan接口

RenderMan接口，定义了一些基本的数据类型，以规范的C语言实现为例，规范把C语言的short、int、float、char数据类型，分别映射至其RtBoolean、RtInt、RtFloat和*RtToken类型，另外，规范还定义了RtColor、RtPoint、RtVector、RtMatrix等特定于图形学着色计算必要的数据类型。

规范的图形状态（graphics state），包括了渲染一个模型所需的全部信息，RenderMan接口的命令，要么改变图形状态，要么渲染一个模型。图形状态又分为两部分，其一是全局状态，在渲染一幅图像或序列中的一帧时，保持不变；其二是当前状态，针对不同待渲染的模型，可以发生改变。全局状态中的参数，称为选项（Options）；当前状态中的参数，称为属性（Attributes）。选项包括相机和显示（指输出像素的）参数，还有其他影响渲染质量的参数；属性包括控制模型外观和材质的参数（比如颜色、透明度、着色模型等），还有模型的位置、朝向和细分程度等参数。

RenderMan规范支持多边形 (计算机图形)、曲面片、细分曲面、二次曲面、点和曲线、元球、程序图元等多样的几何模型

### RenderMan着色语言（RSL）

RenderMan规范引入了RenderMan着色语言，使三维场景的外观不只用很少的参数来描述，而是允许使用类似C语言的程序来编写任意复杂的着色函数，通常称之为程序纹理和着色器（shader）。光照以及表面置换也是可编程的，能用着色语言编程来修改。RSL允许每个语句以单指令流多数据流的方式执行，但不强制使用此方式。另一个使RenderMan渲染器区别于许多其他渲染器的功能是它允许输出着色函数里的任意信息，不管是表面法线、单独的灯光通道还是什么别的信息，都可以使用RenderMan渲染器输出到单独的通道里。

一个RSL编写的着色器，可以用于任何符合RenderMan渲染规范的RenderMan渲染器，比如皮克斯的PhotoRealistic RenderMan、DNA Research的3Delight，以及开源的Pixie和Aqsis。

RSL可以编写独立的函数和RenderMan渲染规范定义的五种类型的着色器：surface，light，volume，imager和displacement着色器。

以下是定义塑料表面材质的一个示例着色器：

```c
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（最终表面透明度）或任意所需信息，从而完成着色过程。

一个着色器可以用于不同的三维几何模型，每个着色器实例的参数数值可不一样。着色器没有返回值，而是利用“输出变量”存储计算的数值。但函数可以接受参数，并返回一个值。比如，以下函数通过点积操作符“.”计算矢量的长度并将之返回。

```c
float length(vector v) {
  return sqrt(v . v);
}
```

### 必备功能

一个RenderMan渲染器，必须实现以下功能：

- 完全层级化的图形状态（graphics state），包括属性、变换栈（transformation stacks）和有效光源列表。
- 正交投影和透视投影视角变换。
- 基于深度的隐面消除。
- 像素过滤和反走样。
- 图像量化前的伽马校正和dithering。
- 输出图像包括RGB、A和Z的任意组合，并且分辨率可由用户指定。
- 所有规范里描述的几何图元，以及各图元的标准图元变量。
- 支持可编程着色。
- 支持索引纹理贴图、环境贴图和阴影贴图。
- 须提供规范所要求的十五种标准的着色器，包括light source，surface，volume，displacement和imager等类型。任一新增的和由规范标准衍生的着色器，都必须提供一个等效的RenderMan着色语言描述作为该着色器的文档。

### 可选功能

此外，渲染器还可以实现以下的某项功能：

- 面光源
- 景深
- 置换贴图
- 环境贴图
- 全局照明
- 细节层次
- 运动模糊
- 特殊镜头映射
- 谱色（Spectral colors）
- 光线跟踪
- 实体建模
- 体着色

## 工具

- RenderMan 3delight，支持免费下载学习 主流的rendemran 渲染软件
- RenderMan Studio
- RenderMan Pro Server
- RIBKit，开源的RenderMan工具集，包括一个图形界面的材质编辑器——SLer。
- RIBShrink和 RIBDepends，3Delight渲染器附带的RIB精简工具和依赖处理工具。
- ShaderMan.Next，开源的材质编辑器， ShaderMan的重写。

### RIB导出工具

- 3Delight：，支持MAYA XSI 即将支持MAX 的版本
- 3ds Max： PaxRendus，已停止开发
- Blender：开源的 ribMosaic
- Tim Dapper的 LightMan
- Felipe Esquivel的 Light-R，免费软件
- 3Delight for Maya
- liquidmaya，开源软件
- AnimalLogic的 MayaMan
- 皮克斯的 RenderMan for Maya
- 3Delight for XSI
- Rising Sun Pictures的 Affogato，开源软件
- Graphic Primitives的 XSIMan

## 编程语言实现

- Python计算机图形工具集，Python实现
- RubyMan，Ruby实现
- G&RT，Lua实现

## 外部链接

- RenderMan规范，——规范的官方页面
- RenderMan仓库
- Malcolm Kesson教授的 CG参考和教程
- RenderMan笔记
- Dominik Susmel的 RenderMan 着色语言教程
- Rendering for Beginners里用到的 RIB文件和材质