当使用ASSIMP和Phong着色的3D模型太大(cilinder)时,漫反射法线反转

时间:2014-01-03 14:27:45

标签: c++ opengl glsl normals phong

目前我正在我在Blender中创建的3D场景中设置一些灯光,并通过assimp加载以下选项:

aiProcess_GenSmoothNormals | aiProcess_Triangulate | aiProcess_CalcTangentSpace | aiProcess_FlipUVs

目前我的计划中遇到了一个非常奇怪的故障。我正在片段着色器上实现 Phong着色,以便使用以下属性进行照明:

  1. 每个模型都设置了纹理。
  2. 每个模型都有从模型加载的法线向量(对它们进行一些预计算,可能是因为aiProcess_GenSmoothNormals标志)
  3. 镜面反射光正在处理所有物体。
  4. 漫反射颜色可以正常工作。
  5. 但是,管道对象是不同的:漫反射颜色始终位于应该点亮的管道的另一侧,而镜面反射光则位于正确的一侧。这使事情变得奇怪,因为镜面反射光正在按预期工作,而漫反射组件总是在错误的一侧。当我将cilinder对象缩放到混合器中的某个点以外时,我注意到了这种效果(较小的缩放的cilinders仍然可以正常工作),因此缩放超过某个阈值的cilinder对象可能与它有关。

    我的场景,管状物体有镜面反射成分,但漫反射颜色位于光源的另一侧。 Diffuse normals not working, while specular is

    在搅拌机中看到的法线 Normals as seen in blender

    我的第一个猜测是它与正常缩放有关,但是我已经在顶点着色器中使用了普通矩阵,而我场景中的其他对象工作得很好。

    顶点着色器:

    #version 330
    layout (location = 0) in vec3 vertex;
    layout(location = 1) in vec3 normal;
    layout(location = 2) in vec3 tangent;
    layout(location = 3) in vec3 color;
    layout(location = 4) in vec2 texCoord;
    
    uniform mat4 projection;
    uniform mat4 view;
    uniform mat4 model;
    uniform vec3 lightPos;
    
    out vec3 Position;
    out vec3 Normal;
    out vec3 LightPos;
    out vec2 TexCoord;
    
    void main()
    {
        gl_Position = projection * view * model * vec4(vertex, 1.0);
        // Position
        Position = vec3(view * model * vec4(vertex, 1.0));
        // Normal
        mat3 normalMat = transpose(inverse(mat3(view * model)));
        Normal = normalMat * normal;
        // Lighting
        LightPos = vec3(view * vec4(lightPos, 1.0));
        // Texture
        TexCoord = texCoord;
    }
    

    Fragment Shader:

    #version 330
    in vec3 Position;
    in vec3 Normal;
    in vec3 LightPos;
    in vec2 TexCoord;
    
    uniform sampler2D texture0;
    
    out vec4 outColor;
    
    void main()
    {
        // defaults
        vec4 ambient = vec4(0.2);
        vec4 diffuse = vec4(0.4);
        vec4 specular = vec4(0.5);
        vec4 texColor = texture(texture0, TexCoord);
        // Phong shading
        vec3 LightDir = normalize(LightPos - Position);
        vec3 Norm = normalize(Normal);
    
        vec3 ViewDir = normalize(-Position);
        vec3 ReflectDir = reflect(-LightDir,Norm);
        float specularContribution = pow(max(dot(ViewDir, ReflectDir), 0.0), 32);
        // Calculate diffuse component
        vec4 I = diffuse * max(dot(Norm, LightDir), 0.0);
        diffuse = clamp(I, 0.0, 1.0);
        // Calculate specular component
        specular = specular * specularContribution;
    
        outColor = texColor * (diffuse + ambient + specular);
    }
    

    <小时/> 的修改

    我添加了一个几何着色器,在第二个绘图过程中显示所有顶点法线以进行调试。但是,当显示法线时,它们会随着相机移动而略微移动,这是他们不应该做的。我猜这可能是我之前提到的问题的原因。

    我制作了一个小视频来说明正常的动作:Youtube video that displays the normal movement issues.

    视频显示粉红色法线在相机移动时改变方向。情况应该不是这样,我不知道为什么。它是不正确的正常矩阵还是assimp错误地加载法线?

0 个答案:

没有答案
相关问题