OpenGL - 在3D空间中剪切

时间:2013-06-02 19:15:12

标签: opengl 3d lwjgl jogl clipping

我一直在努力寻找如何做到这一点:在OpenGL中定义区域之外剪切。

我不想使用视口或剪刀btw剪辑。我一直在寻找疯狂的东西,我找到的就是如何使用视口/剪刀。

我想要定义类似的内容,“如果此像素的x低于10个单位则不会绘制它”。类似的事情,“如果x介于10-20之间且y介于10-20之间且z介于10-20之间,则可以绘制,否则不会渲染像素。”

脚注:糟透了stackoverflow要求您注册以提出问题。在网站开放和帐户创建是可选的之前更好。

2 个答案:

答案 0 :(得分:2)

经过一段时间的搜索后想出来,通常是我在这个网站上提出了问题。

Java代码(我正在使用LWJGL):

DoubleBuffer eqn1 = BufferUtils.createDoubleBuffer(8).put(new double[] {-1, 0, 0, 100});
eqn1.flip();
GL11.glClipPlane(GL11.GL_CLIP_PLANE0, eqn1);
GL11.glEnable(GL11.GL_CLIP_PLANE0);

像往常一样OpenGL很糟糕(因为很难,不容易掌握)记录,我不得不四处搜索,直到最后我发现一些在一些论坛上解释了这一点(并显示缓冲区必须翻转):前三个双精度是裁剪平面的法线,最后一个(100)是距离世界原点(0,0,0)的距离。

因此,如果摄像机直视(0,0,0),上面的示例代码将在右侧创建一个平面,使OpenGL不会在其右侧渲染内容。飞机位于x = 100并且朝向左侧(-1)。

我希望这将成为寻找未来答案的人的搜索结果。

答案 1 :(得分:0)

固定功能具有用户定义的剪裁平面,有关详细信息,请参阅glClipPlane()。您可以定义其中的6个平面以达到您所讨论的效果。

基于现代着色器的GL提供gl_ClipDistance[] 输出变量数组来实现这样的东西。

您描述的测试似乎是每片段,因此您也可以在片段着色器中执行此操作,方法是丢弃您所在区域之外的所有片段。但这将是非常低效的(并且阻止使用早期的Z测试),所以你应该小心。这可能与模板测试相结合以限制x和y,并且仅在着色器中对z进行测试。

相关问题