1. 程式人生 > >細說 ogre 中的材質指令碼

細說 ogre 中的材質指令碼

資源組管理器初始化完畢時,裝載材質指令碼,OGRE會自動的在組相關的資源位置查詢".materal”副檔名的檔案,並對這些指令碼進行語法解析。手動解析可以通過MaterialSerializer::parseScript()。但是注意的是:解析指令碼時並沒有對指令碼中定義的全部紋理等資源進行載入,所以,在我們訪問一個材質的時候,一定要確保它已經裝載,或者,我們手動將此材質Load()一次再進行訪問。另外,材質名必須唯一,且不可有”:”號。
格式:以{},空格,//,作為識別符號。
// 後跟註釋,不支援多行註釋。
{} 之間代表為一個解析單元。
    每一個material XXX 代表是一個材質單元。其中,每一個technique代表一個材質渲染手法,pass是每個渲染通路模式,  texture_unit則是一個紋理單元。
一個材質指令碼允許有多個渲染手法技術,一個渲染手法技術中允許有多個渲染通路模式,一個渲染通道允許有多個紋理單元。
 
渲染技術Techinique:
一個“渲染技術”就是一個單獨的渲染物體的方法。多個技術的存在原因是為適用不同的顯示卡以及根據遠近關係對一個物體進行不同的渲染。
技術的排列需要一定順序,一般來說,最常用最的技術放在指令碼最前面,
格式為:  Techinique 技術名
不命名的技術預設會以其序列號進行命名,注意,技術名不可重複。
 
方案技術scheme:
因為我們對不同的顯示卡標準或根據某中不同的需求,設計出不同的技術,每種技術所適用的環境方案需要我們指出。
格式為:  scheme 方案名
預設的方案是default,若我們某一個技術適用於開啟hdr,Shader3.0的方案,我們只需對該技術設定方案為 scheme hdr_open_shader_3_0 即可。
 
細節層次索引 lod_index:
每一個技術都必須對應一個細節層次索引。一般來說,預設的都是0,即最近最優秀的渲染技術,當我們需要對遠處細節進行渲染時,則設定這個值吧。
格式為:  lod_index 數值層級
雖說lod的數值層級是從0-65535,一般設定2-4層就差不多了吧。因為技術有一定的排列順序,所以,我們一般是將index大的技術放在後面。
 
細節層次距離 lod_distances:
這裡指定使用不同的細節層次的距離值,注意該屬性必須在所有的技術塊外面進行宣告指定。
如例子中所標識:lod_distance 200 就代表,在0-200這個距離內,我們使用細節層次為0的技術,在200以上的則使用細節層次為1的技術
Lod_distance 200 700.5 則表示在0-200時我們使用細節0,200-700.5這段距離使用細節1的材質技術,700.5以上使用細節2的材質技術。200和700.5間使用空格間隔。
 
所以技術的排列順序通常為這樣
Material MyTestMaterial
{
        lod_distances 200
        Technique Lod_0_Hdr_Open_Shader_3_0
        {
               Lod_index 0
               Pass 0
               {
                      Texture_unit
                      {
                         //…..
                       }
                       Texture_unit
                      {
                         //…..
                      }
               }
                Pass 1
               {
                     Texture unit
                    {
                     // ….
                    }
                 }
       }
       Technique Lod_0_Hdr_Close_Shader_1_0
       {
               Lod_index 0
               Pass
               {
                     Texture_unit
                     {
                        //…..
                     }
                     Texture_unit
                     {
                         //…..
                     }
           }
        }
       Technique Lod_1_Hdr_Open_Shader_3_0
       {
               Lod_index 1
               Pass
               {
                     Texture_unit
                      {
                          //…..
                      }
                     Texture_unit
                     {
                          //…..
                     }
               }
       }
       Technique Lod_1_Hdr_Close_Shader_1_0
       {
                Lod_index 1
                 Pass
                 {
                      Texture_unit
                      {
                         //…..
                      }
                      Texture_unit
                       {
                          //…..
                       }
                  }
         }
}
 
Pass渲染通路:
再次強調一個概念:一個材質指令碼,為了適應不同的顯示卡和LOD細節層次技術,我們允許有多個技術,為了加速充分的使用GPU,每個技術中同時又支援多通道的渲染,每個渲染通道內,同時又允許有多個紋理單元。首先這個改變必須明確理解才能順利的進行材質指令碼的設計。
我們在“渲染通路”這層可以設定以下屬性:
ambient       材質的環境光反射係數
格式是 ambient red green blue alpha 
    每個值要求為0.0-1.0之間,例如ambient 0.2 0.2 1.0 1.0代表每個頂點對環境光的反射係數。注意:若關閉了動態光照和紋理層的光照色彩混合的話,該項就不起作用了,此時完全是紋理顏色。預設值為全白。
  diffuse       材質的漫反射係數
