C++11 在OpenGL ES 2.0中检查顶点可见性

C++11 在OpenGL ES 2.0中检查顶点可见性,c++11,matrix,opengl-es-2.0,vertex-shader,frustum,C++11,Matrix,Opengl Es 2.0,Vertex Shader,Frustum,如何以最简单的方式检查顶点是否可见 如果我的顶点着色器看起来像: 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,

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

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

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(视口坐标)可见

顶点着色器的输出位置(
gl\u位置
)将进行透视分割以获得NDC(标准化设备坐标)。在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中表达。

如果顶点被另一个基本体“重叠”会有帮助吗