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
638 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!

source:php.cn
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