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