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,您只需记住代码中的剪刀矩形,并在需要更改它们时明确设置值。
正文只是一个带有整数的矩形。
我还没有测试,但你可以理解。
不过这个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();
有没有办法在已经启用的 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,您只需记住代码中的剪刀矩形,并在需要更改它们时明确设置值。
正文只是一个带有整数的矩形。
我还没有测试,但你可以理解。
不过这个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();