摘要: 關于這個問題實在沒有一個特別好的方法,基本方法還是來源于對intel手冊的觀察。因為指令表是從手冊上面復制出來的,但是上面又沒有標明66H前綴,怎么辦呢?人肉找規律。這里貼出了區分的代碼(進對于之前挑選出來的絕大多數x86與x87指令)以及生成后的一個很有規則的文件以供參考。
閱讀全文
posted @
2009-02-16 21:53 陳梓瀚(vczh) 閱讀(2367) |
評論 (1) |
編輯 收藏
摘要: 完整的轉換方法需要intel提供免費翻印下載的那本手冊。手冊過于精簡,因此這里給出的例子用于輔助對手冊進行理解。假設讀者閱讀過intel提供的手冊,或其他相關資料。
閱讀全文
posted @
2009-02-15 23:45 陳梓瀚(vczh) 閱讀(3667) |
評論 (5) |
編輯 收藏
摘要: 為了節省工作量,我打開intel的手冊,然后將那些框框里面的字符串復制到一個文本文件里面,最后寫一個C++程序用正則表達式處理。流程如下(含代碼和文件):
閱讀全文
posted @
2009-02-14 20:21 陳梓瀚(vczh) 閱讀(3135) |
評論 (2) |
編輯 收藏
JIT是just in time,一門包含了JIT的腳本引擎就是將腳本編譯成機器碼,讓CPU而不是自己寫的虛擬機運行。這樣做有助于提供高速的運行環境、以及與C++更加方便的融合。這次計劃所需要的任務如下:
匯編器。匯編器指的是可以做如下轉變的一個工具:機器碼 <--> 匯編程序的數據結構 <--> 匯編程序文本表示。有了三個可以互相轉換的結構之后,編譯器可以在更高層的層面上開發,調試也變得更加容易。
中間指令。由于x86的指令集過于復雜,并且以后可能會發生重大變更,因此有必要開發一個容易使用的、功能簡潔但是強大的另一個指令集,提供中間指令到匯編的單向轉換操作。這主要是用來解決x86指令互相之間操作不夠統一、寄存器分配和更好的x86指令選擇等問題,并且可以讓以后的編譯器更加容易開發。
內存管理器。由于匯編是不處理內存申請釋放等操作的,因此需要將內存管理器,連同垃圾收集器,一起封裝成函數供匯編代碼調用。這個內存管理器屆時將使用C#和Java均驗證過的多代收集方法。如果語言不直接操作指針的話,還能提供壓縮操作。
基本語言。基本語言擁有絕大多數的沒有重復的必要的基礎設施,并提供基本語言到中間指令的單向轉換操作。
腳本語言。當然基本語言如果足夠強大的話也能變成一門腳本。這里指的腳本是類似DSL那樣有特殊目的語言。編譯器所需要的詞法分析器可以大部分交給我開發的VL++2.0的Syngram負責,并且編譯成基本語言。以后制作DSL將會變得非常簡單。
匯編器是體力活,因此我想了一個辦法。Intel手冊上的指令集的二進制碼表還是寫得相當有規律的,因此可以復制下來集中到一起(已完成),然后使用正則表達式進行第一步處理,將碼表、語法和說明三部分分開成更加合理的格式,然后再用一個正則表達式進行處理,最后生成記載著翻譯方法的C++代碼。等這一部分完成之后,可能會給出相關的代碼,并且解釋x86在32位下的詳細的指令格式。64位等購買新電腦并安裝win7之后才開始,目前沒有條件。
posted @
2009-02-13 21:18 陳梓瀚(vczh) 閱讀(2786) |
評論 (5) |
編輯 收藏
使用
這篇文章使用的相同的算法渲染的一張帶有透明物體的圖。圖中的正方形板的下方有淡淡的黃色,球背后的陰影邊緣是軟的。由于沒有優化的緣故,這幅圖在2×1.5GHz的筆記本上渲染了一個半小時。
posted @
2009-01-31 09:47 陳梓瀚(vczh) 閱讀(3047) |
評論 (1) |
編輯 收藏
摘要: 所謂的GI可以簡單的理解為渲染一個像素的時候,就在那個像素的法向量位置渲染一個半球,統計并作為光源輸入。現在使用一個比較粗糙的平行光在天空盒上的投影函數:f(t)=cos(t)*4/(1-cos(a)),其中a是光斑夾角的一半。GI花了好長時間,圖如下:
閱讀全文
posted @
2009-01-30 06:54 陳梓瀚(vczh) 閱讀(2552) |
評論 (0) |
編輯 收藏
摘要: 之前搞錯了一個fresnel公式,實際上全透明物體的fresnel公式應當如下:
f=入射角
t=出射角,有sint=sinf/n
新的factor=(sin2(f-t)/sin2(f+t)+tan2(f-t)/tan2(f+t))/2,這樣的話出現全反射的時候,factor=1。
閱讀全文
posted @
2009-01-28 00:27 陳梓瀚(vczh) 閱讀(2197) |
評論 (0) |
編輯 收藏
摘要: 由于之前的建模方法亂七八糟,現在使用一般的Fresnel方法為材質建模。這是一個處理折射和反射光比率的函數。計算方法如下:factor=bias+scale(1+I×N)^power,將factor剪裁之[0,1]范圍內之后,折射光/反射光比率為factor/(1-factor)。bias、scale與power是材質參數,需直接指定。
閱讀全文
posted @
2009-01-24 09:55 陳梓瀚(vczh) 閱讀(1781) |
評論 (0) |
編輯 收藏
摘要: 明天得開始研究別人是怎么處理材質的了。目前使用的方法是(反射來源×反射基準)×折射比率+(光源×材質顏色)×(1-折射比率)+[(折射來源+底面反射)×衰減+(1-衰減)]×透明物體內部顏色減。等材質完全做完之后,目前的渲染算法就可以為GI服務了。最后是計算混合的代碼:
閱讀全文
posted @
2009-01-22 06:02 陳梓瀚(vczh) 閱讀(2212) |
評論 (2) |
編輯 收藏
摘要: 由于一時找不到題目寫,所以這兩天就搞了一個簡單的基于光線追蹤的軟件渲染器。準備花點時間做下去了。從昨天開始到現在實現的東西有反射、陰影、多光源、線性變換等。
閱讀全文
posted @
2009-01-19 00:48 陳梓瀚(vczh) 閱讀(4068) |
評論 (5) |
編輯 收藏