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。

1.1 RenderMan 介面

RenderMan 介面，定義了一些基本的資料型別，以規範的 C 語言實現為例，規範把 C 語言的 short、int、float、char 資料型別，分別對映至其 RtBoolean、RtInt、RtFloat 和 * RtToken 型別，另外，規範還定義了 RtColor、RtPoint、RtVector、RtMatrix 等特定於圖形學著色計算必要的資料型別。

規範的圖形狀態（graphics state），包括了渲染一個模型所需的全部資訊，RenderMan 介面的命令，要麼改變圖形狀態，要麼渲染一個模型。圖形狀態又分為兩部分，其一是全域性狀態，在渲染一幅影像或序列中的一幀時，保持不變；其二是當前狀態，針對不同待渲染的模型，可以發生改變。全域性狀態中的引數，稱為選項（Options）；當前狀態中的引數，稱為屬性（Attributes）。選項包括相機和顯示（指輸出畫素的）引數，還有其他影響渲染質量的引數；屬性包括控制模型外觀和材質的引數（比如顏色、透明度、著色模型等），還有模型的位置、朝向和細分程度等引數。

RenderMan 規範支援、曲面片、細分曲面、二次曲面、點和曲線、元球、程式圖元等多樣的幾何模型

1.2 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 著色器。

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

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 (Kaambient + Kddiffuse (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);

}

1.3 必備功能

一個 RenderMan 渲染器，必須實現以下功能：

完全層級化的圖形狀態（graphics state），包括屬性、變換棧（transformation stacks）和有效光源列表。
正交投影和透視投影視角變換。
基於深度的隱面消除。
畫素過濾和反走樣。
影像量化前的伽馬校正和 dithering。
輸出影像包括 RGB、A 和 Z 的任意組合，並且解析度可由使用者指定。
所有規範裡描述的幾何圖元，以及各圖元的標準圖元變數。
支援可程式設計著色。
支援索引紋理貼圖、環境貼圖和陰影貼圖。
須提供規範所要求的十五種標準的著色器，包括 light source，surface，volume，displacement 和 imager 等型別。任一新增的和由規範標準衍生的著色器，都必須提供一個等效的 RenderMan 著色語言描述作為該著色器的文件。

1.4 可選功能

此外，渲染器還可以實現以下的某項功能：

面光源
景深
置換貼圖
環境貼圖
全域性照明
細節層次
運動模糊
特殊鏡頭對映
譜色（Spectral colors）
光線跟蹤
實體建模
體著色

工具

RenderMan 3delight, 支援免費下載學習 主流的 rendemran 渲染軟體
RenderMan Studio
RenderMan Pro Server
RIBKit，開源的 RenderMan 工具集，包括一個圖形介面的材質編輯器 ——SLer。
RIBShrink 和 RIBDepends，3Delight 渲染器附帶的 RIB 精簡工具和依賴處理工具。
ShaderMan.Next，開源的材質編輯器， ShaderMan 的重寫。

2.1 RIB 匯出工具

3Delight：，支援 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
的 Affogato，開源軟體
Graphic Primitives 的 XSIMan

程式語言實現

Python 計算機圖形工具集，Python 實現
RubyMan，Ruby 實現
G&RT，Lua 實現