我有一个面部列表[index],顶点和法线列表被映射到。我在每个顶点生成偏移以产生地形/变化,但通过这样做,顶点法线停止工作就像它们应该的那样。这是我做的再次使着色工作,即尝试重做顶点法线(vn);
for (auto &x : normals)x = vec3(0); //zero normals first
vec3 facenormal; //buffer
for (size_t i = 0; i<indices.size();) //iterate 3 points per face
{
//find the face normal (b-a x c-a)
facenormal = cross(
(shape[indices[i + 1]] - shape[indices[i]]),
(shape[indices[i + 2]] - shape[indices[i]])
);
//add this face normal, to each of the 3 vn slots nearby
normals[indices[i++]] += facenormal; //note +=
normals[indices[i++]] += facenormal;
normals[indices[i++]] += facenormal;
}
for (auto &x : normals)x = normalize(x); //then normalize them
根据this回复,它应该可以解决问题。但是,这种方法有问题。
它会导致像图像下半部分所示的伪像,而阴影似乎大部分都有效。
问题是:如何计算vn,以避免这些线?
重构解析器:我解析(加载)模型的方式是取出重复的索引值,这可以保存我必须传递给GPU的参考面,但会导致某些值堆叠/被重复使用。至少我怀疑这是问题,因为它现在看起来很清洁。然而,唯一的问题是我突然变得平坦的阴影。平面阴影使得很难看出问题是否真的消失了,但我怀疑它是。为什么新的解析在重新计算后会产生平面着色超出我的范围。但这些是我看到的结果。
我仍然需要找出正确的公式来计算顶点法线?我不明白为什么阴影在之前是圆的,但现在它是平的,都是因为我停止堆叠索引值的1/4?
最终找到合适的解决方案!正如NicoSchertler指出的那样,顶点法线不是基础网格。我加载顶点/ uv /法线以适合glDrawElementsBaseVertex渲染调用的索引的方式,意味着在加载顶点和法线时循环,不是指基础,而是设计为适合uv +法线索引的副本
Soo,我最终得到的是奇怪的伪像和平面着色,因为我修改的值是后期解析。让每张脸都不是唯一的并不能解决任何问题,而是澄清部分问题,即我需要修改基础索引值,而不是加载索引值。
在我重新计算基础网格(预索引)后,我得到了这个结果;平滑的阴影和山腰的明显差异。该模型是更高的聚(并且以二进制序列化)并且着色仍处于其早期阶段。但是,这是非常正确的。