소스 검색

Unflip PMREM CubeUV tiles

WestLangley 5 년 전
부모
커밋
fedd618afa
3개의 변경된 파일31개의 추가작업 그리고 26개의 파일을 삭제
  1. 14 14
      examples/jsm/nodes/misc/TextureCubeUVNode.js
  2. 10 6
      src/extras/PMREMGenerator.js
  3. 7 6
      src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js

+ 14 - 14
examples/jsm/nodes/misc/TextureCubeUVNode.js

@@ -65,20 +65,20 @@ TextureCubeUVNode.Nodes = ( function () {
 	var getUV = new FunctionNode(
 		`vec2 getUV(vec3 direction, float face) {
 				vec2 uv;
-				if (face == 0.0) {
-					uv = vec2(-direction.z, direction.y) / abs(direction.x);
-				} else if (face == 1.0) {
-					uv = vec2(direction.x, -direction.z) / abs(direction.y);
-				} else if (face == 2.0) {
-					uv = direction.xy / abs(direction.z);
-				} else if (face == 3.0) {
-					uv = vec2(direction.z, direction.y) / abs(direction.x);
-				} else if (face == 4.0) {
-					uv = direction.xz / abs(direction.y);
-				} else {
-					uv = vec2(-direction.x, direction.y) / abs(direction.z);
-				}
-				return 0.5 * (uv + 1.0);
+			    if (face == 0.0) {
+			      uv = vec2(direction.z, direction.y) / abs(direction.x); // pos x
+			    } else if (face == 1.0) {
+			      uv = vec2(-direction.x, -direction.z) / abs(direction.y); // pos y
+			    } else if (face == 2.0) {
+			      uv = vec2(-direction.x, direction.y) / abs(direction.z); // pos z
+			    } else if (face == 3.0) {
+			      uv = vec2(-direction.z, direction.y) / abs(direction.x); // neg x
+			    } else if (face == 4.0) {
+			      uv = vec2(-direction.x, direction.z) / abs(direction.y); // neg y
+			    } else {
+			      uv = vec2(direction.x, direction.y) / abs(direction.z); // neg z
+			    }
+			    return 0.5 * (uv + 1.0);
 		}` );
 	getUV.useKeywords = false;
 

+ 10 - 6
src/extras/PMREMGenerator.js

@@ -794,26 +794,30 @@ attribute vec3 position;
 attribute vec2 uv;
 attribute float faceIndex;
 varying vec3 vOutputDirection;
+
+// RH coordinate system; PMREM face-indexing convention
 vec3 getDirection(vec2 uv, float face) {
 	uv = 2.0 * uv - 1.0;
 	vec3 direction = vec3(uv, 1.0);
 	if (face == 0.0) {
-		direction = direction.zyx;
-		direction.z *= -1.0;
+		direction = direction.zyx; // ( 1, v, u ) pos x
 	} else if (face == 1.0) {
 		direction = direction.xzy;
-		direction.z *= -1.0;
+		direction.xz *= -1.0; // ( -u, 1, -v ) pos y
+	} else if (face == 2.0) {
+		direction.x *= -1.0; // ( -u, v, 1 ) pos z
 	} else if (face == 3.0) {
 		direction = direction.zyx;
-		direction.x *= -1.0;
+		direction.xz *= -1.0; // ( -1, v, -u ) neg x
 	} else if (face == 4.0) {
 		direction = direction.xzy;
-		direction.y *= -1.0;
+		direction.xy *= -1.0; // ( -u, -1, v ) neg y
 	} else if (face == 5.0) {
-		direction.xz *= -1.0;
+		direction.z *= -1.0; // ( u, v, -1 ) neg z
 	}
 	return direction;
 }
+
 void main() {
 	vOutputDirection = getDirection(uv, faceIndex);
 	gl_Position = vec4( position, 1.0 );

+ 7 - 6
src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js

@@ -27,20 +27,21 @@ float getFace(vec3 direction) {
     return face;
 }
 
+// RH coordinate system; PMREM face-indexing convention
 vec2 getUV(vec3 direction, float face) {
     vec2 uv;
     if (face == 0.0) {
-      uv = vec2(-direction.z, direction.y) / abs(direction.x);
+      uv = vec2(direction.z, direction.y) / abs(direction.x); // pos x
     } else if (face == 1.0) {
-      uv = vec2(direction.x, -direction.z) / abs(direction.y);
+      uv = vec2(-direction.x, -direction.z) / abs(direction.y); // pos y
     } else if (face == 2.0) {
-      uv = direction.xy / abs(direction.z);
+      uv = vec2(-direction.x, direction.y) / abs(direction.z); // pos z
     } else if (face == 3.0) {
-      uv = vec2(direction.z, direction.y) / abs(direction.x);
+      uv = vec2(-direction.z, direction.y) / abs(direction.x); // neg x
     } else if (face == 4.0) {
-      uv = direction.xz / abs(direction.y);
+      uv = vec2(-direction.x, direction.z) / abs(direction.y); // neg y
     } else {
-      uv = vec2(-direction.x, direction.y) / abs(direction.z);
+      uv = vec2(direction.x, direction.y) / abs(direction.z); // neg z
     }
     return 0.5 * (uv + 1.0);
 }