如何确定点是否位于形状内?

时间:2014-07-21 11:10:37

标签: ios opengl-es opengl-es-2.0 fragment-shader

我需要确定点是否位于形状内。如果我们的形状是圆形,那很容易:

highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio));
highp float dist = distance(center, textureCoordinateToUse);
textureCoordinateToUse = textureCoordinate;
if (dist < radius) {
    ...
}

但是如果我的形状是星形,六边形,螺旋形等等呢?有人知道任何快速的方法吗?我可以使用带alpha通道的图像作为形状吗?怎么做?

更新:我刚才明白,现在最好的选择是将另一个纹理传递给着色器。我该怎么做?现在,着色器有2个属性:varying highp vec2 textureCoordinate;uniform sampler2D inputImageTexture;。我想传递另一个纹理来检查着色器代码中的alpha通道。

更新2:我试图将形状加载到着色器(我想是这样)。我使用的是GPUImage框架,因此我将sampler2D设置为我的形状,并尝试检查那里的alpha通道。好吗?在我的iPhone 5s上看起来非常好,但性能如何呢?

3 个答案:

答案 0 :(得分:1)

如果您可以使用圆形等分析形状表示,则需要找到的是描述该形状的方程式。

如果您有预先绘制的形状,并且可以将其打包成纹理,那么您也可以这样做。您所需要的只是将对象视为一个矩形(整个纹理图像)并进行矩形检查,例如圆形加上获取该纹理的颜色并进行颜色检查。什么颜色检查真的取决于你,它可以是黑白色,使用alpha通道..任何真的。

如果你有一个复杂的绘制对象,比如3D模型,你需要得到一个模型投影(轮廓),它​​可以被绘制到一个帧缓冲对象,并再次用作纹理或更好,但尝试直接绘制到场景使用一些额外的缓冲区,如模板,然后您可以再次在片段着色器中使用它来检查特定值。

答案 1 :(得分:1)

对于任意多边形形状: 1.三角测量你的形状(例如使用Delaunay三角测量)。 2.检查你是否指向每个三角形。这是微不足道的。 3.通过使用原始多边形形状周围的边界形状和三角形的空间分割来提高性能。

答案 2 :(得分:1)

着色器不会给你任何东西,因为着色器常规的结果是图像。

在基于图像的方法中,需要重新制定问题。假设您有一个带有渲染形状的灰度图像,其中白色和灰色像素定义形状,黑色像素定义任何形状。您必须知道每个形状的中心和每个形状的边界圆。请注意,形状的边界圆不得相互交叉

然后你可以通过边界圆来探测一个点的形状(这个探针是区分形状所必需的,因为通过从图像中偷看一个像素,你只能知道你是否指向相交一些形状),以及第二,偷看某个像素。如果两个探针都是正的那么你的点就是一个形状。