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文件和材質