检查 OpenGL ES 2.0 中的顶点可见性

Check vertex visibility in OpenGL ES 2.0

如何以最简单的方式检查顶点是否可见?

如果我的顶点着色器看起来像:

void main(void) {
  vec4 glPosition = vec4(VTPosition.x * VTAspectRatio, VTPosition.y, VTPosition.z, 1.0);
  gl_Position = VTProjection * VTModelview * glPosition;
} 

我可以用同样的方法检查 CPU 上的能见度吗?

Vector4 vertex = {0.5, 0.5, -1.0, 1.0};

vertex = projectionMatrix * modelViewMatrix * vertex;

如果顶点 x 和 y 值在 -1.0 .. 1.0(视口坐标)范围内,则它是可见的

vertex shader(gl_Position)的输出位置会进行透视分割得到NDC(Normalized Device Coordinates)。在 NDC space 中,裁剪针对所有坐标 (1).

的 [-1.0, 1.0] 范围

因此,要测试给定顶点是否会被裁剪,您必须确定 gl_Position.xyz / gl_Position.w 是否在所有坐标的 [-1.0, 1.0] 范围内。用于测试此条件的 GLSL 代码可能如下所示:

if (any(lessThan(gl_Position.xyz, vec3(-gl_Position.w))) ||
    any(greaterThan(gl_Position.xyz, vec3(gl_Position.w))))
{
    // vertex will be clipped
}

(1) 严格来说,可以在渲染管道中的不同点执行裁剪,只要最终裁剪了查看体积之外的几何体即可。但是用NDC表达最简单