检查 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表达最简单
如何以最简单的方式检查顶点是否可见?
如果我的顶点着色器看起来像:
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).
因此,要测试给定顶点是否会被裁剪,您必须确定 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表达最简单