OpenGLES 3.0,Android:如何绘制两个对象的交点

OpenGLES 3.0,Android:如何绘制两个对象的交点,android,opengl-es,depth-buffer,stencil-buffer,Android,Opengl Es,Depth Buffer,Stencil Buffer,我目前正在从事一个使用OpenGL ES 3.0 for Android的项目。在我的项目中,我画了一个3d人头,其质心位于原点。我还有一个圆柱体,其中一个面的中心位于原点上。气缸伸出的长度超过缸盖的长度。换句话说,我有一个圆柱体穿过头部 现在,我只是使用默认的深度测试(GL_LESS)来不绘制位于缸盖内部的圆柱体部分。对于我的项目来说,最理想的是,如果我能在圆柱体与头部相交的地方画一个圆。我试着将深度测试改为(GL_EQUAL),但没有成功 我该怎么做?请记住,头部对象非常复杂,包含大量的点和

我目前正在从事一个使用OpenGL ES 3.0 for Android的项目。在我的项目中,我画了一个3d人头,其质心位于原点。我还有一个圆柱体,其中一个面的中心位于原点上。气缸伸出的长度超过缸盖的长度。换句话说,我有一个圆柱体穿过头部

现在,我只是使用默认的深度测试(GL_LESS)来不绘制位于缸盖内部的圆柱体部分。对于我的项目来说,最理想的是,如果我能在圆柱体与头部相交的地方画一个圆。我试着将深度测试改为(GL_EQUAL),但没有成功


我该怎么做?请记住,头部对象非常复杂,包含大量的点和三角形。

想到的最实用的解决方案是在片段着色器中丢弃圆柱体外的片段

一种方法是将原始坐标从顶点着色器传递到片段着色器。假设您当前有一个应用MVP变换的典型顶点着色器:

uniform mat4 MvpMat;
in vec4 InPos;
...
gl_Position = MvpMat * InPos;
您可以将此扩展到:

uniform mat4 MvpMat;
in vec4 InPos;
out vec4 OrigPos;
...
    gl_Position = MvpMat * InPos;
    OrigPos = InPos;
然后在片段着色器中(对于沿z轴具有给定半径的圆柱体):

有无数种不同的方法可以精确地处理这个问题。例如,您可以变换圆柱体几何体,然后使用变换后的顶点/片段坐标执行测试,而不是将原始坐标传递到片段着色器中。你必须根据你的具体用途找出什么看起来最干净,但这应该说明基本的想法

丢弃片段可能会对性能产生负面影响。但是,除非您已经达到了性能极限,否则这种方法可能会很好地工作。我怀疑是否有一种解决方案不会带来性能成本


在顶点级别进行操作会很好。完整的OpenGL具有剪辑平面,在这种情况下可以创造性地使用,但剪辑平面功能不在任何版本的OpenGL ES中。没有这一点,真的没有办法丢弃顶点,至少我能想到。所以丢弃片段可能是最合理的选择。

我不知道如何丢弃正确的片段。我相信我没有完全解释我想要什么。我有一个复杂的3D头部,它的质心在原点上。我有一个圆柱体,它的一个顶部圆形面的中心位于原点上。圆柱体可以围绕原点旋转(缸盖也可以)。通过深度测试,我可以隐藏缸盖内部的圆柱体部分,但可以看到缸盖外部的圆柱体部分。我更喜欢圆柱体与头部相交的圆。所以我需要丢弃圆柱体碎片,而不是圆柱体外部的碎片。基本上,我想知道是否有一种方法可以用于深度测试。
uniform float CylRad;
in vec4 OrigPos;
...
    if (dot(OrigPos.xy, OrigPos.xy) > CylRad * CylRad) {
        discard;
    }