Rumah > pembangunan bahagian belakang > C++ > Mengapa Pemetaan Biasa Saya Rendering Tidak Betul?

Mengapa Pemetaan Biasa Saya Rendering Tidak Betul?

DDD
Lepaskan: 2024-11-30 17:16:12
asal
638 orang telah melayarinya

Why is My Normal Mapping Rendering Incorrectly?

Pemetaan Biasa Hilang Sangat Salah

Dalam pelaksanaan pemetaan biasa anda, anda mungkin telah terlepas pandang beberapa aspek penting:

Serpihan Serpihan

Warna Pencampuran:

  • Anda menetapkan warna output beberapa kali, yang boleh membawa kepada tingkah laku yang tidak ditentukan.
  • Pertimbangkan untuk mengalih keluar tugasan tambahan dan tetapkan warna dalam satu langkah.

Ambien dan Spekular:

  • Anda menambah komponen ini pada warna dan bukannya mendarabnya.
  • Pendekatan yang betul ialah menambah ambien dan mendarab spekular dengan nilai meresap.

Matriks TBN Penciptaan

Fungsi:

  • Pastikan fungsi getTangent() mengira tangen dan bitangen dengan betul. Anda mungkin ingin merujuk kepada sumber yang boleh dipercayai untuk persamaan yang betul.
  • Sesetengah pemacu grafik cenderung untuk mengoptimumkan pemboleh ubah shader yang tidak digunakan, berpotensi mengalih keluar data peta biasa dan membawa kepada pemaparan yang salah. Semak kemungkinan ini.

Penerpu Serpihan Yang Diperbaiki

#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);
}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Pemetaan Biasa Saya Rendering Tidak Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan