【问题标题】:Check vertex visibility in OpenGL ES 2.0检查 OpenGL ES 2.0 中的顶点可见性
【发布时间】:2015-03-09 12:58:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++11 matrix opengl-es-2.0 vertex-shader frustum


    【解决方案1】:

    顶点着色器(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 中最容易表达。

    【讨论】:

    • 如果顶点被另一个图元“重叠”会有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多