浏览代码

Manually unpacked normal mapping to fix issue with refraction being offset rather than distorted.

(cherry picked from commit 31f2d946ad6abcfe82ff54bb36e84d20ac6c62a9)
Brennen Green 4 年之前
父节点
当前提交
fac2e5dc67
共有 1 个文件被更改,包括 4 次插入1 次删除
  1. 4 1
      scene/resources/material.cpp

+ 4 - 1
scene/resources/material.cpp

@@ -861,7 +861,10 @@ void SpatialMaterial::_update_shader() {
 
 
 	if (features[FEATURE_REFRACTION]) {
 	if (features[FEATURE_REFRACTION]) {
 		if (features[FEATURE_NORMAL_MAPPING]) {
 		if (features[FEATURE_NORMAL_MAPPING]) {
-			code += "\tvec3 ref_normal = normalize( mix(NORMAL,TANGENT * NORMALMAP.x + BINORMAL * NORMALMAP.y + NORMAL * NORMALMAP.z,NORMALMAP_DEPTH) );\n";
+			code += "\tvec3 unpacked_normal = NORMALMAP;\n";
+			code += "\tunpacked_normal.xy = unpacked_normal.xy * 2.0 - 1.0;\n";
+			code += "\tunpacked_normal.z = sqrt(max(0.0, 1.0 - dot(unpacked_normal.xy, unpacked_normal.xy)));\n";
+			code += "\tvec3 ref_normal = normalize( mix(NORMAL,TANGENT * unpacked_normal.x + BINORMAL * unpacked_normal.y + NORMAL * unpacked_normal.z,NORMALMAP_DEPTH) );\n";
 		} else {
 		} else {
 			code += "\tvec3 ref_normal = NORMAL;\n";
 			code += "\tvec3 ref_normal = NORMAL;\n";
 		}
 		}