gTF穩定版第三彈釋出!
主要的變更如下:
- 新功能:IKDtree & normal texture的檔案輸出。
- 除了aa2dslice之外的GUI全部改用GtkBuilder建立。新增視窗元件 GLWin & GLWin_settings以供輸出視窗做繼承,達到 OO 重複使用的目的。
- Bug修正:修了什麼我也忘了…
其實還有做一些實驗性的功能。不過因為是實驗用,所以在stable中被屏蔽掉。
〜インフィニティ〜
私の開発日誌
開工啦
gTF穩定版第三彈釋出!
主要的變更如下:
這個問題其實存在很久了。從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了。
ゴ ... ゴキブリ 囧
經過一個月多的時間的開發,很高興今天能夠發佈 gTF 的第二個穩定版。
主要的變更如下:
分類 Development
就在昨天晚上,我成功地完成了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不夠了 … 吧。
〜よし 燃えてきた!〜
這兩天在做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能夠提昇多少。
這個大概是畫最好看的一張吧 … 轉一轉陰影還會亂跑
〜ほたる … みる?〜
唔 ... 最近發文章的頻率好像越來越低的樣子,blog已經快要變成「月記」了(以後會不會變成季番、年番啊 囧)。所以說,雖然最近好像沒做啥事,還是寫一下近況好了。
大約距今一個月以前發佈了gTF的第一個穩定版(啊咧…不就是上一篇嗎?)。到目前為止做的變動並不算多,幾乎都是針對效能的強化。
最近的 changelog:
分類 Development
從去年暑假到現在,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等)。
〜必ず完成して頑張ります〜
Transfer Function GTK+ Edition基本上舊的Win32版上的主要功能都已經實作,未來將把新的功能逐步添加到本作。開發狀態 試作硬體加速的splatting method。
Snapshot - 無
Stable - gTF-20090709.tar.bz2
Changelog
NULL
Linux kernel module
Blender
...
2009/06/16 - linux_sys_prg_hw 2~4
2009/01/13 - ForbiddenRegion & LieDown
2008/6/15 - svhw 1~4
2008/6/11 - siphw 1~3
2008/2/25 - An Adaptive Gauss Filtering Method
2008/1/9 - Dots & Boxes
2008/1/9 - libIuanGL & DEMOs