格式是 diffuse red green blue alpha 其他同上。
  specular      材質的鏡面反射係數
格式是 specular red green blue alpha Shininess ,最後多了一個引數,是閃耀值(高光係數),該值處於1-128之間。注意:若該值較大則會令人感到耀眼的反射。
 emissive      材質自發光係數
格式是 emissive red green blue alpha 
 
   scene_blend 
設定渲染通道和現有的渲染層內容混合方式,有預設的四種方式:
格式為scene_blend add或scene_blend modulate/alpha_blend/colour_blend
 
Add 是將渲染出的顏色和亮度一起疊加到渲染場景中,相當於“scene_blend one one”
Modulate 是將渲染輸出的顏色疊加到渲染場景中,相當於”scene_blend dest_colour zero”
alpha_blend 是將渲染輸出的亮度疊加到渲染場景中,相當於”scene_blend src_colour one_minus_src_colour”
colour_blend 是將渲染輸出的alpha值進行遮罩緩和。相當於”scene_blend src_alpha one_minus_src_alpha”
當然,我們也可以不使用預設的方式,進行自定義源和目標的混合因數
格式為 scene_blend src_factor dest_factor
 
     這樣最終渲染出的顏色就是 (渲染通道的結果 * src_factor) + (渲染場景的顏色 * dest_factor),其中src_factor dest_factor兩個引數可選以下值:
 
one 
常數值1.0 
zero
常數值0.0 
dest_colour
已存在的畫素顏色 
src_colour
紋理畫素顏色 
one_minus_dest_colour
1 -(dest_colour) 
one_minus_src_colour
1 -(src_colour) 
dest_alpha
已存在的畫素alpha值 
src_alpha
紋理畫素alpha值 
one_minus_dest_alpha
1 -(dest_alpha) 
one_minus_src_alpha
1 -(src_alpha) 
 
例如:scene_blend one zero (代表渲染出的紋理完全覆蓋其後的渲染場景,即渲染管道出來的紋理是完全不透明的) ß預設的混合模式也正是這種。
 
 depth_check 
是否開啟深度緩衝檢測 格式為 depth_check on 或 depth_check off
 
   depth_write 
是否開啟深度緩衝寫入。 格式為 depth_write on 或 depth_write off
預設的時候深度緩衝是開啟的,個別時候我們需要渲染一系列透明物體的關係時候,則將其關閉。
 
   depth_func 
寫入象素前的深度比較函式。 格式為 depth_func compareFun
其中compareFun可以取下面值之一。
always_fail
永遠不向渲染目標寫入畫素 
always_pass
總是將畫素寫入渲染目標 
less
如果將要寫入的畫素的深度小於現在緩衝區內容的深度,則寫入 
less_equal
如果將要寫入的畫素的深度小於等於現在緩衝區內容的深度,則寫入 
equal
如果將要寫入的畫素的深度等於現在緩衝區內容的深度,則寫入 
not_equal
如果將要寫入的畫素的深度不等於現在緩衝區內容的深度,則寫入 
greater_equal
如果將要寫入的畫素的深度大於等於現在緩衝區內容的深度,則寫入 
greater
如果將要寫入的畫素的深度大於現在緩衝區內容的深度,則寫入 
 
預設值是 depth_func less_equal ,注意:當我們關閉深入緩衝檢測的話,該函式無效。
 
   depth_bias 
設定此渲染通路的深度值的偏向。可用於使共面的多邊形中的一個位於其它之上,例如印製花紋圖案。
 
alpha_rejection 對渲染管道的材質紋理進行alpha資訊剪裁。 格式為 alpha_rejection 
compareFun value
其中value取值範圍是0-255,例如 alpha_rejection less_equal 122 則代表拋棄渲染管道中alpha值大於等於122的象素。附註:考慮到硬體相容,Value最好是0-128之間。
 
   cull_hardware 
硬體剔除方式。 格式為 cull_hardware HCutFun
HCutFun列舉下列三種方式:clockwise / anticlockwise/ none
clockwise將逆時針的三角型都cut掉(即CUT鏡頭反面)
anticlockwise將順時針的三角型都cut掉(即CUT鏡頭正面)
none 不做任何剪下。
預設為 clockwise
 
