|
@@ -11,74 +11,74 @@ export default /* glsl */`
|
|
|
// sampling a textureCube (not generally normalized).
|
|
|
|
|
|
float getFace(vec3 direction) {
|
|
|
- vec3 absDirection = abs(direction);
|
|
|
- float face = -1.0;
|
|
|
- if (absDirection.x > absDirection.z) {
|
|
|
- if (absDirection.x > absDirection.y)
|
|
|
- face = direction.x > 0.0 ? 0.0 : 3.0;
|
|
|
- else
|
|
|
- face = direction.y > 0.0 ? 1.0 : 4.0;
|
|
|
- } else {
|
|
|
- if (absDirection.z > absDirection.y)
|
|
|
- face = direction.z > 0.0 ? 2.0 : 5.0;
|
|
|
- else
|
|
|
- face = direction.y > 0.0 ? 1.0 : 4.0;
|
|
|
- }
|
|
|
- return face;
|
|
|
+ vec3 absDirection = abs(direction);
|
|
|
+ float face = -1.0;
|
|
|
+ if (absDirection.x > absDirection.z) {
|
|
|
+ if (absDirection.x > absDirection.y)
|
|
|
+ face = direction.x > 0.0 ? 0.0 : 3.0;
|
|
|
+ else
|
|
|
+ face = direction.y > 0.0 ? 1.0 : 4.0;
|
|
|
+ } else {
|
|
|
+ if (absDirection.z > absDirection.y)
|
|
|
+ face = direction.z > 0.0 ? 2.0 : 5.0;
|
|
|
+ else
|
|
|
+ face = direction.y > 0.0 ? 1.0 : 4.0;
|
|
|
+ }
|
|
|
+ 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); // 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);
|
|
|
+ vec2 uv;
|
|
|
+ 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);
|
|
|
}
|
|
|
|
|
|
vec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {
|
|
|
- float face = getFace(direction);
|
|
|
- float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);
|
|
|
- mipInt = max(mipInt, cubeUV_minMipLevel);
|
|
|
- float faceSize = exp2(mipInt);
|
|
|
+ float face = getFace(direction);
|
|
|
+ float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);
|
|
|
+ mipInt = max(mipInt, cubeUV_minMipLevel);
|
|
|
+ float faceSize = exp2(mipInt);
|
|
|
|
|
|
- float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);
|
|
|
+ float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);
|
|
|
|
|
|
- vec2 uv = getUV(direction, face) * (faceSize - 1.0);
|
|
|
- vec2 f = fract(uv);
|
|
|
- uv += 0.5 - f;
|
|
|
- if (face > 2.0) {
|
|
|
- uv.y += faceSize;
|
|
|
- face -= 3.0;
|
|
|
- }
|
|
|
- uv.x += face * faceSize;
|
|
|
- if(mipInt < cubeUV_maxMipLevel){
|
|
|
- uv.y += 2.0 * cubeUV_maxTileSize;
|
|
|
- }
|
|
|
- uv.y += filterInt * 2.0 * cubeUV_minTileSize;
|
|
|
- uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);
|
|
|
- uv *= texelSize;
|
|
|
+ vec2 uv = getUV(direction, face) * (faceSize - 1.0);
|
|
|
+ vec2 f = fract(uv);
|
|
|
+ uv += 0.5 - f;
|
|
|
+ if (face > 2.0) {
|
|
|
+ uv.y += faceSize;
|
|
|
+ face -= 3.0;
|
|
|
+ }
|
|
|
+ uv.x += face * faceSize;
|
|
|
+ if(mipInt < cubeUV_maxMipLevel){
|
|
|
+ uv.y += 2.0 * cubeUV_maxTileSize;
|
|
|
+ }
|
|
|
+ uv.y += filterInt * 2.0 * cubeUV_minTileSize;
|
|
|
+ uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);
|
|
|
+ uv *= texelSize;
|
|
|
|
|
|
- vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
- uv.x += texelSize;
|
|
|
- vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
- uv.y += texelSize;
|
|
|
- vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
- uv.x -= texelSize;
|
|
|
- vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
- vec3 tm = mix(tl, tr, f.x);
|
|
|
- vec3 bm = mix(bl, br, f.x);
|
|
|
- return mix(tm, bm, f.y);
|
|
|
+ vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
+ uv.x += texelSize;
|
|
|
+ vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
+ uv.y += texelSize;
|
|
|
+ vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
+ uv.x -= texelSize;
|
|
|
+ vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
|
|
|
+ vec3 tm = mix(tl, tr, f.x);
|
|
|
+ vec3 bm = mix(bl, br, f.x);
|
|
|
+ return mix(tm, bm, f.y);
|
|
|
}
|
|
|
|
|
|
// These defines must match with PMREMGenerator
|
|
@@ -100,33 +100,33 @@ vec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {
|
|
|
#define m6 4.0
|
|
|
|
|
|
float roughnessToMip(float roughness) {
|
|
|
- float mip = 0.0;
|
|
|
- if (roughness >= r1) {
|
|
|
- mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;
|
|
|
- } else if (roughness >= r4) {
|
|
|
- mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;
|
|
|
- } else if (roughness >= r5) {
|
|
|
- mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;
|
|
|
- } else if (roughness >= r6) {
|
|
|
- mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;
|
|
|
- } else {
|
|
|
- mip = -2.0 * log2(1.16 * roughness);// 1.16 = 1.79^0.25
|
|
|
- }
|
|
|
- return mip;
|
|
|
+ float mip = 0.0;
|
|
|
+ if (roughness >= r1) {
|
|
|
+ mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;
|
|
|
+ } else if (roughness >= r4) {
|
|
|
+ mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;
|
|
|
+ } else if (roughness >= r5) {
|
|
|
+ mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;
|
|
|
+ } else if (roughness >= r6) {
|
|
|
+ mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;
|
|
|
+ } else {
|
|
|
+ mip = -2.0 * log2(1.16 * roughness);// 1.16 = 1.79^0.25
|
|
|
+ }
|
|
|
+ return mip;
|
|
|
}
|
|
|
|
|
|
vec4 textureCubeUV(sampler2D envMap, vec3 sampleDir, float roughness) {
|
|
|
- float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);
|
|
|
- float mipF = fract(mip);
|
|
|
- float mipInt = floor(mip);
|
|
|
+ float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);
|
|
|
+ float mipF = fract(mip);
|
|
|
+ float mipInt = floor(mip);
|
|
|
|
|
|
- vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);
|
|
|
- if (mipF == 0.0) {
|
|
|
- return vec4(color0, 1.0);
|
|
|
- } else {
|
|
|
- vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);
|
|
|
- return vec4(mix(color0, color1, mipF), 1.0);
|
|
|
- }
|
|
|
+ vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);
|
|
|
+ if (mipF == 0.0) {
|
|
|
+ return vec4(color0, 1.0);
|
|
|
+ } else {
|
|
|
+ vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);
|
|
|
+ return vec4(mix(color0, color1, mipF), 1.0);
|
|
|
+ }
|
|
|
}
|
|
|
#endif
|
|
|
`;
|