Heim > Backend-Entwicklung > C++ > Warum wird mein normales Mapping falsch gerendert?

Warum wird mein normales Mapping falsch gerendert?

DDD
Freigeben: 2024-11-30 17:16:12
Original
702 Leute haben es durchsucht

Why is My Normal Mapping Rendering Incorrectly?

Normales Mapping ist schrecklich schief gegangen

Bei Ihrer normalen Mapping-Implementierung haben Sie möglicherweise mehrere entscheidende Aspekte übersehen:

Fragment-Shader

Farbmischung:

  • Du legen die Ausgabefarbe mehrmals fest, was zu undefiniertem Verhalten führen kann.
  • Erwägen Sie, die zusätzlichen Zuweisungen zu entfernen und die Farbe in einem Schritt festzulegen.

Umgebung und Spiegelung:

  • Sie addieren diese Komponenten zur Farbe, anstatt zu multiplizieren sie.
  • Der richtige Ansatz besteht darin, Umgebungslicht hinzuzufügen und Spiegelung mit dem diffusen Wert zu multiplizieren.

TBN-Matrixerstellung

Funktion:

  • Stellen Sie sicher, dass die Funktion getTangent() die Tangenten und Bitangenten korrekt berechnet. Möglicherweise möchten Sie für die richtigen Gleichungen auf zuverlässige Quellen zurückgreifen.
  • Einige Grafiktreiber neigen dazu, nicht verwendete Shader-Variablen zu optimieren, wodurch möglicherweise die normalen Kartendaten entfernt werden und es zu einer falschen Darstellung kommt. Überprüfen Sie diese Möglichkeit.

Verbesserter Fragment-Shader

#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);
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum wird mein normales Mapping falsch gerendert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage