From fedd618afa5f9f6d4a165abd97c41765b9aba0c1 Mon Sep 17 00:00:00 2001 From: WestLangley Date: Sun, 26 Apr 2020 14:49:43 -0400 Subject: [PATCH] Unflip PMREM CubeUV tiles --- examples/jsm/nodes/misc/TextureCubeUVNode.js | 28 +++++++++---------- src/extras/PMREMGenerator.js | 16 +++++++---- .../cube_uv_reflection_fragment.glsl.js | 13 +++++---- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/examples/jsm/nodes/misc/TextureCubeUVNode.js b/examples/jsm/nodes/misc/TextureCubeUVNode.js index 1362a004de..2aad511406 100644 --- a/examples/jsm/nodes/misc/TextureCubeUVNode.js +++ b/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; diff --git a/src/extras/PMREMGenerator.js b/src/extras/PMREMGenerator.js index 9ab9c80d60..2a2d2ff360 100644 --- a/src/extras/PMREMGenerator.js +++ b/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 ); diff --git a/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js index 96414473e7..3f11a8b365 100644 --- a/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +++ b/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); } -- GitLab