OpenGL 2D模板

时间:2015-08-13 07:59:50

标签: java opengl

我正在使用我的世界中的滚动框。

enter image description here

滚动框有一个问题,一些控件将在框外呈现,所以我决定查询是否可以防止这种情况。 我找到了模板,但它没有成功,也许我做错了什么?

    GL11.glEnable(GL11.GL_BLEND);
    GL11.glEnable(GL11.GL_STENCIL_TEST);
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glDisable(GL11.GL_DEPTH_TEST);
    GL11.glClearStencil(0);
    GL11.glClear(GL11.GL_STENCIL_BUFFER_BIT);

    GL11.glStencilFunc(GL11.GL_ALWAYS, 1, 1);
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);

这是渲染滚动框背景的行:

    Vector4d color = new Vector4d(140, 140, 140, 255);
    RenderHelper2D.drawGradientRect(1, 1, this.width-1, this.height-1, color, color);

http://i.imgur.com/Ycg7AKo.png(它是黑色轮廓的灰色图案)

    GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 
    GL11.glStencilFunc(GL11.GL_EQUAL, 1, 1);
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP );

在滚动框(按钮)中渲染所有目标。哪个不应该在盒子外面显示。

    gui.drawForeground(renderer);

并重置所有内容

    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 
    GL11.glColorMask(true, true, true, true); 
    GL11.glDisable(GL11.GL_STENCIL_TEST);

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找glScissor

它可以让您在屏幕上基本上分配一个矩形裁剪窗口,无论您绘制什么,都不会在此矩形之外绘制任何内容。

请勿忘记在绘制滚动框之前和glEnable(GL_SCISSOR_TEST)之前拨打glDisable(GL_SCISSOR_TEST)。没有启用它将无法工作,如果没有禁用它将无法停止;)

请记住,提供给glScissor的值是原点的整数以及所需裁剪窗口的宽度和高度,原点定义为左下角。因此,

glEnable(GL_SCISSOR_TEST)
glScissor(0,0,100,100)
:: DRAW YOUR CONTROLS HERE ::
glDisable(GL_SCISSOR_TEST)

将在屏幕的左下角创建一个100x100的裁剪窗口。

如果需要,可以使用模板缓冲区,但这些更复杂的任务。由于UI通常适用于矩形,因此glScissor非常适合它。