2009年7月9日 星期四

gTF-20090709 stable release

gTF穩定版第三彈釋出!


主要的變更如下:

  1. 新功能:IKDtree & normal texture的檔案輸出。

  2. 除了aa2dslice之外的GUI全部改用GtkBuilder建立。新增視窗元件 GLWin & GLWin_settings以供輸出視窗做繼承,達到 OO 重複使用的目的。

  3. Bug修正:修了什麼我也忘了…

其實還有做一些實驗性的功能。不過因為是實驗用,所以在stable中被屏蔽掉。

〜インフィニティ〜

2009年6月29日 星期一

Audacious 2.0.1 fallback title string

這個問題其實存在很久了。從1.4.x之後到現在最新的2.0.1都有這樣的毛病。通常播放器在取歌曲標題的時候都是取用音樂檔本身攜帶的資訊,像是MP3的ID3Tag。如果檔案本身沒有歌曲資訊的話就採用其檔名本身來當作標題,像是WAV檔。

Audacious就是採用這種方式在取標題,不過自從1.4.x之後出現了一個令人困擾的現象。雖然取標題的方式一樣,可是取出來的東西卻有出入。以前 fallback的標題都是採用UTF-8的原始檔名,1.4.x之後卻變成 URI 檔名(所有非ASCII字元都會被轉譯成像URL那樣,像空白會變成%20),所有非ASCII的字元都變亂碼。我想正常人都不會覺得那是個好現象吧(誰か読める?)

Audacious 在1.5左右把對 glade的相依性拿掉了。這對我這個純GTK user來說是件好事。我可以不會再只為了音樂而安裝龐大的gnome library。但是拋棄1.3.5版卻又會遇到惱人的標題問題還有平常用習慣的 blau skin的slidebar會消失的問題,這些都是讓我猶豫不決的原因。


今天花了幾個小時的時間trace了 Audacious 2.0.1的 code,終於把這個問題解決掉了。

Audacious在處理歌曲清單的entry是用一個叫 tuple的 structure,其處理函數都放在 src/libaudcore裡。實際的詳細資料是由各個format的plugin透過 libaudcore來填的,所以修改plugin或libaudcore應該都可以達到效果。由於我的音樂檔案九成是自己從CD抓下來的WAV檔,所以我只修改對應的 sndfile plugin。


audacious-plugins-2.0.1/src/sndfile/plugin.c 約 150行的地方:
aud_tuple_associate_string(ti, FIELD_TITLE, NULL, g_path_get_basename(filename) );

改成
aud_tuple_associate_string(ti, FIELD_TITLE, NULL, g_uri_unescape_string(g_path_get_basename(filename),0));

不過不知道其他format不知道fallback有沒有問題,如果要對所有格式都有效的話就得改libaudcore了。

ゴ ... ゴキブリ 囧

2009年5月21日 星期四

gTF-20090521 stable release

經過一個月多的時間的開發,很高興今天能夠發佈 gTF 的第二個穩定版。

主要的變更如下:

  1. 實體成像 AA3Dtex 新增 Phong shading 效果。

  2. Iso-surface extraction用的 Implicit KD tree 加速。

  3. 以 3D normal texture 進行 shading 硬體加速。

  4. 支援從磁碟讀取IKD-tree與Normal texture檔案。

  5. Volume資料的屬性檢視視窗。

這次發佈的穩定版最主要的新特性就是 Volume rendering - AA3Dtex 的Phong shading和 Iso-surface extraction - Subdivision 的計算加速。

由於採用了 IKD-tree ,使得 Subdivision計算時可以大幅減少要處理的voxels。加上gradient/normal 的計算改成預先處理存成3D texture,並且送交繪圖硬體做內插,大幅度地減少CPU的浮點運算。

把gradient/normal存成3D texture的好處不少,似乎想得到的Volume rendering和Iso-surface extraction 都能派上用場,只要給 shader 位址(texture coordinates),它就能幫你計算該點在volume上的normal。

另外一種硬體加速的作法是連gradient計算都交給繪圖硬體,只把volume RAW data送進graphics card當3D texture,直接在 fragment shader 裡面算gradient,而且速度不慢外加省記憶體。只是說每次更新畫面就重算 gradient 似乎有點浪費資源。

接下來的開發重點我想應該會是工具程式的補完,像是 gradient和IKDtree的存檔、Histogram equalizer、Resampler等。完成之後應該會朝新 transfer function和 View-aligned 3D texture based volume rendering或 Splatting method with EWA 發展。


