Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单游戏:仅在指定区域内渲染_C#_Monogame - Fatal编程技术网

C# 单游戏:仅在指定区域内渲染

C# 单游戏:仅在指定区域内渲染,c#,monogame,C#,Monogame,这可能是一个奇怪的问题,但我正试图找到一种方法,只渲染特定允许区域内的精灵,而不是整个缓冲区/纹理 像这样: 基本上允许我像平常一样绘制缓冲区或纹理2D,但实际绘制只发生在指定区域内,而其外部的剩余像素保持不变 为什么需要这样做——我正在构建自己的UI系统,我希望避免使用中间缓冲区,因为当屏幕上有许多UI组件时,中间缓冲区相当慢(每个组件都必须绘制到自己的缓冲区,以防止子元素被绘制到父边界之外) 为了澄清这一点,这一切都是为了简单的2D渲染,而不是3D。如果你的UI是用SpriteBatch绘

这可能是一个奇怪的问题,但我正试图找到一种方法,只渲染特定允许区域内的精灵,而不是整个缓冲区/纹理

像这样:

基本上允许我像平常一样绘制缓冲区或纹理2D,但实际绘制只发生在指定区域内,而其外部的剩余像素保持不变

为什么需要这样做——我正在构建自己的UI系统,我希望避免使用中间缓冲区,因为当屏幕上有许多UI组件时,中间缓冲区相当慢(每个组件都必须绘制到自己的缓冲区,以防止子元素被绘制到父边界之外)


为了澄清这一点,这一切都是为了简单的2D渲染,而不是3D。

如果你的UI是用SpriteBatch绘制的,你可以使用剪刀矩形

GraphicsDevice.RasterizerState.ScissorTestEnable = true;
spriteBatch.GraphicsDevice.ScissorRectangle = ...
在3D中,您可以渲染到纹理并仅绘制纹理的一部分,也可以使用着色器(如果像素位于该矩形之外(或您想要完成的任何操作),您实际上可以将尺寸作为参数发送进来,并在PixelShader中将其设置为黑色)

您可以使用:

spriteBatch.Draw(yourTexture,
    //where and the size of what you want to draw on screen
    //for example, new Rectangle(100, 100, 50, 50)//position and width, height
    destinationRectangle,
    //the area you want to draw from the original texture
    //for example, new Rectangle(0, 0, 50, 50)//position and width, height
    sourceRectangle,
    Color.White);

然后它将只绘制您以前选择的区域。希望这有帮助!

我没有真正了解UI问题。我也编写了自己的UI系统,但从未遇到性能问题。SpriteBatch.draw的性能非常好。但是,您仍然需要一个表示屏幕当前可见部分的视口。您可以简单地检查必须绘制的对象坐标是否在此视口之外。请查阅
RenderTarget2D