C++ 通过OpenGL Assimp加载的对象有时会反转法线

C++ 通过OpenGL Assimp加载的对象有时会反转法线,c++,opengl,blender,normals,assimp,C++,Opengl,Blender,Normals,Assimp,目前,我正在尝试在blender中制作的圆柱体对象(在z轴上缩放的基本圆柱体,无需进一步处理)上使用灯光,并使用以下选项通过Assimp加载该对象aiProcess\u GenSmoothNormals | aiProcess\u Triangulate | aiProcess\u CalcTangentSpace | aiProcess\u FlipUVs。在blender的波前导出选项中,设置了三角化选项 问题是在cilinder上进行一些缩放(通常在某个缩放树的上方),我的OpenGL实现

目前,我正在尝试在blender中制作的圆柱体对象(在z轴上缩放的基本圆柱体,无需进一步处理)上使用灯光,并使用以下选项通过Assimp加载该对象
aiProcess\u GenSmoothNormals | aiProcess\u Triangulate | aiProcess\u CalcTangentSpace | aiProcess\u FlipUVs
。在blender的波前导出选项中,设置了
三角化
选项

问题是在cilinder上进行一些缩放(通常在某个缩放树的上方),我的OpenGL实现显示反转的法线(我有一个显示法线的几何体着色器),因为它反转法线,所以照明也反转。这种情况只会发生在这些具有一定比例的圆柱体状对象上(至少,只有在我出现这种情况时)。除了这些圆柱体之外,我的场景中的所有其他对象都可以正常工作

我不知道这是否与Assimp加载.obj文件的方式有关,或者与blender在导出时处理法线的方式有关,或者可能与大z比例有关,因为它会破坏法线插值或任何东西?在下面,您将看到反向法线(左)和正确法线(右)的图像,其中反向法线对象通过blender具有较大的z比例


编辑

这次我在blender中手动三角测量圆柱体,并验证其法线。所有圆柱体的法线均正确,然后按原样导出。但是,一个管道现在具有正确的照明,但其他管道的法线仍然反转,而它们与工作管道具有相同的三角剖分,这令人困惑。下图显示了圆柱体的法线


编辑


好吧,我想起来了。一旦我开始将正确照明的管道缩放到与错误管道(左一)完全相同的比例,那么正确管道的法线将再次反转(在我的OpenGL程序中反转,在Blender中,法线看起来仍然很好)。所以圆柱体长度的刻度肯定与法线的反转有关,尽管我不知道这可能是什么。

反转法线的问题是由Blender中的反转刻度引起的。在
0
t下方向下缩放时,对象再次开始增长(具有负比例),但由于反向缩放的圆柱体与正常缩放的圆柱体看起来相同,因此无法立即看到


由于搅拌机缩放的工作原理,在缩放时,一些鼠标移动往往会突然从正比例跳到负比例,这导致我的一些圆柱体被负比例缩放。负比例圆柱体在将对象导出到
.obj
时具有反转法线。我认为这是blender中的一个bug,因为从blender本身显示的正常情况看,这是不可见的(它们看起来是正确的)。

您是否尝试过将
aiProcess\u fixinfaingnormals
添加到您的位掩码?@AndonM.Coleman不幸地没有工作。仍然是同样的问题默认情况下blender创建了一个带有ngon帽的圆柱体,在缩放或导出之前您是否尝试过将其更改为三角形?@mlvljr这是一个相当老的问题,我相信我已经解决了这个问题,但显然没有创建这个问题的答案。不统一的比额表不是问题所在。问题是反向缩放对象(在场景中不可见,因为反向圆柱体仍然是同一个圆柱体)也会导致法线变暗。我将为这个问题创建一个答案。好的,很有意思