※ 這版的source code在 win32下編譯會有錯,把那兩個函數和在Subdivisionwin裡的call 拿掉就可以了。那段程式只是在Linux 除錯用忘記拿掉 XD


〜もっともっと頑張らなきゃ〜

2009年5月10日 星期日

gTF - Axis-aligned 3D texture based volume rendering with phong shading

就在昨天晚上,我成功地完成了AA3Dtex的光影效果。(從版本20090509開始支援)

在bump mapping疊加的方法失敗後,我開始著手核心改造。以CPU計算打光所需要的gradient,產生一個vector volume之後再送到shader當作texture來查表,這樣感覺可以順便利用繪圖硬體來做線性內插(GL_LINEAR)。不過在做實驗之前我就意識到一個問題。gradient裡的component要是有負值的話要怎麼辦?透過glTexImage?D傳送給shader的texture資料在shader內部都會被重新轉換成 0.0 ~ 1.0。雖然不確定當pixel format為float時會不會接受不合理的texel value,但為了避免麻煩還是放棄這個選項。

最後被我選上的方法是從書上看到的 on-the-fly gradient estimation,即在shader內進行gradient計算。在shader內算gradient的話可以充分利用繪圖硬體加速的好處,雖然感覺上沒有上一個方法好(因為每次畫的時候都會重複計算gradient … 明明就是可以先存的說)。搭配Axis-aligned 的演算法效果其實還蠻讚的,通常把slicing倍率調成 2.0 、colormap顏色變化不要太大的話,畫面輸出是可以跟Iso-surface - Subdivision相比的,甚至是超越Subdivision。第一,這個方法不用存gradient,只要volume raw data、colormap就ok。Proxy geometry也因為dynamic slicing ratio而無法預編成display list、省下了記憶體。第二是色彩變化,Iso-surface基本上是抓一個function value出來長mesh,volume rendering可以透過 transfer function來顯示多種value,可以看到較多的東西。

要說缺點的話 … 大概就是太依賴GPU吧。要得到能夠互動的frame rate至少要NVIDIA GeForce 8800GTS 等級左右的GPU吧,視volume大小而定。小一點的volume(128x128x128)靠現在用的7600GS是還可以接受,再大可能就不只幻燈片程度的慢了。


以下是今天做的圖





如果sampler值域的問題能夠解決,我想效能應該可以更好。這個方法還可以用在其他texture based的volume rendering上,像是老翁的Marching tetrahedron。老翁的renderer實在是太慢了,lighting又是固定不能移動。相信這次的成果應該不會再被說 quality不夠了 … 吧。


〜よし 燃えてきた!〜

2009年5月9日 星期六

Volume rendering - Shading with bump mapping !?

這兩天在做Volume rendering的shading實驗。老翁的做法是直接在Volume過transfer function染色後進行shading計算,當然預先計算的缺點就是光源位置不能動,要改位置的話就得全部重新計算。也因為這樣才讓我有做山寨版shading的嘗試。 XD

我的想法是這樣的:目前gTF所使用的Volume rendering演算法是 Axis-aligned slicing + 自動切換軸與繪製方向 + 根據角度(cos值)自動調整切片密度。由於成像的方法是切片加上texture去做compositing,剛好bump mapping是用法向量偏移在一個平面上做出凹凸的光影效果(雖然是假的,眼睛正對著polygon的話shading會消失),如果用很多片貼上bump map的slice去做compositing,那應該也會有shading的效果(雖然就理論上來說畫出來的東西是錯的,因為gradient是從螢幕上的位置去取的,只抓了兩個軸而不是三個)。


最後這個方法經過試作實驗後,得到的結論是 … だめだ 囧

由於軸的自動切換會讓shading效果在物體旋轉時變化得太突兀,而且疊出來的東西光源感覺都不是在我設定的地方(燈光明明在眼睛,居然還看得到這麼多陰影 … 雖然說視覺效果還不錯)。還有就是他的速度超級慢,雖然說這點是可以預期的。

我嘗試過幾個volume,畫得最好看的還是牙齒(嗯 … 某角度),其他的不是速度太慢不然就是畫出來不好看。像cthead就是又慢又難看,因為它的Z軸需要被放大兩倍才會是正常比例,所以畫出來就是一圈一圈的陰影 + 一堆glitch。所以說 … 圖只放出牙齒。其他的就算了,反正這個方法已經被捨棄。接下來應該會做正常版的shading,計算 gradient volume(3D texture)、在shader裡取gradient當normal,看這樣Quality能夠提昇多少。




