2013-06-02 53 views
2

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

我不想使用视口或剪刀顺便剪辑。我一直在寻找像疯了一样,所有我找到的是如何使用视口/剪刀。

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

脚注:吮吸stackoverflow需要注册才能提出问题。当网站开放并且帐户创建是可选的时候,情况会更好。

回答

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

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

0

固定功能有用户定义的剪切平面,详情请参阅glClipPlane()。你可以定义6个这些飞机来达到你所说的效果。

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

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

+0

感谢您的回答,尽管前一分钟已经算出来了。但我会研究一下gl_clipDistance的东西。 – user2445741

+0

顺便说一句,我读过一些人只能在他的gfx卡上有一个剪辑平面。你知道这是常见的吗?如果我甚至无法制作六张可在大多数gfx卡上工作的剪辑平面,那感觉就像是一个糟糕的解决方案。有另一种方法吗?是否可以使用圆圈剪辑(值得问,也许你知道)?比如说,相机处于球体的中间,球体外面的东西没有被绘制出来? – user2445741

+0

@ user2445741:例如,OpenGL规范保证至少6个用户可定义的裁剪平面。根据GLSL3.3规范,'gl_ClipDistance []'数组的最小尺寸至少为8。 – derhass