2016-08-11 28 views
-2

我想在裝配中製作光線投射引擎,並且出現問題。 繪製紋理似乎不能正常工作。在光線投射引擎中繪製紋理

這是它的樣子:

img

的與牆壁發現碰撞的循環,如果碰撞結果發現我把x或y的浮點部分,並用它計算繪製紋理的位置。

我已經嘗試調試,我發現問題可能是最終紋理x是相同的幾次,但你可以在圖片中看到,從側面看它工作幾乎很好,所以我不認爲這是問題所在。

想要的結果只是在沒有這些扭曲的情況下紋理將被正確繪製。

我認爲這個問題是在代碼here地方:

mov ebx,WINDOW_HEIGHT/2 
sub ebx,eax 
mov eax,height 

mov screenypos,ebx 

dec typeofwall 

movss xmm0,floatingpoint 
mulss xmm0,FP4(64.0f) 

mov eax,typeofwall 
cvtsi2ss xmm1,eax 
mulss xmm1,FP4(64.0f) 

addss xmm0,xmm1 

movss tempvarr,xmm0 
invoke FLOOR,tempvarr 
cvtss2si eax, xmm0 
mov finaltexturex,eax 

;invoke 

BUILDRECT,screenpos,screenypos,linewidth,height,hdc,localbrush 

invoke DrawImage,hdc,wolftextures,screenpos,screenypos,finaltexturex,0,linewidth,64,linewidth,height 
+3

我們幫助修復代碼。我們不是在這裏看東西的照片。 –

+0

將代碼粘貼到此處。 –

+0

爲什麼浮點?使用16:16固定點,如果這是32b模式,那就足夠精確,而且寫起來更容易。舉例來說,1:16在地圖上有1個瓦片,你仍然有大約〜256個高精度的紋理分辨率,也許只要2048就可以延伸到很好的效果......如果你想要更高的紋理分辨率,但是256x256的地圖足夠了,那麼8:24(1:24 = +瓷磚)可以使用。 Wolf3D不需要FP協處理器。 :D(並且僅具有32(5b)紋理res IIRC的8:8定點數學)。 – Ped7g

回答

1

首先嚐試打印每一列的「打」的座標,哪一個你會使用絨(記住,你必須使用map_x或map_y軸進行紋理處理,具體取決於光線首先與牆壁相交的哪條柵格線以及哪個方向)。

現在我還有其他的想法......你甚至使用了字節映射[16] [16];或類似的牆壁定義(Wolf3D 2.5D光線投射),或者是這個半多邊形地圖系統,計算與片段的交集(DOOM 2.5D透視BSP 2D邊緣抽屜(原始DOOM中根本不是光線投射!))?

如果您正在使用Wolf3D射線測量儀,請注意您必須清理相交公式,並明智地決定您在何時計算哪一部分,因爲錯誤的計算順序可能會迅速累積相當數量的準確度誤差,導致像牆上「洞」的怪癖(當單像素列錯過與牆壁的交點時)等等。

浮點數更容易出現意想不到的精度問題,因爲以位移位編碼的精度以指數快速(因此,大約0.0,0.0座標的準確性相當好,比地圖上的1e6,1e6座標大)。

正確完成後,它應該看起來像「簡單」的東西。我曾經在一個下午在帕斯卡爾做過快速和骯髒的版本(作爲一個朋友,誰試圖學習帕斯卡爾的例子)。但是很容易做錯(例如Bethesda的第一個上古卷軸「ARENA」有可怕的交點計算,牆壁y位置被鋸齒了很多)。通常不正確的計算不僅精度較差,而且幾乎總是涉及更多的計算操作,因此速度較慢。

使用紙和鉛筆將其全部畫下(地圖網格,投影平面,用您擁有的值進行三角測量,查看如何將每個屏幕 - 列x的設置階段最小化,作爲最小計算量=最高精度) 。

(答案相當一般,因爲幾乎沒有代碼可以檢查(發佈的代碼對我來說看起來不錯))。

+0

感謝您的好回答。現在我正在修復牆上的「漏洞」:) – benisxdxd