這個大概是畫最好看的一張吧 … 轉一轉陰影還會亂跑


〜ほたる … みる?〜

2009年5月7日 星期四

gTF 近況

唔 ... 最近發文章的頻率好像越來越低的樣子,blog已經快要變成「月記」了(以後會不會變成季番、年番啊 囧)。所以說,雖然最近好像沒做啥事,還是寫一下近況好了。

大約距今一個月以前發佈了gTF的第一個穩定版(啊咧…不就是上一篇嗎?)。到目前為止做的變動並不算多,幾乎都是針對效能的強化。

最近的 changelog:

  1. Volume的voxel讀取函數的精簡 + voxel data format的統一化

    現在才體會到if ... else執行很多次對效能的影響也是很大的。為了精簡存取函數我選擇了CG人常用的大絕「用空間換時間」,把voxel全部以unsigned short來儲存,不管原本的volume是unsigned char還是什麼。至於效果呢 ... 沒特別去算,只記得有變快 orz

  2. Implicit K-D tree 實作(針對Iso-surface extraction的加速)

    就 ... hierachical 空間分割,每個cell都進行最大最小值統計,用來剔除無須進行計算的cell。所有一次抓八個voxel(就一個cube)的計算應該都適用。這個演算法並不robust,有些case效果不太好,好處是容易實作、tree也可以先算完存到disk上。不過看來老翁還是比較愛span space,效能上又一整個輸marching cube + pre-calculated gradient ...

  3. Bugfixes

    修正一些長久以來沒被發現的bug ... 絕大多數是複製貼上的時候忘記改參數。

未來的計畫:

  1. Histogram equalizer

    修衛星影像處理時得到的點子,我想看看用在MRbrain上面會有什麼效果。說不定可以改善它組織難分離的問題。

  2. Volume utilities

    就 ... 一些工具,像是unsigned short轉unsigned char的quantization、搜尋取代某函數值(這個是準備拿來對付史丹佛兔子用的 ...)、volume的scaling(down sampling)、建 implicit K-D tree、.inf creator ...

  3. 新的Transfer function kernel

    這個大概會是我的碩士論文 ... 吧?老師說的相鄰關係圖雖然學弟有做出來,但我想應該還有值得一試的地方。

  4. Adaptive Gaussian Filter integration

    AGF是老師和鵬さん的大作,我只是幫忙拍圖片兼掛名而已,原理略懂 orz
    老師要求把這個大玩具整合到我的程式裡,我是覺得可以當external tool ... 就做吧。

呃 ... 研一生活快結束了耶,感覺一點都沒有研究生的樣子 QQ
就如老翁說的「這不像一個研究生啊」、「這樣不行啦」、「這種Quality不夠啦」,還得再加油啊 ...

〜最近やる気がなさそうだね〜

2009年4月12日 星期日

gTF first stable release ! 一番目の安定版のリリース

從去年暑假到現在,gTF 終於可以發佈第一個穩定版。目前算是差不多已經達成了推甄時寫的讀書計畫裡訂的目標,將大三修專題以來用BCB寫的TF打掉重練成Linux版,並且以GTK作為widget toolkit。

第一個穩定版 gTF-20090412的 feature list:

1. 以 .inf 檔來描述 .raw 檔的各個必要參數(filename、dimension、byte-order、ratio correction)

2. 前作 Transfer Function,包含了 1D histogram、colormap including opacity、gradient based edge enhancement。

3. 新的 Iso-surface renderer - Cube Subdivision,具有Quality、Cost可調的特色,並且使用vertex shader來達成雙面lighting。

4. 將前作的 Axis-aligned 3D texture based volume rendering強化,自動切換繪製時用的軸,並且提供切割密度的調整介面。使用了硬體Vertex shader & Fragment shader + Multi Texture來做Transfer Function,效率比前作好很多。

5. 2D切片檢視較前作虛弱 ... (これも長所なの?)

6. 支援 Win32 port。source可以直接用MinGW + GTK + gtkglext來進行編譯。


Screenshot




目前 gTF 的功能只比前作多一點,未來還會再增加更多的功能,包括我的碩士研究題目 Transfer Function、Adaptive Gaussian Filter、加速用Min-max octree、Volume處理工具(LoD、Histogram equalization等)。


〜必ず完成して頑張ります〜