在openGL ES中剪切对象

时间:2014-01-28 15:54:03

标签: android ios opengl-es

我想裁剪和对象我的openGL ES应用程序,应该按以下方式完成:

Stencil buffer

左边是初始图像,中间是模板缓冲矩阵,右边是结果。

从我在此处读到的内容:Discard with stencil可能存在性能问题, 并且由于将要剪切的模型将被旋转和翻译,我老实说不知道在这些操作之后绘制的模型是否会被剪切在错误的位置。 会吗?

所以,我想到了深度缓冲。 再举一个例子:

Example

(此照片来自此question.

假设黑色正方形是可移动的,可能不仅仅是一个简单的正方形,而是一个复杂的UIBezierPath

我想知道如何使用深度缓冲区,以便在方形(或UIBezierPath)之外绘制的所有内容都将被剪掉,这意味着将左边像素的所有z值调整到某个阈值价值,不会在屏幕上显示。

总结一下:

1)如上所述,使用模板是否会变得昂贵?

2)是否可以在旋转和翻译的对象上使用模板,以便始终绘制它?

3)使用深度缓冲区,是否可以找出内部和方形外的内容(或UIBezierPath)以及如何?不知怎的掩盖它?

4)什么是更好的方法?

我知道要回答很多,但由于它们彼此相关,我认为最好在同一个问题上提出。

1 个答案:

答案 0 :(得分:0)

模板缓冲区是这里的方法。您引用的discard答案是关于在片段着色器中使用discard函数,这对于基于图块的延迟渲染GPU(即基本上每个移动GPU)来说都非常昂贵。

然而,使用模板缓冲器非常便宜,因为它存在于每个磁贴的芯片上,并且不会干扰延迟渲染。

总结:

  1. 没有
  2. 是的,模板缓冲区在转换顶点上的整个视口上以2D运行。它将在应用模型转换后剪切立方体。
  3. 是的,但不用说这很复杂,听起来有点像阴影卷。
  4. 使用模板缓冲区。