2016-12-07 18 views
0

현재 레이 트레이서에서 작업 중이며 문제가 발생했습니다. 평면, 원통 및 구형에 대한 텍스처 매핑을 구현했으며 꽤 잘 작동합니다 ... 노멀 맵 부분을 제외하고. 다음은 각 픽셀의 월드 내 위치 및 월드 내 법선입니다. world-space normals. 그리고 약간의 접선 공간 법선 맵 (일반 법선 맵).레이 트레이싱 일반 매핑

저는 접선 공간 법선을 월드 공간으로 변환하는 방법을 생각할 수 없습니다. "TBN"행렬을 사용해 보았지만 법선은 꺼져 있습니다 : normal map projected normals.

그리고 여기에 새로운 정상을 계산하는 내 코드입니다 :

VEC3 t = vec3_cross(worldnormal, new_vec3(0.0, 1.0, 0.0)); 
VEC3 b; 
if (!vec3_length(t)) 
    t = vec3_cross(worldnormal, new_vec3(0.0, 0.0, 1.0)); 
t = vec3_normalize(t); 
b = vec3_normalize((vec3_cross(worldnormal, t))); 
VEC3 map_n = vec3_normalize(get_texture_color(normal_map, texcoords)); 
MAT3 tbn = new_mat3(t, b, worldnormal); 
worldnormal = vec3_normalize(mat3_mult_vec3(tbn, map_n)); 

get_texture_color()는 노멀 맵의 텍스처 색상 그래서 255.f

답변

0

로 나눈 반환! 정상적인 매핑이 잘못되었음을 발견했습니다. 상수 {0, 0, 1} 법선을 사용하여 TBN 행렬이 옳았는지 확인한 후 방금 법선 맵의 탄젠트 공간 법선을 "변환"해야한다고 알았습니다.

올바른 코드 :

VEC3 t = vec3_cross(worldnormal, new_vec3(0.0, 1.0, 0.0)); 
VEC3 b; 
if (!vec3_length(t)) 
    t = vec3_cross(worldnormal, new_vec3(0.0, 0.0, 1.0)); 
t = vec3_normalize(t); 
b = vec3_normalize((vec3_cross(worldnormal, t))); 
VEC3 map_n = vec3_normalize(get_texture_color(normal_map, texcoords)); 
//map_n * 2 - 1 
map_n = vec3_sub(vec3_scale(map_n, 2), new_vec3(1, 1, 1)); 
MAT3 tbn = new_mat3(t, b, worldnormal); 
worldnormal = vec3_normalize(mat3_mult_vec3(tbn, map_n)); 

너무 가까이서, 아직까지! 여기가 어떻게 보이는지, 꽤 좋은 IMHO를 본다!

New (propper) normal mapping using TBN matrix !

With a better material for middle pillar ! (물이 아닌 다른 "일종의")