ホームページ > バックエンド開発 > C++ > 法線マッピングが正しくレンダリングされないのはなぜですか?

法線マッピングが正しくレンダリングされないのはなぜですか?

DDD
リリース: 2024-11-30 17:16:12
オリジナル
638 人が閲覧しました

Why is My Normal Mapping Rendering Incorrectly?

通常のマッピングがひどく間違っている

通常のマッピングの実装では、いくつかの重要な側面を見落としている可能性があります:

フラグメント シェーダー

色ミキシング:

  • 出力カラーを複数回設定しているため、未定義の動作が発生する可能性があります。
  • 余分な割り当てを削除して、1 つのステップでカラーを設定することを検討してください。

アンビエントと鏡面反射光:

  • これらのコンポーネントを乗算するのではなく、カラーに追加しています。
  • 正しいアプローチは、アンビエントを追加し、鏡面反射光に拡散値を乗算することです。

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート