首页 > 后端开发 > C++ > 为什么我的法线贴图渲染不正确?

为什么我的法线贴图渲染不正确?

DDD
发布: 2024-11-30 17:16:12
原创
645 人浏览过

Why is My Normal Mapping Rendering Incorrectly?

法线贴图严重错误

在法线贴图实现中,您可能忽略了几个关键方面:

片段着色器

颜色混合:

  • 您多次设置输出颜色,这可能会导致未定义的行为。
  • 考虑删除额外的分配并一步设置颜色。

环境和镜面反射:

  • 您将这些分量添加到颜色中,而不是相乘。
  • 正确的方法是添加环境光并将镜面反射乘以漫反射值。

TBN 矩阵创建

函数:

  • 确保 getTangent() 函数正确计算切线和双切线。您可能需要参考可靠的来源来获取正确的方程。
  • 某些图形驱动程序倾向于优化未使用的着色器变量,可能会删除法线贴图数据并导致不正确的渲染。检查这种可能性。

改进的片段着色器

#version 430

uniform sampler2D diffuseMap;
uniform sampler2D normalMap;
uniform mat4 ModelMatrix;
uniform vec3 CameraPosition;

uniform struct Light {
    float ambient;
    vec3 position;
} light;
uniform float shininess;

in vec2 fsCoords;
in vec3 fsVertex;
in mat3 TBNMatrix;

out vec4 color;

void main()
{
    // Base color
    vec3 brownColor = vec3(153.0 / 255.0, 102.0 / 255.0, 51.0 / 255.0);
    vec3 baseColor = brownColor + 0.25; // Add a fixed base color
    
    // Normal
    vec3 normal = texture(normalMap, fsCoords).rgb * 2.0 - 1.0;
    
    // Surface position and lighting
    vec3 surfacePos = vec3(ModelMatrix * vec4(fsVertex, 1.0));
    vec3 surfaceToLight = normalize(TBNMatrix * (light.position - surfacePos)); // Unit vector
    vec3 eyePos = TBNMatrix * CameraPosition;
    
    // Diffuse
    float diffuse = max(0.0, dot(normal, surfaceToLight));
    
    // Specular
    float specular;
    vec3 incidentVector = -surfaceToLight; // Unit
    vec3 reflectionVector = reflect(incidentVector, normal); // Unit vector
    vec3 surfaceToCamera = normalize(eyePos - surfacePos); // Unit vector
    float cosAngle = max(0.0, dot(surfaceToCamera, reflectionVector));
    if (diffuse > 0.0)
        specular = pow(cosAngle, shininess);
    
    // Lighting
    vec3 finalColor = baseColor * light.ambient;
    finalColor += (diffuse + specular) * light.position;
    
    // Output color
    color = vec4(finalColor, 1.0);
}
登录后复制

以上是为什么我的法线贴图渲染不正确?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板