RenderMan規範

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渲染接口,主要包括兩大部分,第一部分是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規範支持多邊形英語Polygon (computer graphics)曲面片細分曲面二次曲面和曲線、元球程序圖元等多樣的幾何模型

RenderMan着色語言(RSL)

RenderMan規範引入了RenderMan着色語言,使三維場景的外觀不只用很少的參數來描述,而是允許使用類似C語言的程序來編寫任意複雜的着色函數,通常稱之為程序紋理着色器(shader)。光照以及表面置換也是可程式的,能用着色語言編程來修改。RSL允許每個語句以單指令流多數據流的方式執行,但不強制使用此方式。另一個使RenderMan渲染器區別於許多其他渲染器的功能是它允許輸出着色函數裏的任意信息,不管是表面法線、單獨的燈光通道還是什麼別的信息,都可以使用RenderMan渲染器輸出到單獨的通道里。

一個RSL編寫的着色器,可以用於任何符合RenderMan渲染規範的RenderMan渲染器,比如皮克斯的PRMan、DNA Research的3Delight,以及開源的PixieAqsis

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渲染器,必須實現以下功能:

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

可選功能

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

工具

RIB導出工具

程式語言實現

參見

參考書目


參考資料

  1. ^ 1.0 1.1 RenderMan规范主页. [2012-12-22]. (原始內容存檔於2012-12-23). 

外部連結