我有一个复杂的UI-系统,它允许很多东西也可以用WPF完成,但支持多个平台( iOS,Android,Windows,. )。它尚未完成,现在我面临以下问题:
我的设计师想要旋转的物体!旋转对象比简单的轴对齐对象要复杂得多,这就是我不能使用glScissor的原因。一张可能有助于理解问题的小图形:

您可以看到,我需要将对象"Subcontainer“按”父容器“的界限剪辑。据我所知,几乎没有选择:
然而,两者似乎导致了许多不同的问题,可能是性能泄漏的一个来源。还有其他方法来存档我想要的东西吗?还是有任何方法来改进上述两种方法?
发布于 2013-03-05 00:11:42
最后,我使用了模板缓冲区,这会产生比深度方法更多的绘图调用,但更容易实现。
在我画之前,我写了以下代码:
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);
}在绘制了所有的childs之后,这个代码被称为:
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);
}也许我会在几个月内测试其他一些方法,但目前这是最容易实现的。
发布于 2012-12-06 11:46:47
这只是一个想法,但是如何使用深度缓冲区进行掩蔽呢?
发布于 2012-12-06 12:53:45
也许你可以试着渲染纹理。创建父纹理。然后将所有的孩子渲染到这个纹理中。然后将父纹理呈现到屏幕上,按需要变形和替换。此解决方案可能存在问题,也可能没有问题,这取决于您想要实现什么。特别是,如果您对容器进行缩放,或者有一个非常复杂的树,由许多嵌套的容器组成,那么您可能会出现性能问题。
https://stackoverflow.com/questions/13742556
复制相似问题