cull_software 
軟體剪裁方式, 格式為 cull_software SCutFun
SCutFun 列舉以下三種格式:back / front / none
實際上,這個和硬體裁減是類似的,不過,對於一些動態的物件建議不要開啟該項,消耗很大。預設是 back 剪裁。
 
 lighting 
是否開啟動態光照, 格式為 lighting on / off 
注意:使用了頂點程式,此屬性無效。動態光照一旦關閉,環境光反射,鏡面反射光,放射光,陰影等屬性均無效。預設為on
 
shading 
Ogre著色方式 , 格式為 shading flat/ gouraud/ phong
Flat不進行插值,每個平面的陰影都由該平面的第一個頂點色決定。
Gouraud 對平面上每個頂點顏色進行線形插入計算。
Phong 全平面使用頂點法線向量。效果好,代價高,部份硬體無法支援此屬性。
預設為 : gouraud
polygon_mode 
柵格化方式。   格式為 polygon_mode solid/ wireframe/ points
面,線,點的柵格化。預設當然是面solid模式。
 
   fog_override 
是否開啟霧化。 fog_override true/false
當fog_override true的時候就需要順序跟出以下引數
霧的type: none 無霧。 相當於fog_override false
           Linear 線性霧。 從 start到end之間有霧
           Exp 幾何方次性霧。 受濃度 density 影響
           Exp2 幾何二次方增加。 受濃度 density 影響
霧的顏色 color: RGB三種顏色值。0.0-1.0之間
霧的濃度 density:設定幾何方次性霧的濃度。對線形霧不影響,但也必須寫上進行佔位。
霧的起始位置 start :對非線性霧無效,但必須寫上佔位。
霧的結束位置 end : 對非線性霧無效,但必須寫上佔位。
例如:fog_override true exp 1 1 1 0.002 100 10000 開啟幾何次方霧。顏色為1,1,1白色,濃度為0.002(若是線性則代表,離鏡頭100至10000之間的距離有霧)
 
 colour_write 
是否關閉渲染通路的顏色寫入功能。 colour_write on/off
該功能一旦關閉,則代表渲染通路不可輸入任何的顏色渲染。僅在初期初始化深度緩衝區時個別時間有用。預設為開on
 
   max_lights 
此渲染通路最大光源數量。一般使用預設為8 格式為 max_lights 8
 
iteration 
是否對渲染通路進行迭代渲染。 預設為僅渲染一次,格式為Iteration once
Iteration 5 代表本渲染通路將被重複執行5次渲染。
Iteration once per_light point 則代表本渲染通道將每個光源點進行一次渲染。
Iteration 5 per_light point則代表本渲染通道將每個光源點進行5次渲染。
·   point_size 
·   point_sprites 
·   point_size_attenuation 
·   point_size_min 
·   point_size_max
 
Texture_unit 紋理單元
我們在PASS渲染通道處已經進行了一次整體的渲染環境設定,然而,在每個紋理單元,我們還可以對單獨的紋理進行渲染屬性設定。
 
texture_alias 
設定一個紋理的別名,類似於技術的別名。格式: texture_alias 紋理別名
預設該別名就是紋理單元的名字。
 
  texture 
本層要使用的靜態紋理圖象名字。可以簡單的格式為
Texture xxx.jpg (注意:紋理檔名禁止有空格)也可對其屬性進行詳細的設定。如下
Texture xxx.jpg 2d 8 none PF_A8R8G8B8
 
2d是裝載的紋理型別,型別實際上包括1d(1象素的紋理點),2d(紋理面,預設也是該項),3d(3D帶深度的紋理),cubic(有些類似天空盒式的貼在立方體內側6個2D紋理,但是僅可貼同一種紋理,不如使用cubic_texture)
8 是MipMap的層級,預設是unlinited,代表可以無限的對紋理進行mipmap,我們這裡設定為8代表生成8個層級遞減的MIPMAP。注意:若多個材質指令碼中使用同一個紋理,切記他們的mipmap數量必須一致。
None 這項是我們指定的單獨的透明通道做為alpha進行裝載,預設的為 none,表示以紅色作為alpha通道。
PF_A8R8G8B8紋理格式,常用的有PF_R5G6B5,PF_A4R4G4B4,PF_A8R8G8B8,PF_X8R8G8B8等。
 
