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(视口坐标)范围内,则它是可见的

4

1 回答 1

0

顶点着色器(gl_Position)的输出位置会经过透视除法得到NDC(Normalized Device Coordinates)。在 NDC 空间中,裁剪是针对所有坐标 (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 中最容易表达。

于 2015-03-10T05:07:04.023 回答