我的游戏是用C语言编写的,使用OpenTK,它是OpenGL的包装。我正在渲染我的迷你地图,如下所示。问题是,对象没有在边缘剪裁,因此它们会溢出。我可以渲染一个更厚的边界来隐藏它,但这并不理想,对于较大的对象也不起作用。可能有轨迹线和其他东西也会溢出边界。我只是用基本的原语渲染这些。
我怎样才能裁剪这个区域?有没有办法将其渲染到一个隐藏的画布上,然后只复制圆形区域?
解决方案
@BDL回答了这个问题,但我还需要调整一些东西才能使其正常工作,因此,以下是完整的解决方案,以防任何人发现它有用:
在GameWindow构造函数GraphicsMode参数中启用模具缓冲区。
private static OpenTK.Graphics.GraphicsMode GraphicsMode {
get {
var defaultMode = OpenTK.Graphics.GraphicsMode.Default;
var custom = new OpenTK.Graphics.GraphicsMode(
defaultMode.ColorFormat,
defaultMode.Depth,
1, // enable stencil buffer
defaultMode.Samples,
defaultMode.ColorFormat,
defaultMode.Buffers,
defaultMode.Stereo);
return custom;
}
}
public BaseHelioUI(int windowWidth, int windowHeight)
: base(
windowWidth,
windowHeight,
BaseHelioUI.GraphicsMode,
"",
GameWindowFlags.Default )
{
然后使用此块绘制模具,在我的示例中是一个圆:
GL.Enable(EnableCap.StencilTest);
GL.StencilFunc(StencilFunction.Always, 1, 0xFF);
GL.StencilOp( StencilOp.Keep, StencilOp.Keep, StencilOp.Replace );
GL.Clear(ClearBufferMask.StencilBufferBit);
// draw background & outline
this.Renderer.DrawCircle(
this.MinimapScreenCenter,
SENSOR_RANGE_IN_METERS * this.GameMetersToMinimapUnitsFactor,
Colors.ReduceAlpha( Colors.Black, MINIMAP_BACKGROUND_OPACITY )
//Colors.ReduceAlpha( Colors.DarkGrey, MINIMAP_BACKGROUND_OUTLINE_OPACITY),
//MINI_MAP_BORDER_WIDTH
);
GL.Enable(EnableCap.StencilTest);
GL.StencilFunc(StencilFunction.Equal, 1, 0xFF);
GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Keep);
然后在这个区域内画出你想要的所有东西,在我的例子中就是小地图上的项目。
然后,当您使用完模具后,只需清除它,其他所有内容都可以渲染。在我的例子中,这是renderminmap方法的末尾。
// disable stencil
GL.Clear(ClearBufferMask.StencilBufferBit);
GL.Disable(EnableCap.StencilTest);
下面是正确剪裁圆边缘项目的结果小地图。看起来很棒。(船在游戏空间,不在小地图上)