anim_texture 
與上面的texture對應,是用於活動的紋理層,即動態圖象。注意,這裡不是使用預設的儲存好的.gif動畫,而是匯入多楨圖,設定好楨之間的間隔時間。這裡我們有兩種方法:
一種是按照Ogre內部規定對動畫的紋理命名:xxx_0.jpg xxx_1.jpg xxx_2.jpg這樣以0為首,加下劃線遞增命名,這樣我們呼叫時會比較方便,這樣便可以了
Anim_texture xxx.jpg 3 2.2 即代表xxx_0.jpg這樣命名的紋理有3張,間隔時間為2.2秒。
 
另一種是非標準的紋理命名,則需要我們如下寫:
Anim_texture 1.jpg flame2.jpg xxx_3.png hit4.tga 2.2 直接以空格間隔標示逐個標示出每一楨的紋理即可。
注意:2.2是每楨間的間隔時間,若設定為0,則不會自動進行楨畫面切換,需要我們程式碼中手工控制了。
 
  cubic_texture 
建立一個立方體紋理。這個一般用於反射對映和天空盒中。其格式和動態紋理一樣,有兩種方式,一種是Ogre制定的規範,我們呼叫就更加簡單,如下
Cubic_texture skybox.jpg combinedUVW
我們僅提供一個基礎的紋理名,此時OGRE會預設的去查詢skybox_fr.jpg, skybox_bk.jpg, skybox_up.jpg, skybox_dn.jpg, skybox_lf.jpg, skybox_rt.jpg這些紋理。
第二中方式則是按照“前後上下左右”的順序將這些紋理羅列出來。
最後一個引數需要設定為combinedUVW或separateUV, combinedUVW會將紋理組合到一個立方體紋理對映中,帶有UVW三維紋理座標,適合做反射對映。而separateUV僅僅儲存2D的UV座標,適用於天空盒。
 
   tex_coord_set 
因為一個Mesh網格允許有多套紋理座標集,我們在這裡設定使用哪套座標集。格式為 tex_coord_set 3 (使用編號為3的座標集)
預設為 tex_coord_set 0
 
  tex_address_mode 
紋理定址模式。即當紋理UV值大於1.0時的紋理處理方法。引數有以下幾種列舉選擇:
Wrap 會將所有UV值大於1.0的值設定為0.0,紋理會被重複連續繪製。
Clamp 會將所有UV值大於1.0的值設定為1.0,這樣的話就相當於在模糊邊界。
Mirror 會當UV值等於1.0的時候,將紋理反轉後連續繪製。
Border 超過1.0的UV都會被設定為邊界色,就是描邊效果。此項可設定tex_border_colour屬性。
 
tex_border_colour 
和上一屬性對應,設定紋理邊界色,僅對Border紋理定址有效。
格式 : tex_border_colour RGBA(0.0 – 1.0取值)
 
filtering 
紋理過濾形式:我們可以使用其預定的四種基本型別,包括
None 不進行紋理過濾
Bilinear 進行雙線性紋理過濾。就是對mipmap進行挑選過濾,但是不對mipmap各個級別之間進行過濾
Trilinear 進行三線性紋理過濾。將最近的兩個mipmap一起進行過濾。
Anisotropic 各向異性紋理過濾。使用該項,則你必須設定其max_anisotropy值。
預設為bilinear。
 
max_anisotropy 
最大各相異性程度偏差值。根據硬體不同一般限制為8或者16
預設為 max_anisotropy 1
 
mipmap_bias 
我們在Pass通道時已經允許設定mipmap紋理Lod運用層級以及適用的距離。在紋理單元這層級我們可以重新對其進行調整。格式為
Mipmap_bias -3 後面的整數代表在所有的範圍內強制使用增大或縮小的mip級別。-3代表,在所有範圍內強制使用更大3級的mip紋理。
預設是不進行層級偏移:mipmap_bias 0
 
  colour_op 
簡單的紋理混合方式,我們可以使用預定義的4項列舉:
Replace 不處理,用當前的紋理直接替換掉後面的所有顏色。覆蓋式。
Add 將當前紋理色和後面的渲染顏色進行加法處理。
Modulate 將當前紋理色和後面的渲染顏色進行乘法處理。
Alpha_blend 將當前紋理和後面的紋理進行alpha顏色混合。
預設為 colour_op modulate 當前紋理色和後面顏色進行乘法混合。
 
  colour_op_ex 
