【问题标题】:OpenGL ES subtract geometryOpenGL ES 减去几何
【发布时间】:2012-07-20 16:23:58
【问题描述】:

首先,为了避免误解,opengl es 只适用于三角形。

我有一个矩形(三角形条),是否可以在该矩形上切一个圆孔(或多个孔)。 都是二维的。

【问题讨论】:

  • 这个答案是否相关? stackoverflow.com/a/11264120/10468
  • @DarenW csg 对我来说太慢了,这应该是动态壁纸。因为它是 2d 而不是 3d,所以必须有一个简单的解决方案。

标签: android geometry opengl-es-2.0


【解决方案1】:

opengl 不支持真正的几何减法,但它很容易被深度缓冲区或模板缓冲区伪造。

  1. 屏蔽你的颜色,以便没有任何东西被绘制到颜色缓冲区:
    glColorMask(false, false, false, false)
  2. 在场景中绘制“洞”,将值存入深度缓冲区(值小于三角形条带)或模板缓冲区。

  3. 禁用颜色蒙版,然后在启用深度或模板测试的情况下渲染三角形条。您之前绘制的区域将被遮盖,因此您将留下一个中间有一个孔的矩形。

【讨论】:

    【解决方案2】:

    作为 Tim 的解决方案的替代方案,您还可以使用自定义片段着色器来消除漏洞: 您可以使用遮罩纹理或仅使用 (x,y) 坐标和半径来定义孔。然后你可以简单地discard()你的三角形碎片,如果它们在一个洞里。 最好的解决方案可能取决于您想要的孔的数量(蒙版纹理可能是最简单、最灵活的方法,特别是如果您还想有非圆形孔而距离测试可能对您有好处,您只有一个几个洞)。

    【讨论】:

    • 我也有这个想法,但是我不知道如何获取当前碎片坐标以及如何传入每个孔的x和y坐标
    • 您现在可能知道,当前片段坐标存储在gl_FragCoords
    • (+1) 这就是我正在寻找的东西,我真的应该开始阅读文档了...
    • 我如何将点的 x,y 和半径传递给着色器?
    • 您可以将它们写入纹理或将它们作为 Uniforms 传递(如果您只有几个孔)。正如我所说,Tim 的解决方案或遮罩纹理更简单、更灵活。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多