我现在就从我的情况开始。
我从以下位置下载了光线投射项目: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内存传输。