所以我尝试使用行进立方体算法生成地形。此时,我正在实现漫反射照明(片段着色器)。我计算了每个顶点的法线并得到了这个:
图片左侧显示法线(每个顶点和三角形)和线框,右侧是同一相机角度的照明景观。
所以,我很好奇,我做错了什么?
我这样计算法线:
for (int t = 0; t < all_triangles.size(); t++) {
Vertex v0 = all_vertices[triangle.get_vertex(0)];
Vertex v1 = all_vertices[triangle.get_vertex(1)];
Vertex v2 = all_vertices[triangle.get_vertex(2)];
QVector3D edge1 = v1 - v0;
QVector3D edge2 = v2 - v0;
QVector3D normal = QVector3D::crossProduct(edge1, edge2);
// triangle.set_normal(normal.normalized());
for (int v = 0; v < 3; v++) {
all_vertices[triangle.get_vertex(v)].add_normal(normal.normalized());
}
}
for (int v = 0; v < all_vertices.size(); v++) {
auto normal = all_vertices[v].get_normal();
normal.normalize();
all_vertices[v].set_normal(normal);
}
更新:vcs
你的数学是正确的。 你的正常人看起来很好,但很难 100% 理解你的图片。
调试此类问题的常用方法是: - 平面着色(无正常平滑) - 使用三角形/顶点法线作为颜色来可视化法线
也请分享您的着色代码。
一些值得尝试的事情:
(1) 衡量您的法线重量。 add_normal(normal.normalized()*weight),其中权重可以是很多东西,比如三角形的面积,或者内角
(2) 计算场的法线。您将得到一个 f(x,y,z)=0 的曲面。计算 f(x-eps,y,z)-f(x+eps,y,z) 即可得到正常的 x,y,z 也相同。
(3) 只是模糊它。对于每个顶点,按边添加所有相邻法线并求平均值。
我想你想要(2)。特别是对于地形。