首页 > 解决方案 > 生成网格的逆时针缠绕有什么问题?

问题描述

我试图让我生成的景观网格中的所有三角形都遵守 CCW 缠绕顺序。顶点被编号,并且索引用于在渲染期间引用它们。所有三角形都是在初始生成期间使用push_triangle(int,int,int)接受顶点索引的方法定义的。在那里,我调用了一个ccw(int,int,int,vec4)定义如下的方法:

bool ccw(int a, int b, int c, const vec4& facing) const {
    vec4 N = (verts[c]-verts[a]).cross(verts[b]-verts[a]).normalized(); // Left-handed
    return .0f < facing.dot(N);
}

push_triangle中,我称之为,如果为真,我添加一个Triangle(a,b,c),否则我添加一个Triangle(a,c,b)

因为我的索引在生成过程中驻留在对象中,所以在渲染之前将其上传到缓冲区对象之前Triangle,我会遍历它们以仅序列化 a 中的实际索引。std::vector在里面gen_indices()ccw(...)再次打电话assert,它再也没有回来false。没有和有网格细分的情况都是如此。

当我GL_CULL_FACE启用渲染时,我首先验证了在 CCW 和 CW 指定的对push_triangle. 由于背面被剔除,因此测试必须有效,并且顶点确实以 CCW 顺序在两种方式中指定。

但是当我对这个平凡的方形网格进行细分时,渲染中出现了许多洞,尽管我断言ccw(...)在调用gen_indices. 我禁用了剔除,并验证了所有三角形实际上都在那里。

所以,一定有我想念的东西。但我不知道它是什么。这不是让所有三角形都处于逆时针绕组中所需要的全部吗?

标签: c++openglopengl-es

解决方案


推荐阅读