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