Java LWJGL 多剪刀测试

Java LWJGL Multiple Scissor Test

有没有办法在已经启用的 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);

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

OpenGL 状态变量不嵌套。这与做

本质上是一样的
bool scissor_test_enabled;

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

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

我真的不建议使用过时的功能,但为了完整性:在旧版 OpenGL(兼容性配置文件)中,您可以使用属性堆栈来 save/restore 剪刀状态:

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,您只需记住代码中的剪刀矩形,并在需要更改它们时明确设置值。

https://pastebin.com/nGbYhhAc

正文只是一个带有整数的矩形。

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

不过这个class并不意味着要和你的剪刀相交。

你可以这样使用它:

ScissorTest s1 = new ScissorTest(0, 0, 64, 64);

draw.rect();

ScissorTest s2 = new ScissorTest(32, 32, 48, 48);

draw.smallRect();

s2.destroy();

// Here you can draw something in bounds of s1

s1.destroy();