2012年9月19日 星期三

NiMesh composition


NiMesh are the array of NiDataStreamRef objects that contain all varying attributes of the mesh (vertices, indices, etc)

Element - An element is an array of data that supplies a single input variable (varying or uniform) to a shader program. Each stream element defines a format and an offset where a particular element may be found for a given stream. Multiple elements may be interleaved(插入) into a single stream.
這邊指的是因為我們的NiDataStream是一連串的資料,假設有十組頂點資料,每組內的資料包含了當前的頂點位置,法向量,貼圖座標,前面這三項我們稱為Element

Region A Region defines a contiguous subset of a stream. The elements must be the same across all regions in a stream. Every region contains the following data:
-the base offset into each stream
-the active number of elements for the Region
Region指的就是data stream內的某部分資料範圍

Mesh裡面是很多個data stream ref所組成的。
似乎一個mesh裡可以用好多個,不過我想通常剛好分成各個Sematic各一個stream。應該很少會有相同的Sematicdata stream。不過看起來好像可以多個相同的Semantic data stream。可能主要是共用頂點資料八。但是一個mesh裡只可以有一個USAGE_VERTEX_INDEX 用途的stream

Semantic就是送到Shader內,他要知道目前送來的資料是頂點位置,法向量,還是貼圖座標,這個information就是Semantic
Semantic index:指的像是TEXCOORDINATE0, 1, 2, 3這種暫存器的index

NiDataStreamCreateDataStream,然後就可以丟NiDataStreamElementSets就可以了。

NiDataStreamElementDescribes an element of a NiDataStream object, by data type, format, and offset.

NiDataStreamElementLock是用來可以從指定的Mesh取得某一個特定的semantic的資料,並且可以用來抓到meshsub-mesh的某特定semantic資料的起始位置和結束位置。所以要注意它是已經被綁定的。

NiDataStreamPrimitiveLock是用來可以從指定的Mesh取得某一個特定的primitive的資料index資料,像是LineTriangle這種,都是Primitive
Element的話應該可以指定單一某種Semantic的資料全都抓出來的樣子。而Primitive是以Primitive來分,所以Primitive可能會有POSITION and COLOR的資料都有。

NiTStridedRandomAccessIterator 就是用來抓element內的資料的。
Semantic - The elements must be the same across all regions in a stream


NiDataStreamRef是用來記錄一個data stream裡面資料代表什麼資料的範圍,及語意,NiDataStreamRef可以多個對一個data stream


NiDataStreamElement::Type 資料型態int or something
NiDataStreamElement::Format 資料擺放格式,可能是xyzw,或者zyxw這種擺放格式。

2012年7月12日 星期四

QT lib compiler with visual studio

想compiler自己的QT lib以及同時產生出visual studio的專案。先下載qt-win-opensource-4.8.2-vs2008,本身就有附lib檔,但是沒有專案檔。如果想要2005的lib檔以及專案檔就得自己compiler。
目前測試環境:
qt-win-opensource-4.8.2-vs2008
visual studio 2005 professional
window 7 企業版
---------------------------------以下轉載別人的內容
添加系統環境變量
QTDIR=D:\Qt\4.8.1
QMAKESPEC=win32-msvc2005
註:如果是vs2008話改成win32-msvc2008
在PATH裡添加%QTDIR%\bin

打開VS2005命令提示窗口(開始菜單-Microsoft Visual Studio 2005-Visual Studio Tools-Visual Studio 2005 Command Prompt)
在VS2005命令提示窗口(系統的命令窗口不行)下切換到目錄:D:\Qt\4.8.1
輸入命令行: configure -debug-and-release -opensource -platform win32-msvc2005
提示是否接收license的時候輸入y
10分鐘左右的樣子就configure完成了
經常在Linux下編譯安裝軟件的同學對這一步肯定非常熟悉嘍。它的作用就是根據當前系統的具體環境生成一個makefile文件,供之後make用。
註:configure 後面的參數可以根據自己的需要來做調整,去掉不需要的東西,精簡系統,減少make編譯時間。參數說明可以看官方文檔 http://doc.qt.nokia.com/4.7-snapshot/configure-options.html 或者configure –help
configure完成之後就要make了,這是一個漫長的過程。
make步驟有兩個選擇,一是繼續輸入nmake,二是通過並行編譯版的nmake——jom來編譯。
關於jom的介紹可以看這裡,http://labs.qt.nokia.com/2009/03/27/speeding-up-visual-c-qt-builds/, 有人寫了並行版的nmake,可以讓多核cpu來所有的cpu資源都利用起來,加快編譯速度。ftp://ftp.qt.nokia.com/jom/ 這裡下載最新的jom,然後解壓到一個位置,比如說 D:\Qt\jom,然後在make步驟就可以這樣..\jom\jom.exe -j N,這裡的N是cpu個數。
我用nmake編的時候出錯了,後來重新configure了一份,用jom來編,N為4,沒有錯誤,用了不到兩個小時的時間。
----------------------自己實際遇到的問題
DefaultLocalizationStrategy.cpp(327) : 「error C2001: newline in constant」 in building 4.8.0
主要應該是當遇到不支援unicode的程式時,OS會把這個視為什麼語系,因為我們是繁體中文版,所以只要把OS預設的地方改成英文(美國)就好了。
win 7的地方在控制台->地區及語言->系統管理(分頁)->非unicode的語言改成英文(美國)

