OpenGL - 在3D空间中的裁剪

3

我已经试了很长时间,想找到如何在OpenGL中裁剪定义区域外部的方法。

我不想用视口或剪刀来进行裁剪。我已经疯狂地搜索了很多,但我只能找到关于如何使用视口/剪刀的内容。

我想定义一些东西,比如“如果这个像素的 x 值小于 10,就不要绘制它”。类似这样:“如果 x 在 10-20 之间且 y 在 10-20 之间且 z 在 10-20 之间,则允许绘制该像素,否则请勿渲染该像素”。

注:很遗憾stackoverflow要求您注册才能提问。以前网站是开放的并且账户创建是可选的,现在变得不太好了。

2个回答

3

在搜索一段时间后,我想到了答案,这很典型,我刚好在这个网站上提出了问题。

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)。
希望这将成为未来寻找答案的人们的搜索结果。

0

固定功能(Fixed-Function)可以使用用户定义的裁剪平面来实现,详见glClipPlane()。您可以定义6个这样的平面来实现您所讨论的效果。

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

您描述的测试似乎是逐片段进行的,因此您也可以在片段着色器中通过丢弃所有超出区域的片段来实现。但这样做效率可能会很低(并且会阻止早期Z测试的使用),因此您应该小心使用。这可能可以与模板测试相结合,限制x和y坐标,并只在着色器中进行z坐标测试。


谢谢你的回答,不过我在一分钟之前已经弄清楚了。不过我会研究一下gl_clipDistance这个东西。 - undefined
顺便说一句,我看到有人的图形卡只能设置一个剪裁平面。你知道这种情况常见吗?如果我甚至不能在大多数图形卡上设置六个剪裁平面,感觉这是一个糟糕的解决方案。还有其他办法吗?可以使用圆形进行剪裁吗(或许你知道)?比如,摄像机在一个球体的中心,球体外的物体不会被绘制出来。 - undefined
@user2445741:OpenGL规范例如保证至少有6个可定义的剪裁平面。根据GLSL3.3规范,gl_ClipDistance[]数组的最小大小至少为8。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接