Maison > développement back-end > C++ > Pourquoi le rendu de mon mappage normal est-il incorrect ?

Pourquoi le rendu de mon mappage normal est-il incorrect ?

DDD
Libérer: 2024-11-30 17:16:12
original
733 Les gens l'ont consulté

Why is My Normal Mapping Rendering Incorrectly?

Le mappage normal a terriblement mal tourné

Dans votre implémentation de mappage normal, vous avez peut-être négligé plusieurs aspects cruciaux :

Fragment Shader

Mélange de couleurs :

  • Vous vous définissez la couleur de sortie plusieurs fois, ce qui peut entraîner un comportement indéfini.
  • Envisagez de supprimer les affectations supplémentaires et de définir la couleur en une seule étape.

Ambiante et spéculaire :

  • Vous ajoutez ces composants à la couleur au lieu de les multiplier.
  • Le L'approche correcte consiste à ajouter l'ambiant et à multiplier le spéculaire par la valeur diffuse.

Création de la matrice TBN

Fonction :

  • Assurer la fonction getTangent() calcule correctement les tangentes et les bitangentes. Vous souhaiterez peut-être vous référer à des sources fiables pour connaître les équations appropriées.
  • Certains pilotes graphiques ont tendance à optimiser les variables de shader inutilisées, supprimant potentiellement les données cartographiques normales et conduisant à un rendu incorrect. Vérifiez cette possibilité.

Fragment Shader amélioré

#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);
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal