> 백엔드 개발 > C++ > 내 노멀 매핑이 잘못 렌더링되는 이유는 무엇입니까?

내 노멀 매핑이 잘못 렌더링되는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-30 17:16:12
원래의
638명이 탐색했습니다.

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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