首頁 > 後端開發 > C++ > 為什麼我的法線貼圖渲染不正確?

為什麼我的法線貼圖渲染不正確?

DDD
發布: 2024-11-30 17:16:12
原創
695 人瀏覽過

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板