高階的紋理混合模式,可以詳細的指定混合係數和效果,但個人不推薦使用。效率消耗較大,且受不用的硬體限制性大,使用預設支援的4種混合模式可以了。
 
colour_op_multipass_fallback 
當上面一個colour_op_ex設定要求過高,硬體無法支援多紋理混合時,則不得不呼叫該項進行多通路混合渲染。若我們使用的是colour_op預設定的4種紋理混合模式,則無需在此處理,OGRE底層已經做了完善的處理。
 
 alpha_op_ex 
同colour_op_ex,不推薦使用。
 
   env_map 
設定環境對映效果。該項可以使用預定義的五個選項
Off 關閉環境對映反射。 預設即本項。
Spherical 開啟球面環境對映。 它需要一個單獨的紋理,該紋理進行周圍反射的記錄。
Cubic_reflection 開啟平面環境對映。
 
 scroll 
靜態紋理偏移。 
格式如下:scroll x y 
 
scroll_anim 
動態紋理偏移。 ……針對上一功能的補足。給紋理層一個移動速度進行偏移。
格式為 scroll_anim xspeed yspeed
 
rotate 
以固定角度靜態旋轉一個紋理。和scroll沒什麼區別。格式如下 rotate angle
注: angle是逆時針旋轉的角度數
 
rotate_anim 
動態旋轉一個紋理。 格式為 rotate_anim 3 代表每秒旋轉3次360度。
 scale 
靜態縮放一個紋理。 格式為 scale x_scale y_scale。
   wave_xform 
製作類似於水面波紋性質的專用函式。可以製造出一個類似於波狀的動態紋理變化形式。
格式: wave_xform <xform_type> <wave_type> <base> <frequency> <phase> <amplitude>
示例: wave_xform scale_x sine 1.0 0.2 0.0 5.0
xform_type
scroll_x
變動x滾動值 
scroll_y
變動y滾動值 
rotate
變動旋轉值 
scale_x
變動x比例值 
scale_y
變動y比例值 
wave_type
sine
典型的正弦波,在最小值和最大值之間平穩地迴圈。 
triangle
以恆定的速度增加減少的有角度的波,在極值時立即改變。 
square
最大是波長的一半,最小是瞬時轉換之間的停止時間。 
sawtooth
經過一段時間,從最小逐漸持續增加到最大,最後立即回到最小。 
inverse_sawtooth
經過一段時間,從最大逐漸持續減少到最小,最後又立即返回最大。::base 
基值,如果amplitude > 0就是指最小值,amplitdue < 0就是指最大值。 
frequency
波每秒重複的次數,即速度。 
phase
波開始的偏移量。 
amplitude
波的大小。 
波的輸出範圍在{base, base+amplitude}。所以,以在x方向調整紋理為例,沿正弦波方向從1(標準值)調整到5,即表示每5秒一個週期(每秒0.2個波)。 
 
  transform 
為紋理提供一個4*4矩陣以直接替代上面的旋轉,縮放,移動等一系列變化。
格式為 transform m00 m01 m02 m03 m10 m11 m12 m13 m20 m21 m22 m23 m30 m31 m32 m33
   binding_type 
設定繫結型別。該紋理是繫結到片斷處理單元還是頂點處理單元。格式為:
Binding_type fragment / vertex
預設為繫結片斷處理單元。
   content_type 
設定紋理內容的來源型別。格式為 content_type named / shadow
預設是為named,表示紋理單元圖片來源於texture,cubic_texture,anim_texture之一,但個別時候我們需要使用陰影紋理,則此時可以設定為shadow
注: 除去上面的紋理屬性設定之外,假若我們需要更高階的紋理屬性支援,可以使用外部紋理源。
頂點程式和片斷程式宣告:
假設我們在材質指令碼中需要使用頂點程式或者片段程式,那麼,類似於函式宣告呼叫一樣,我們必須在呼叫它之前先對其進行宣告定義。
假若呼叫點都在一個.meterial指令碼內還好,我們只需要在呼叫處的上面進行宣告定義,但假若多個指令碼都呼叫一段頂點程式,我們就需要將這段頂點片斷程式獨立出任何的.meterial指令碼之外,獨立編寫一個 .program 格式的指令碼,在這個指令碼中進行定義,這樣的話,這個外部定義的頂點片斷程式就會順利的在任何位置上被呼叫讀取。
個人推薦所有的頂點程式都獨立為一個指令碼,可以更大程度上方便我們整理。
 
