Java OpenGL二维模板

Java OpenGL二维模板,java,opengl,Java,Opengl,我正在minecraft的一个滚动框上工作 滚动框有一个问题,一些控件将在框外渲染,因此我决定查找是否有可能防止出现这种情况。 我找到了模板,但没用,也许我做错了什么 GL11.glEnable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_STENCIL_TEST); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.gl

我正在minecraft的一个滚动框上工作

滚动框有一个问题,一些控件将在框外渲染,因此我决定查找是否有可能防止出现这种情况。 我找到了模板,但没用,也许我做错了什么

    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);
(这是黑色轮廓的灰色图案)

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

    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);

我想你在找我

它允许您在屏幕上指定一个矩形裁剪窗口,无论您绘制什么,都不会在该矩形之外绘制任何内容

在绘制滚动框之前和之后,不要忘记调用
glEnable(GL\u剪刀测试)
。如果没有启用,它将无法工作;如果没有禁用,它将无法停止;)

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

glEnable(GL_SCISSOR_TEST)
glScissor(0,0,100,100)
:: DRAW YOUR CONTROLS HERE ::
glDisable(GL_SCISSOR_TEST)
将在屏幕左下角创建一个100x100裁剪窗口


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

谢谢。这很有效,答案很简单,不一定是正方形。剪刀区域是一个矩形,宽度和高度可以不同。哦,你完全正确。我是说长方形!有办法旋转剪刀吗?不幸的是,没有办法旋转它。如果你愿意,我建议你回到模板上来
glEnable(GL_SCISSOR_TEST)
glScissor(0,0,100,100)
:: DRAW YOUR CONTROLS HERE ::
glDisable(GL_SCISSOR_TEST)