多层光线投射引擎



我现在就从我的情况开始。

我从以下位置下载了光线投射项目:https://github.com/ChrisSerpico/raycasting

这是基于以下教程:https://lodev.org/cgtutor/raycasting.html

在我开始这个项目,玩了一些游戏并修改了一些东西之后,我现在只能添加多个层(基于每层一个地图(。我在网上读了很多东西,但没能实现这个功能。

在本项目中:https://github.com/Owlzy/OwlRaycastEngine

添加了多个层,但这是用切片完成的,我不知道如何在Serpico项目中实现这一点(之所以这样做,是因为地板/天花板的绘制效果更好(。纹理保存方式如下:

Texture2D canvas;  // used to convert the buffer to a single texture to be drawn
Color[] buffer;  // screen buffer with raw color data to be drawn
Color[][] rawData;  // raw data of the individual external textures
// initialize graphics rendering objects
canvas = new Texture2D(GraphicsDevice, SCREEN_WIDTH, SCREEN_HEIGHT);
buffer = new Color[SCREEN_WIDTH * SCREEN_HEIGHT];
rawData = new Color[NUM_TEXTURES][]; //number of Textures
for (int i = 0; i < NUM_TEXTURES; i++)
{
rawData[i] = new Color[TEXTURE_WIDTH * TEXTURE_HEIGHT];
}

缓冲区在Wallcasting循环中以这种方式填充:

if (TEXTURE_WIDTH * texY + texX <= rawData[texNum].Length - 1)
{
buffer[SCREEN_WIDTH * y + x] = rawData[texNum][TEXTURE_WIDTH * texY + texX];
}
else //avoid crash when running into walls
{
buffer[SCREEN_WIDTH * y + x] = rawData[texNum][rawData[texNum].Length - 1];
}

最后这样画:

canvas.SetData<Color>(buffer);
b.Draw(canvas, new Rectangle(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), Color.White);

代码直接来自lodev教程。我试过使用变量lineHeight、texY等等,但没有结果。纹理只是被拉伸、剪切,或者屏幕被画出可怕的效果。

有人能帮忙吗?我真的很冷静。。。

非常感谢!

问题出现在Draw((canvas.SetData<Color>(buffer);中的调用中

将该行移动到CCD_ 2;大部分是";工作纹理内存在CPU和GPU之间共享。调用Draw((时,预期纹理已存在于GPU内存中。绘制过程中传输数据会导致随机撕裂。

主要来自Update((和Draw((之间的不确定性延迟以及PCIE内存传输。

最新更新