在光线投射引擎中绘制纹理

问题描述:

我想在装配中制作光线投射引擎,并且出现问题。 绘制纹理似乎不能正常工作。在光线投射引擎中绘制纹理

这是它的样子:

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

首先尝试打印每一列的“打”的坐标,哪一个你会使用绒(记住,你必须使用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