OpenGL-三维空间中的裁剪

OpenGL-三维空间中的裁剪,opengl,3d,lwjgl,jogl,clipping,Opengl,3d,Lwjgl,Jogl,Clipping,我已经尝试了很长时间来找到如何做到这一点:在OpenGL中的定义区域之外进行剪切 顺便说一句,我不想使用视口或剪刀进行剪辑。我一直在疯狂地搜索,我所找到的只是如何使用视口/剪刀 我想定义一些类似的东西,“如果这个像素的x小于10个单位,不要绘制它”。类似于“如果x在10-20之间,y在10-20之间,z在10-20之间,则可以绘制,否则不渲染像素” 脚注:stackoverflow要求你注册提问,这太糟糕了。以前最好是打开站点,创建帐户是可选的。固定功能具有用户定义的剪切平面,有关详细信息,请参

我已经尝试了很长时间来找到如何做到这一点:在OpenGL中的定义区域之外进行剪切

顺便说一句,我不想使用视口或剪刀进行剪辑。我一直在疯狂地搜索,我所找到的只是如何使用视口/剪刀

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


脚注:stackoverflow要求你注册提问,这太糟糕了。以前最好是打开站点,创建帐户是可选的。

固定功能具有用户定义的剪切平面,有关详细信息,请参阅。您可以定义其中的6个平面来实现您所提到的效果

基于现代着色器的GL提供了 输出变量数组来实现这些事情


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

在搜索了一段时间后发现了这一点,典型的是我刚刚在这个网站上提出了这个问题

Java代码(我使用的是LWJGL):

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

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


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

谢谢你的答案,不过我在前一分钟就已经找到了答案。但我会调查一下Glu clipDistance的事情。顺便说一句,我读到有人在他的gfx卡上只能有一个剪贴机。你知道这是不是很普遍?如果我甚至不能制作出能在大多数gfx卡上使用的六个剪辑平面,那感觉是个糟糕的解决方案。还有别的办法吗?有没有可能用一个圆圈来剪辑(值得一问,也许你知道)?例如,摄像机位于球体的中间,而球外的物体没有被绘制出来。@ USE2445?71:例如OpenGL规范保证至少6个用户可定义的裁剪平面。根据GLSL3.3规范,
gl_ClipDistance[]
数组的最小大小至少为8。
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);