頂點程式本身既可以是一些低階語言,例如vs_1_1語法規格寫的彙編程式碼,也可以是HLSL,GLSL,CG,個人更推薦使用後者。
 
一個最基本的片斷程式要求有以下幾個要點說明:
 vertex_program myVertexProgram asm
 {    
  source myVertexProgram.asm     
  syntax vs_1_1
 }
1:在頭部給出程式名字,之後說明程式型別。“asm”
2:指示出資源來自何處。” source”
3:指示出語法規則。“vs_1_1”
我們可以通過Ogre的GPU管理器來獲取當前顯示卡支援的語法列表。
GpuProgramManager::GetSingleton().getSupportedSyntax()來獲得。
一般顯示卡支援的語法規則如下:
vs_1_1 
這是一種DirectX頂點渲染器彙編語法。 
支援顯示卡有:ATI Radeon 8500,nVidia GeForce 3。 
vs_2_0 
另一種DirectX頂點渲染器彙編語法。 
支援顯示卡有:ATI Radeon 9600,nVidia GeForce FX 5系列。 
vs_2_x 
另一種DirectX頂點渲染器彙編語法。 
支援顯示卡有:ATI Radeon X系列,nVidia GeForce FX 6系列。 
vs_3_0 
另一種DirectX頂點渲染器彙編語法。 
支援顯示卡有:nVidia GeForce FX 6系列。 
arbvp1 
這是OpenGL標準頂點程式彙編格式。大體上相當於DirectX vs_1_1。 
vp20 
這是一種nVidia特有的OpenGL頂點渲染器語法,是vs 1.1的一個超集。 
vp30 
另一種nVidia特有的OpenGL頂點渲染器語法。它是vs 2.0的一個超集,被nVidia GeForce FX 5系及以上系列支援。 
vp40 
另一種nVidia特有的OpenGL頂點渲染器語法。它是vs 3.0的一個超集,被nVidia GeForce FX 6系及以上系列支援。 
ps_1_1, ps_1_2, ps_1_3 
DirectX畫素渲染器(例如片斷程式)彙編語法。
支援顯示卡:ATI Radeon 8500,nVidia GeForce 3。 
註解:對於ATI 8500,9000,9100,9200硬體,也可用於OpenGL。ATI 8500到9200不支援arbfp1但是確實支援OpenGL的atifs擴充套件,非常類似DirectX的ps_1_4。OGRE有針對atifs編譯器的ps_1_x模組,當在ATI硬體上使用ps_1_x時,它會自動執行。 
ps_1_4 
DirectX畫素渲染器(片斷程式)彙編語法。
支援顯示卡有:ATI Radeon 8500,nVidia GeForce FX 5系列。 
註解:對於ATI 8500,9000,9100,9200硬體,此項也可用於OpenGL。ATI 8500到9200不支援arbfp1但是支援OpenGL的atifs擴充套件,功能上非常類似於DirectX中的ps_1_4。OGRE有針對 atifs編譯器的ps_1_x模組,當在ATI硬體上使用ps_1_x時,它會自動執行。 
ps_2_0 
DirectX畫素渲染器(片斷程式)彙編語法。
支援顯示卡有:ATI Radeon 9600,nVidia GeForce FX 5系列。 
ps_2_x 
DirectX畫素渲染器(片斷程式)彙編語法。基本上是帶有更多指令的ps_2_0。 
支援顯示卡有:ATI Radeon X系列,nVidia GeForce FX 6系列。 
ps_3_0 
DirectX畫素渲染器(片斷程式)彙編語法。
支援顯示卡有:nVidia GeForce FX 6系列。 
ps_3_x 
DirectX畫素渲染器(片斷程式)彙編語法。
支援顯示卡有:nVidia GeForce FX 7系列。 
arbfp1 
這是OpenGL標準片斷程式彙編格式。大體上相當於ps_2_0,意味著不是所有支援DirectX下的基本畫素渲染器都支援arbfp1(例如GeForce3和GeForce4就都不支援arbfp1,但是它們都支援ps_1_1)。 
fp20 
這是一個nVidia特有的OpenGL片斷程式語法,是ps 1.3的一個超集。它允許你為基本片斷程式使用'nvparse'格式。實際上,它使用NV_texture_shader和 NV_register_combiners在GL下提供相當於DirectX's ps_1_1的功能,但是僅限於nVidia顯示卡。然而,因為ATI顯示卡比nVidia早一步採用arbfp1,所以它主要用於像GeForce3和 GeForce4系列的nVidia顯示卡。你可以在