Java LWJGL多剪刀测试

时间:2015-05-15 08:10:02

标签: java opengl lwjgl

在已启用的GL_SCISSOR_TEST中是否有任何方法可以使用glEnable GL_SCISSOR_TEST?如下所示:

GL11.glEnable(GL11.GL_SCISSOR_TEST);
GL11.glScissor(0, 0, 64, 64);

draw.rect();

GL11.glEnable(GL11.GL_SCISSOR_TEST);
GL11.glScissor(32, 32, 48, 48);

draw.smallRect();

GL11.glDisable(GL11.GL_SCISSOR_TEST);
GL11.glDisable(GL11.GL_SCISSOR_TEST);

我已经尝试了上述内容,它似乎没有按预期工作,甚至通过查看代码看起来非常不合逻辑,但我无法想到解决这个问题的方法。

3 个答案:

答案 0 :(得分:2)

OpenGL状态变量没有嵌套。这与做

基本相同
bool scissor_test_enabled;

scissor_test_enabled = true;
...
scissor_test_enabled = true;
...
scissor_test_enabled = true;

剪刀测试无法帮助您解决问题。您应该看一下模板测试:使用模板缓冲区可以绘制任意形状,禁用颜色和深度写入,写入模板缓冲区(必须像深度缓冲区一样请求获取模板缓冲区)。然后启用模板测试并绘制常规几何图形,并启用颜色和深度写入。

答案 1 :(得分:0)

我不建议使用过时的功能,但为了完整性:在传统的OpenGL(兼容性配置文件)中,您可以使用属性堆栈来保存/恢复剪刀状态:

GL11.glEnable(GL11.GL_SCISSOR_TEST);
GL11.glScissor(0, 0, 64, 64);

draw.rect();

GL11.glPushAttrib(GL11.GL_SCISSOR_BIT);
GL11.glScissor(32, 32, 48, 48);

draw.smallRect();

GL11.glPopAttrib();

GL11.glDisable(GL11.GL_SCISSOR_TEST);

第二个glScissor()调用仍将只替换上一个剪刀矩形。它不会形成一个交叉点,或类似的东西。它只允许您在使用较小的剪刀矩形后轻松恢复上一个剪刀矩形。只要第二个矩形包含在第一个矩形中,这应该可以为您提供预期的行为,就像您的示例中的情况一样。

使用当前的OpenGL,您应该记住代码中的剪刀矩形,并在需要更改它们时随时显式设置值。

答案 2 :(得分:0)

https://pastebin.com/nGbYhhAc

Body只是一个带整数的矩形。

我还没有测试过,但你可以理解。

然而,这门课并不意味着要剪刀。

您可以像这样使用它:

db.ProbCancer.find( { "cases.level" : -1 } )