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 渲染器，比如皮克斯的 PRMan、DNA Research 的 3Delight，以及開源的 Pixie 和 Aqsis。

RSL 可以編寫獨立的函數和 RenderMan 渲染規範定義的五種類型的著色器：surface，light，volume，imager 和 displacement 著色器。

以下是定義塑料表面材質的一個示例著色器：

著色器通過接收一些可以由藝術家調節的變量比如 Cs（表面顏色），Os（表面透明度）等，結合 RenderMan 渲染規範定義的內置變量 N（著色點的法線），P（著色點位置）等，依據一定的算法計算出 Ci（最終表面顏色），Oi（最終表面透明度）或任意所需信息，從而完成著色過程。

一個著色器可以用於不同的三維幾何模型，每個著色器實例的參數數值可不一樣。著色器沒有返回值，而是利用「輸出變量」存儲計算的數值。但函數可以接受參數，並返回一個值。比如，以下函數通過點積操作符「.」計算矢量的長度並將之返回。

### 必備功能

一個 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：[1]（頁面存檔備份，存於網際網路檔案館），支持 MAYA XSI 即將支持 MAX 的版本
* 3ds Max：PaxRendus，已停止開發
* Blender：開源的 ribMosaic
* Lightwave:
  * Tim Dapper 的 LightMan（頁面存檔備份，存於網際網路檔案館）
  * Felipe Esquivel 的 Light-R，免費軟體
* Maya：
  * 3Delight for Maya
  * liquidmaya，開源軟體
  * AnimalLogic 的 MayaMan（頁面存檔備份，存於網際網路檔案館）
  * 皮克斯的 RenderMan for Maya
* Softimage：
  * 3Delight for XSI
  * Rising Sun Pictures 的 Affogato，開源軟體
  * Graphic Primitives 的 XSIMan

## 程式語言實現

* Python 計算機圖形工具集（頁面存檔備份，存於網際網路檔案館），Python 實現
* RubyMan，Ruby 實現
* G&RT（頁面存檔備份，存於網際網路檔案館），Lua 實現

## 參見

* Reyes 渲染架構

## 參考書目

* Apodaca, Anthony A.; Larry Gritz, Ronen Barzel. Advanced RenderMan: Creating CGI for Motion Pictures. San Francisco: Morgan Kaufmann Publishers. 1999. ISBN 1-55860-618-1. OCLC 42621055.
* Ebert, David S.; F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, Steven Worley. Texturing and modeling: a procedural approach, 3rd ed.. Burlington, MA: Morgan Kaufmann Publishers. 2003. ISBN 1-55860-848-6. OCLC 52689816.
* Raghavachary, Saty. Rendering for Beginners: Image synthesis using RenderMan. Burlington, MA: Focal Press. 2005. ISBN 0-240-51935-3. OCLC 57670361.
* Stephenson, Ian. Essential RenderMan Fast. London, New York: Springer. 2002. ISBN 1-85233-608-0. OCLC 50494960.
* Upstill, Steve. The RenderMan Companion: A Programmer's Guide to Realistic Computer Graphics. Reading, Mass: Addison-Wesley. 1990. ISBN 0-201-50868-0. OCLC 19741379.
* Cortes, Rudy; Saty Raghavachary. The RenderMan Shading Language Guide. Course Technology PTR. 2007. ISBN 1-598-63286-8.

 

## 參考資料

## 外部連結

* RenderMan 規範，—— 規範的官方頁面
* RenderMan 倉庫
* Malcolm Kesson 教授的 CG 參考和教程（頁面存檔備份，存於網際網路檔案館）
* RenderMan 筆記
* Dominik Susmel 的 RenderMan 著色語言教程
* Rendering for Beginners（頁面存檔備份，存於網際網路檔案館）里用到的 RIB 文件和材質