2012年7月7日 星期六

Homogeneous Matrix Decomposition

主要的用途是Matrix經過許多translate, rotate, scale後的matrix怎麼解析回原來的matrix或數值。目前是沒使用過這種東西,而且也覺得要在程式上實作效率應該蠻慢的,覺得真的要求出來User做了什麼動作,花點空間紀錄最實在。如果真的要的話只知道有種東西QR Decomposition,Wiki查的到這邊只是給自己留著紀錄,也沒實際看懂過。

2012年5月8日 星期二

Gambryo standard material registry global constant

因為繼承gamebryo previewer的standard material來修改gamebryo的shader pipeline,一般我們新增一個global attribute這個動作一般都放在standard material的callback function,像是HandleFinalPixelOutputs function。但是要注意因為這個callback function是在model被render時,如果shader仍然沒有被產生出來,才會呼叫到這一個callback function。所以自然的在gamebryo shader factory global attributes list,都還不知道有一個新增的變數。如果剛好我們在這之前,先用了NiShaderFactory::UpdateGlobalShaderConstant,這樣自然在 global attributes list內,找不到指定變數名來update。如果一定要在callback function被呼叫之前就要有這個  global attribute,應該用 NiShaderFactory::RegisterGlobalShaderConstant。

那為什麼一般像fx的shader就不用這樣,是因為fx本身在code內就寫好有哪些attributes是global了,所以gamebryo去load指定的shader library時就會去找到哪些attributes是global的,把它加到global attributes list。而相反的因為繼承standard material的關係,因為是shade tree的關係,所以shader code是動態產生的,必須等到callback function執行才知道有新的global attributes。

Shader render state annotation

directX fx shader一般有提供一些render state,可以直接在每個pass內決定說要做什麼樣的render方式,像是AlphaBlendEnable = false; ZEnable = false;這類的config。

那要注意的是像gamebryo,它則是要在technique這邊宣告一些東西

technique testTechnique
<
    string Description = "Gamebryo annotation";//這行只是描述而已
    string ShaderName = "testTechnique";//gamebryo這行要match technique的名字
    bool UsesNiRenderState = true;//要設為true, gamebryo才會設定render state
>
{
    pass P0
    {
        .....
        ZEnable = false;
        AlphaBlendEnable = false;
    }
}

2012年4月18日 星期三

Linear Depth Map

一般我們在shader內取得depth的方式是 projected position.z / projected position.w。但是這樣的depth並不是線性分佈的,離鏡頭比較近的東西,Z值變化很大,會吃掉Z值90%的值。也就是說距離鏡頭前10%的部分,如果depth的range是0~1之間的話,就會在0~0.9值在變化,剩下的離鏡頭90%的部分,就只會在0.9~1之間變化。

所以要改成projected position.z / camera far plane dist。

目前原理都不曉得為什麼,所以之後再補上。

2012年4月10日 星期二

Gamebryo NiStandardMaterial Alpha Testing

基本上Gamebryo讀取的Model套用到NiStandardMaterial的話,如果Model要做Alpha Testing或Blending的話,基本上就會使用Model本身的設定。但是可以看到Gamebryo產生出來的shader code,實際上他並沒有在shader內做discard的動作,shader code內的程式都會執行,不過重點在於color register 0的alpha value,實際上Gamebryo內是用這個alpha value來做Alpha testing的。所以當今天用了其他的color register,即使把alpha vlaue都設為1都沒用,因為color 0 alpha testing後去掉的pixel,其他color register相同的pixel也不會有顏色。

所以要注意不要任意的把color 0的alpha value任意設,應該follow model最後的值。