我是一个复杂的UI系统,它允许很多东西,也可以用WPF完成,但支持多个平台(iOS,Android,Windows,...)。它还没有完成,现在我面临以下问题:
我的设计师想要旋转物体!旋转对象远比简单的轴对齐复杂,这是我不能使用glScissor的原因。一个可能有助于理解问题的小图:
你可以看到我需要剪切对象" 子容器"通过" 父容器"的范围。据我所知,几乎没有选择:
然而,两者似乎都会导致很多不同的问题,并可能成为性能泄漏的根源。有没有其他方式来存档我想要的东西,或者有什么办法可以改善上述两种方法吗?
答案 0 :(得分:4)
我最终使用了Stencil-Buffer,这会产生比深度方法更多的绘制调用,但更容易实现。
在我画画之前我写了这段代码:
if (_Mask)
{
if (Stage.StencilMaskDepth++ == 0)
GL.Enable(EnableFlags.STENCIL_TEST);
GL.ColorMask(false, false, false, false);
GL.DepthMask(false);
GL.StencilFunc(StencilFunction.ALWAYS, Stage.StencilMaskDepth, Stage.StencilMaskDepth);
GL.StencilOp(StencilOp.INCR, StencilOp.INCR, StencilOp.INCR);
// Draw rectangle
DrawColor(Colors.Black);
GL.ColorMask(true, true, true, true);
GL.DepthMask(true);
GL.StencilFunc(StencilFunction.EQUAL, Stage.StencilMaskDepth, Stage.StencilMaskDepth);
GL.StencilOp(StencilOp.KEEP, StencilOp.KEEP, StencilOp.KEEP);
}
在绘制完所有子节点后,将调用此代码:
if (_Mask)
{
GL.ColorMask(false, false, false, false);
GL.DepthMask(false);
GL.StencilFunc(StencilFunction.ALWAYS, Stage.StencilMaskDepth, Stage.StencilMaskDepth);
GL.StencilOp(StencilOp.DECR, StencilOp.DECR, StencilOp.DECR);
// Draw rectangle
DrawColor(Colors.Black);
GL.ColorMask(true, true, true, true);
GL.DepthMask(true);
if (--Stage.StencilMaskDepth == 0)
GL.Disable(EnableFlags.STENCIL_TEST);
}
也许我会在几个月内测试一些其他方法,但目前这是最容易实现的方法。
答案 1 :(得分:2)
这只是一个想法,但是如何使用深度缓冲来进行屏蔽?
答案 2 :(得分:1)
也许您可以尝试渲染纹理。创建父纹理。然后将所有子项渲染到该纹理。然后将父纹理渲染到屏幕变形并根据需要移动它。此解决方案可能存在问题,也可能不存在问题,具体取决于您希望实现的目标。特别是如果您为容器比例设置动画或者具有许多嵌套容器的非常复杂的树,您可能会遇到性能问题。