2010年7月31日 星期六

2010-07-31

一直都覺得OpenGL要把環境設定到可能用很麻煩,不過最近拿起圖學課本,照著寫寫看作業的時候,突然就發現OpenGL裝好了!?什麼時候裝的也不知道,不過就在寫到Shader的時候遇到大問題。

我用Interactive Computer Graphics這本書,一開始是用2008年出版第5 版的電子檔,後來買到2007年第4 版的2手書。一開始先用2007年的Shader範例程式,結果連Compile就不會過。查了後才知道,除了glut之外,還要裝別的才能用那些shader的API 。就開始在網路上找要用什麼函式庫了,網路上第一個查到的是glew,但是我裝好已後還是說有許多函式找不到。追查原因發現,shader部份的API 好像是有2個版本,一堆是有後綴詞ARB 的,一堆沒有。而glew的都是有ARB 的。把對應的函式名稱改成有ARB 版本的…結果變成link error,完全不知道是為什麼。後來才想到還抓過另外一本OpenGL的教學原始檔,打開shader的部份,結果竟然可以正確執行!原來除了glew還有一套叫glee的可以用。

接著就是把glee和自己的專案放在一起,結果還是一堆函式名稱有問題,受不了後去找第5 版的範例程式,發現API改超多,第4 版的API加了一些Object的詞…難怪都說找不到函式。但是那年的OpenGL API應該是沒什麼變,不知道為何課本的程式差這麼多。好不容易compile完成了,接下來是不斷的shader compile error。shader的用途是把shader程式碼以字串型式透過OpenGL API傳到顯卡上,透過API comiple後可以把許多事情交給顯卡算,所以要找出shader哪裡寫錯了也是要透過API 看錯誤訊息,很麻煩。找半天才發現,原來在把檔案讀到字串裡面放著,範例程式都沒有用’\0’結尾!高高興興的以為就可以過關了,結果還是一直說shader檔案結尾有無法辨識的東西,error (#132) parse error,又是在google上查好久。還以為是顯卡driver太久了,特別換最新的ATI 顯卡driver,結果問題更怪,之前還可以用visual studio 2008的debug 模式在顯示錯誤訊息的那行中斷,現在直接跳掉了,中斷點完全沒用了。

最後才cmd下執行才發現,問題是出在windows,如果你用windows編輯shader檔案的話,他會在結尾不知道加什麼東西(難道是換行字元的問題?但是只有最後一行的換行會出問題,很奇怪),這會讓shader compiler error,但是他加的東西你在windows上面看是看不到的…最後用vim 把檔案從windows改成unix格式,終於看到正確的結果了,真的是超高興的,為了要跑書上範例程式,竟然花了我10個小時在找到底怎麼設定環境,而這些課本和中文討論區都沒講!是大家都用linux下面做所以沒遇到這些問題嗎?

最後的感想就是,要在windows下玩shader還是用DirectX就好了。

沒有留言: