1. 程式人生 > >OGRE的材質指令碼 (二)

OGRE的材質指令碼 (二)

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顯示卡。你可以在

http://developer.nvidia.com/object/nvparse.html找 到更多有關nvparse的資訊。
fp30
另一種nVidia特有的OpenGL片斷渲染語法。它是ps 2.0的一個超集,被nVidia GeForce FX 5系列或更高階的顯示卡支援。
fp40
另一種nVidia特有的OpenGL片斷渲染語法。它是ps 3.0的一個超集,被nVidia GeForce FX 6系列或更高階的顯示卡支援。
 
詳細的語法編寫,實在沒有興趣詳細研究下去了。所以這裡略過,我們需要知道的是,除了HLSL,GLSL,CG以外,還有一個Ogre自動識別處理的型別,unified可以統一的對程式定義,這樣就可以依賴於渲染系統和硬體支援自動的選擇渲染程式。

相關推薦

OGRE材質指令碼

Texture_unit 紋理單元我們在PASS渲染通道處已經進行了一次整體的渲染環境設定,然而,在每個紋理單元,我們還可以對單獨的紋理進行渲染屬性設定。 texture_alias 設定一個紋理的別名,類似於技術的別名。格式: texture_alias 紋理別名預設該別名

OGRE材質指令碼

       Container Panel (MyNewOverlays/FirstPanel)      // Container對應的是element,這兩者都是對Panel的修飾詞,當該面上有新的子面時就使用Container,若是一個完全無子面的面, 則可使用 element進行修飾。Panel是註

OGRE材質指令碼

       Ogre中的圖象資料的資訊都被封裝在一個個的PixelBox物件之中,我們需要注意的是PixelBox本身是儲存在GPU中,但是真正的紋理都是保 存在記憶體中,並非讀到GPU中。GPU中的 PixelBox儲存著記憶體中象素的格式位置內容資訊的描述,但是PixelBox並沒有記憶體管理的功能,它

java調Python指令碼:java調Python亂碼問題

java調Python返回結果出現亂碼解決: Python指令碼編碼格式已經用了utf-8,但是返回還是亂碼,說明是java這邊傳過去編碼有問題。 1、Python編碼格式: 2、一般我們中文文字編碼格式常用的有:UTF-8,GBK,GB2312。分別試一下就知道了:

如何編寫一個優雅的Shell指令碼

簡介 繼上一篇,本文主要描述一個shell指令碼的基本組成 公共模組 ## 自定義寫日誌函式 function writelog() { echo "[`date -d '%Y-%m-%d %H:%M:%S'`][$$]: $1" |tess -a $tmplogf

Linux系統下製作服務啟動指令碼

上一篇部落格介紹了在/etc/init.d目錄下製作應用服務啟動和停止指令碼,其實在/usr/bin目錄下也可以製作這種指令碼,不過一般不推薦這種方式,先來看一下是怎麼製作的: vim編寫指令碼start.sh,將指令碼複製到/usr/bin目錄下,去掉字尾名 然後進入任何目

自動化測試工具AutoRunner之錄製指令碼

這一篇主要講一下使用AutoRunner錄製指令碼的方法 一、建立專案: 建立專案的方式有兩種: 1、在專案區單擊滑鼠右鍵,彈出建立專案選單。 2、選中“ 新建專案”,開啟“新建專案”彈窗。 3、 輸入“專案名稱”,此處有兩個選項,我們以“不

ant自動打包指令碼

融合SDK ant自動打包指令碼,可以迴圈打包,採用源工程(主工程)和依賴庫的形式 <?xml version="1.0" encoding="UTF-8"?> <project name="AndroidProjectBuild" default="bu

建立一個簡單gradle指令碼

update time:2019-1-10 Author:要你命三千又三千 type: 學習筆記 文章目錄 問題一:如何是用gradle 搭建的環境建立一個簡單的Gradle指令碼 問題二:gradle Wrapp

Unity3D實用指令碼—— 檢查場景中用到的資源

在專案的開發過程中,經常需要檢查場景中所用到的資源,例如Textures,Materials,Meshs等。 今天來實現如圖所示的資源檢查功能。 程式碼如下: // Resource Checker // (c) 2012 Simon Oliver / HandCirc

Installshield2008 And 指令碼

利用Script來控制其安裝流程的時候。最基本的就是 OnBegin ---------> OnShowUI OnShowUI裡面為:  OnFirstUIBefore  -----------> OnMoveData ------------------>

LoadRunner11錄製APP指令碼***利用WireShake進行抓包

前提:     1、安裝WireShark。在安裝WireShark過程中,會提示是否安裝WinPacp以及USBPacp。其中WinPacp必須安裝     2、電腦和手機必須處於同一網路    

MySQL基礎圖形視窗操作、命令指令碼操作

使用圖形視窗連線 下發windows的navicat 點選“連線”彈出視窗,按照提示填寫連線資訊,如下圖   連線成功後,會在連線名稱下面顯示出當前的資料庫 雙擊選中資料庫,就可以編輯此資料庫 下次再進入此軟體時,通過雙擊完成連線、編輯操作 資料庫操作

Linux命令列與shell指令碼程式設計大全

十一、處理使用者輸入 命令列引數 讀取引數: $0是程式名,$1是第一個引數,$2是第二個引數,以此類推,直到第9個引數$9。當引數個數超過10以後,需要在變數數字周圍加上花括號,如${10},如果輸入到命令列的引數是字串且含有空格,需要使用引號。 #! /bin/bash echo

nginx的指令碼引擎rewrite

其實rewrite指令和上一篇說的if/set/return/break之類的沒多大差別,但是rewrite用起來相對複雜,我就把他單獨放到了這裡。想要弄懂nginx的指令碼引擎需要先明白處理request的十一個處理階段,不懂的話先去搜一下看看,網上很多。先說一下rewrite的用法吧。 rewri

資料庫tab補全功能,使資料庫支援簡體中文,日誌管理,備份指令碼

一、如何在MySQL資料庫中使用tab鍵補全功能 1.修改主配置檔案/etc/my.cnf   vim /etc/my.cnf    [mysql]     #no-auto-rehash     auto-rehash 2.重啟MySQL服務,登入測試   /etc/init.d/mysqld

JMeter學習錄製指令碼

---------------------------------------------------------------------------------------------------- 環境 Badboy  version 2.1.1 JDK:&nbs

Shell指令碼程式設計

Shell替換 shell變數替換 如果表示式中包含特殊字元,Shell 將會進行替換。例如,在雙引號中使用變數就是一種替換,轉義字元也是一種替換。 #!/bin/bash a=10 echo -e "Value of a is $a \n" 執行結果: Value

零基礎學習OpenGL--材質、光照貼圖

         接上節:         我們給物體定義了一個材質的屬性,這裡包含了 環境光照(Ambient Lighting),漫反射光照(Diffuse Lighting),鏡面光照(Specula

TIGK技術棧:kapacitortickscript指令碼基本概念和語法

kapacitor指令碼一些核心概念 task: task是一個tickscript的最大粒度單位,可以說,一個tickscript就是一個task,task標識在kapacitor當中處理一段資料(a set of data)的任務集,一段指令碼要起作用