c++ - 生成网格的逆时针缠绕有什么问题?
问题描述
我试图让我生成的景观网格中的所有三角形都遵守 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
. 我禁用了剔除,并验证了所有三角形实际上都在那里。
所以,一定有我想念的东西。但我不知道它是什么。这不是让所有三角形都处于逆时针绕组中所需要的全部吗?
解决方案
推荐阅读
- javascript - 使用 child_added 时 Firebase 服务器值时间戳未转换
- .net - .NET Async/Await - 何时返回任务和何时等待
- javascript - 如何在 ng for 中选择单击的元素并将类仅添加到所选元素?
- c - 在编译时从符号表中获取函数名
- c# - 如何使用 if 和 else 显示/隐藏标签
- ios - SKStoreReviewController.requestReview 冻结模拟器
- wso2 - WSO2IS - 如何根据不同的用户配置文件为服务提供商配置声明?
- python - 结合每月页面展示次数的所有 csv 文件
- json - CockroachDB 中 JSONB 数组字段的差异总和
- reactjs - 在一个 html 标签中包含两个 javascript 代码:jsx 语法问题