2

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

我不想使用视口或剪刀来剪辑。我一直在疯狂地寻找,我发现的只是如何使用视口/剪刀。

我想定义类似“如果这个像素的 x 低于 10 个单位,则不要绘制它”。比如,“如果 x 在 10-20 之间并且 y 在 10-20 之间并且 z 在 10-20 之间,则可以绘制,否则不要渲染像素”。

脚注:很糟糕,stackoverflow 要求您注册才能提出问题。最好在网站开放并且帐户创建是可选的之前。

4

2 回答 2

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

我希望这将是人们在未来寻找答案的搜索结果。

于 2013-06-02T19:47:26.967 回答
0

Fixed-Function 具有用户定义的剪裁平面,请参阅glClipPlane()详细信息。你可以定义6个这样的平面来达到你所说的效果。

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

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

于 2013-06-02T19:35:53.303 回答