Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
车家大少爷
three.js
提交
7ff0b256
T
three.js
项目概览
车家大少爷
/
three.js
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
three.js
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7ff0b256
编写于
3月 27, 2019
作者:
O
oparisy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
JSM: port PMREM to ES6 modules
上级
a04911ec
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
596 addition
and
0 deletion
+596
-0
examples/jsm/pmrem/PMREMCubeUVPacker.d.ts
examples/jsm/pmrem/PMREMCubeUVPacker.d.ts
+14
-0
examples/jsm/pmrem/PMREMCubeUVPacker.js
examples/jsm/pmrem/PMREMCubeUVPacker.js
+253
-0
examples/jsm/pmrem/PMREMGenerator.d.ts
examples/jsm/pmrem/PMREMGenerator.d.ts
+16
-0
examples/jsm/pmrem/PMREMGenerator.js
examples/jsm/pmrem/PMREMGenerator.js
+310
-0
utils/modularize.js
utils/modularize.js
+3
-0
未找到文件。
examples/jsm/pmrem/PMREMCubeUVPacker.d.ts
0 → 100644
浏览文件 @
7ff0b256
import
{
CubeTexture
,
Renderer
,
ShaderMaterial
,
WebGLRenderTarget
}
from
'
../../../src/Three
'
;
export
class
PMREMCubeUVPacker
{
CubeUVRenderTarget
:
WebGLRenderTarget
;
constructor
(
cubeTextureLods
:
CubeTexture
[]);
update
(
renderer
:
Renderer
):
void
;
dispose
():
void
;
}
examples/jsm/pmrem/PMREMCubeUVPacker.js
0 → 100644
浏览文件 @
7ff0b256
/**
* @author Prashant Sharma / spidersharma03
* @author Ben Houston / bhouston, https://clara.io
*
* This class takes the cube lods(corresponding to different roughness values), and creates a single cubeUV
* Texture. The format for a given roughness set of faces is simply::
* +X+Y+Z
* -X-Y-Z
* For every roughness a mip map chain is also saved, which is essential to remove the texture artifacts due to
* minification.
* Right now for every face a PlaneMesh is drawn, which leads to a lot of geometry draw calls, but can be replaced
* later by drawing a single buffer and by sending the appropriate faceIndex via vertex attributes.
* The arrangement of the faces is fixed, as assuming this arrangement, the sampling function has been written.
*/
import
{
BackSide
,
CubeUVReflectionMapping
,
LinearFilter
,
LinearToneMapping
,
Mesh
,
NoBlending
,
OrthographicCamera
,
PlaneBufferGeometry
,
RGBEEncoding
,
RGBM16Encoding
,
Scene
,
ShaderMaterial
,
Vector2
,
Vector3
,
WebGLRenderTarget
}
from
"
../../../build/three.module.js
"
;
var
PMREMCubeUVPacker
=
(
function
()
{
var
camera
=
new
OrthographicCamera
();
var
scene
=
new
Scene
();
var
shader
=
getShader
();
var
PMREMCubeUVPacker
=
function
(
cubeTextureLods
)
{
this
.
cubeLods
=
cubeTextureLods
;
var
size
=
cubeTextureLods
[
0
].
width
*
4
;
var
sourceTexture
=
cubeTextureLods
[
0
].
texture
;
var
params
=
{
format
:
sourceTexture
.
format
,
magFilter
:
sourceTexture
.
magFilter
,
minFilter
:
sourceTexture
.
minFilter
,
type
:
sourceTexture
.
type
,
generateMipmaps
:
sourceTexture
.
generateMipmaps
,
anisotropy
:
sourceTexture
.
anisotropy
,
encoding
:
(
sourceTexture
.
encoding
===
RGBEEncoding
)
?
RGBM16Encoding
:
sourceTexture
.
encoding
};
if
(
params
.
encoding
===
RGBM16Encoding
)
{
params
.
magFilter
=
LinearFilter
;
params
.
minFilter
=
LinearFilter
;
}
this
.
CubeUVRenderTarget
=
new
WebGLRenderTarget
(
size
,
size
,
params
);
this
.
CubeUVRenderTarget
.
texture
.
name
=
"
PMREMCubeUVPacker.cubeUv
"
;
this
.
CubeUVRenderTarget
.
texture
.
mapping
=
CubeUVReflectionMapping
;
this
.
objects
=
[];
var
geometry
=
new
PlaneBufferGeometry
(
1
,
1
);
var
faceOffsets
=
[];
faceOffsets
.
push
(
new
Vector2
(
0
,
0
)
);
faceOffsets
.
push
(
new
Vector2
(
1
,
0
)
);
faceOffsets
.
push
(
new
Vector2
(
2
,
0
)
);
faceOffsets
.
push
(
new
Vector2
(
0
,
1
)
);
faceOffsets
.
push
(
new
Vector2
(
1
,
1
)
);
faceOffsets
.
push
(
new
Vector2
(
2
,
1
)
);
var
textureResolution
=
size
;
size
=
cubeTextureLods
[
0
].
width
;
var
offset2
=
0
;
var
c
=
4.0
;
this
.
numLods
=
Math
.
log
(
cubeTextureLods
[
0
].
width
)
/
Math
.
log
(
2
)
-
2
;
// IE11 doesn't support Math.log2
for
(
var
i
=
0
;
i
<
this
.
numLods
;
i
++
)
{
var
offset1
=
(
textureResolution
-
textureResolution
/
c
)
*
0.5
;
if
(
size
>
16
)
c
*=
2
;
var
nMips
=
size
>
16
?
6
:
1
;
var
mipOffsetX
=
0
;
var
mipOffsetY
=
0
;
var
mipSize
=
size
;
for
(
var
j
=
0
;
j
<
nMips
;
j
++
)
{
// Mip Maps
for
(
var
k
=
0
;
k
<
6
;
k
++
)
{
// 6 Cube Faces
var
material
=
shader
.
clone
();
material
.
uniforms
[
'
envMap
'
].
value
=
this
.
cubeLods
[
i
].
texture
;
material
.
envMap
=
this
.
cubeLods
[
i
].
texture
;
material
.
uniforms
[
'
faceIndex
'
].
value
=
k
;
material
.
uniforms
[
'
mapSize
'
].
value
=
mipSize
;
var
planeMesh
=
new
Mesh
(
geometry
,
material
);
planeMesh
.
position
.
x
=
faceOffsets
[
k
].
x
*
mipSize
-
offset1
+
mipOffsetX
;
planeMesh
.
position
.
y
=
faceOffsets
[
k
].
y
*
mipSize
-
offset1
+
offset2
+
mipOffsetY
;
planeMesh
.
material
.
side
=
BackSide
;
planeMesh
.
scale
.
setScalar
(
mipSize
);
this
.
objects
.
push
(
planeMesh
);
}
mipOffsetY
+=
1.75
*
mipSize
;
mipOffsetX
+=
1.25
*
mipSize
;
mipSize
/=
2
;
}
offset2
+=
2
*
size
;
if
(
size
>
16
)
size
/=
2
;
}
};
PMREMCubeUVPacker
.
prototype
=
{
constructor
:
PMREMCubeUVPacker
,
update
:
function
(
renderer
)
{
var
size
=
this
.
cubeLods
[
0
].
width
*
4
;
// top and bottom are swapped for some reason?
camera
.
left
=
-
size
*
0.5
;
camera
.
right
=
size
*
0.5
;
camera
.
top
=
-
size
*
0.5
;
camera
.
bottom
=
size
*
0.5
;
camera
.
near
=
0
;
camera
.
far
=
1
;
camera
.
updateProjectionMatrix
();
for
(
var
i
=
0
;
i
<
this
.
objects
.
length
;
i
++
)
{
scene
.
add
(
this
.
objects
[
i
]
);
}
var
gammaInput
=
renderer
.
gammaInput
;
var
gammaOutput
=
renderer
.
gammaOutput
;
var
toneMapping
=
renderer
.
toneMapping
;
var
toneMappingExposure
=
renderer
.
toneMappingExposure
;
var
currentRenderTarget
=
renderer
.
getRenderTarget
();
renderer
.
gammaInput
=
false
;
renderer
.
gammaOutput
=
false
;
renderer
.
toneMapping
=
LinearToneMapping
;
renderer
.
toneMappingExposure
=
1.0
;
renderer
.
setRenderTarget
(
this
.
CubeUVRenderTarget
);
renderer
.
render
(
scene
,
camera
);
renderer
.
setRenderTarget
(
currentRenderTarget
);
renderer
.
toneMapping
=
toneMapping
;
renderer
.
toneMappingExposure
=
toneMappingExposure
;
renderer
.
gammaInput
=
gammaInput
;
renderer
.
gammaOutput
=
gammaOutput
;
for
(
var
i
=
0
;
i
<
this
.
objects
.
length
;
i
++
)
{
scene
.
remove
(
this
.
objects
[
i
]
);
}
},
dispose
:
function
()
{
for
(
var
i
=
0
,
l
=
this
.
objects
.
length
;
i
<
l
;
i
++
)
{
this
.
objects
[
i
].
material
.
dispose
();
}
this
.
objects
[
0
].
geometry
.
dispose
();
}
};
function
getShader
()
{
var
shaderMaterial
=
new
ShaderMaterial
(
{
uniforms
:
{
"
faceIndex
"
:
{
value
:
0
},
"
mapSize
"
:
{
value
:
0
},
"
envMap
"
:
{
value
:
null
},
"
testColor
"
:
{
value
:
new
Vector3
(
1
,
1
,
1
)
}
},
vertexShader
:
"
precision highp float;
\
varying vec2 vUv;
\
void main() {
\
vUv = uv;
\
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
\
}
"
,
fragmentShader
:
"
precision highp float;
\
varying vec2 vUv;
\
uniform samplerCube envMap;
\
uniform float mapSize;
\
uniform vec3 testColor;
\
uniform int faceIndex;
\
\
void main() {
\
vec3 sampleDirection;
\
vec2 uv = vUv;
\
uv = uv * 2.0 - 1.0;
\
uv.y *= -1.0;
\
if(faceIndex == 0) {
\
sampleDirection = normalize(vec3(1.0, uv.y, -uv.x));
\
} else if(faceIndex == 1) {
\
sampleDirection = normalize(vec3(uv.x, 1.0, uv.y));
\
} else if(faceIndex == 2) {
\
sampleDirection = normalize(vec3(uv.x, uv.y, 1.0));
\
} else if(faceIndex == 3) {
\
sampleDirection = normalize(vec3(-1.0, uv.y, uv.x));
\
} else if(faceIndex == 4) {
\
sampleDirection = normalize(vec3(uv.x, -1.0, -uv.y));
\
} else {
\
sampleDirection = normalize(vec3(-uv.x, uv.y, -1.0));
\
}
\
vec4 color = envMapTexelToLinear( textureCube( envMap, sampleDirection ) );
\
gl_FragColor = linearToOutputTexel( color );
\
}
"
,
blending
:
NoBlending
}
);
shaderMaterial
.
type
=
'
PMREMCubeUVPacker
'
;
return
shaderMaterial
;
}
return
PMREMCubeUVPacker
;
}
)();
export
{
PMREMCubeUVPacker
};
examples/jsm/pmrem/PMREMGenerator.d.ts
0 → 100644
浏览文件 @
7ff0b256
import
{
Renderer
,
RenderTarget
,
Texture
,
CubeTexture
}
from
'
../../../src/Three
'
;
export
class
PMREMGenerator
{
cubeLods
:
CubeTexture
[];
constructor
(
sourceTexture
:
Texture
,
samplesPerLevel
?:
number
,
resolution
?:
number
);
update
(
renderer
:
Renderer
):
void
;
renderToCubeMapTarget
(
renderer
:
Renderer
,
renderTarget
:
any
):
void
;
renderToCubeMapTargetFace
(
renderer
:
Renderer
,
renderTarget
:
RenderTarget
,
faceIndex
:
number
):
void
;
dispose
():
void
;
}
examples/jsm/pmrem/PMREMGenerator.js
0 → 100644
浏览文件 @
7ff0b256
/**
* @author Prashant Sharma / spidersharma03
* @author Ben Houston / bhouston, https://clara.io
*
* To avoid cube map seams, I create an extra pixel around each face. This way when the cube map is
* sampled by an application later(with a little care by sampling the centre of the texel), the extra 1 border
* of pixels makes sure that there is no seams artifacts present. This works perfectly for cubeUV format as
* well where the 6 faces can be arranged in any manner whatsoever.
* Code in the beginning of fragment shader's main function does this job for a given resolution.
* Run Scene_PMREM_Test.html in the examples directory to see the sampling from the cube lods generated
* by this class.
*/
import
{
DoubleSide
,
GammaEncoding
,
LinearEncoding
,
LinearFilter
,
LinearToneMapping
,
Mesh
,
NearestFilter
,
NoBlending
,
OrthographicCamera
,
PlaneBufferGeometry
,
Scene
,
ShaderMaterial
,
WebGLRenderTargetCube
,
sRGBEncoding
}
from
"
../../../build/three.module.js
"
;
var
PMREMGenerator
=
(
function
()
{
var
shader
=
getShader
();
var
camera
=
new
OrthographicCamera
(
-
1
,
1
,
1
,
-
1
,
0.0
,
1000
);
var
scene
=
new
Scene
();
var
planeMesh
=
new
Mesh
(
new
PlaneBufferGeometry
(
2
,
2
,
0
),
shader
);
planeMesh
.
material
.
side
=
DoubleSide
;
scene
.
add
(
planeMesh
);
scene
.
add
(
camera
);
var
PMREMGenerator
=
function
(
sourceTexture
,
samplesPerLevel
,
resolution
)
{
this
.
sourceTexture
=
sourceTexture
;
this
.
resolution
=
(
resolution
!==
undefined
)
?
resolution
:
256
;
// NODE: 256 is currently hard coded in the glsl code for performance reasons
this
.
samplesPerLevel
=
(
samplesPerLevel
!==
undefined
)
?
samplesPerLevel
:
32
;
var
monotonicEncoding
=
(
this
.
sourceTexture
.
encoding
===
LinearEncoding
)
||
(
this
.
sourceTexture
.
encoding
===
GammaEncoding
)
||
(
this
.
sourceTexture
.
encoding
===
sRGBEncoding
);
this
.
sourceTexture
.
minFilter
=
(
monotonicEncoding
)
?
LinearFilter
:
NearestFilter
;
this
.
sourceTexture
.
magFilter
=
(
monotonicEncoding
)
?
LinearFilter
:
NearestFilter
;
this
.
sourceTexture
.
generateMipmaps
=
this
.
sourceTexture
.
generateMipmaps
&&
monotonicEncoding
;
this
.
cubeLods
=
[];
var
size
=
this
.
resolution
;
var
params
=
{
format
:
this
.
sourceTexture
.
format
,
magFilter
:
this
.
sourceTexture
.
magFilter
,
minFilter
:
this
.
sourceTexture
.
minFilter
,
type
:
this
.
sourceTexture
.
type
,
generateMipmaps
:
this
.
sourceTexture
.
generateMipmaps
,
anisotropy
:
this
.
sourceTexture
.
anisotropy
,
encoding
:
this
.
sourceTexture
.
encoding
};
// how many LODs fit in the given CubeUV Texture.
this
.
numLods
=
Math
.
log
(
size
)
/
Math
.
log
(
2
)
-
2
;
// IE11 doesn't support Math.log2
for
(
var
i
=
0
;
i
<
this
.
numLods
;
i
++
)
{
var
renderTarget
=
new
WebGLRenderTargetCube
(
size
,
size
,
params
);
renderTarget
.
texture
.
name
=
"
PMREMGenerator.cube
"
+
i
;
this
.
cubeLods
.
push
(
renderTarget
);
size
=
Math
.
max
(
16
,
size
/
2
);
}
};
PMREMGenerator
.
prototype
=
{
constructor
:
PMREMGenerator
,
/*
* Prashant Sharma / spidersharma03: More thought and work is needed here.
* Right now it's a kind of a hack to use the previously convolved map to convolve the current one.
* I tried to use the original map to convolve all the lods, but for many textures(specially the high frequency)
* even a high number of samples(1024) dosen't lead to satisfactory results.
* By using the previous convolved maps, a lower number of samples are generally sufficient(right now 32, which
* gives okay results unless we see the reflection very carefully, or zoom in too much), however the math
* goes wrong as the distribution function tries to sample a larger area than what it should be. So I simply scaled
* the roughness by 0.9(totally empirical) to try to visually match the original result.
* The condition "if(i <5)" is also an attemt to make the result match the original result.
* This method requires the most amount of thinking I guess. Here is a paper which we could try to implement in future::
* https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch20.html
*/
update
:
function
(
renderer
)
{
// Texture should only be flipped for CubeTexture, not for
// a Texture created via WebGLRenderTargetCube.
var
tFlip
=
(
this
.
sourceTexture
.
isCubeTexture
)
?
-
1
:
1
;
shader
.
defines
[
'
SAMPLES_PER_LEVEL
'
]
=
this
.
samplesPerLevel
;
shader
.
uniforms
[
'
faceIndex
'
].
value
=
0
;
shader
.
uniforms
[
'
envMap
'
].
value
=
this
.
sourceTexture
;
shader
.
envMap
=
this
.
sourceTexture
;
shader
.
needsUpdate
=
true
;
var
gammaInput
=
renderer
.
gammaInput
;
var
gammaOutput
=
renderer
.
gammaOutput
;
var
toneMapping
=
renderer
.
toneMapping
;
var
toneMappingExposure
=
renderer
.
toneMappingExposure
;
var
currentRenderTarget
=
renderer
.
getRenderTarget
();
renderer
.
toneMapping
=
LinearToneMapping
;
renderer
.
toneMappingExposure
=
1.0
;
renderer
.
gammaInput
=
false
;
renderer
.
gammaOutput
=
false
;
for
(
var
i
=
0
;
i
<
this
.
numLods
;
i
++
)
{
var
r
=
i
/
(
this
.
numLods
-
1
);
shader
.
uniforms
[
'
roughness
'
].
value
=
r
*
0.9
;
// see comment above, pragmatic choice
// Only apply the tFlip for the first LOD
shader
.
uniforms
[
'
tFlip
'
].
value
=
(
i
==
0
)
?
tFlip
:
1
;
var
size
=
this
.
cubeLods
[
i
].
width
;
shader
.
uniforms
[
'
mapSize
'
].
value
=
size
;
this
.
renderToCubeMapTarget
(
renderer
,
this
.
cubeLods
[
i
]
);
if
(
i
<
5
)
shader
.
uniforms
[
'
envMap
'
].
value
=
this
.
cubeLods
[
i
].
texture
;
}
renderer
.
setRenderTarget
(
currentRenderTarget
);
renderer
.
toneMapping
=
toneMapping
;
renderer
.
toneMappingExposure
=
toneMappingExposure
;
renderer
.
gammaInput
=
gammaInput
;
renderer
.
gammaOutput
=
gammaOutput
;
},
renderToCubeMapTarget
:
function
(
renderer
,
renderTarget
)
{
for
(
var
i
=
0
;
i
<
6
;
i
++
)
{
this
.
renderToCubeMapTargetFace
(
renderer
,
renderTarget
,
i
);
}
},
renderToCubeMapTargetFace
:
function
(
renderer
,
renderTarget
,
faceIndex
)
{
shader
.
uniforms
[
'
faceIndex
'
].
value
=
faceIndex
;
renderer
.
setRenderTarget
(
renderTarget
,
faceIndex
);
renderer
.
clear
();
renderer
.
render
(
scene
,
camera
);
},
dispose
:
function
()
{
for
(
var
i
=
0
,
l
=
this
.
cubeLods
.
length
;
i
<
l
;
i
++
)
{
this
.
cubeLods
[
i
].
dispose
();
}
},
};
function
getShader
()
{
var
shaderMaterial
=
new
ShaderMaterial
(
{
defines
:
{
"
SAMPLES_PER_LEVEL
"
:
20
,
},
uniforms
:
{
"
faceIndex
"
:
{
value
:
0
},
"
roughness
"
:
{
value
:
0.5
},
"
mapSize
"
:
{
value
:
0.5
},
"
envMap
"
:
{
value
:
null
},
"
tFlip
"
:
{
value
:
-
1
},
},
vertexShader
:
"
varying vec2 vUv;
\n\
void main() {
\n\
vUv = uv;
\n\
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
\n\
}
"
,
fragmentShader
:
"
#include <common>
\n\
varying vec2 vUv;
\n\
uniform int faceIndex;
\n\
uniform float roughness;
\n\
uniform samplerCube envMap;
\n\
uniform float mapSize;
\n\
uniform float tFlip;
\n\
\n\
float GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {
\n\
float a = ggxRoughness + 0.0001;
\n\
a *= a;
\n\
return ( 2.0 / a - 2.0 );
\n\
}
\n\
vec3 ImportanceSamplePhong(vec2 uv, mat3 vecSpace, float specPow) {
\n\
float phi = uv.y * 2.0 * PI;
\n\
float cosTheta = pow(1.0 - uv.x, 1.0 / (specPow + 1.0));
\n\
float sinTheta = sqrt(1.0 - cosTheta * cosTheta);
\n\
vec3 sampleDir = vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
\n\
return vecSpace * sampleDir;
\n\
}
\n\
vec3 ImportanceSampleGGX( vec2 uv, mat3 vecSpace, float Roughness )
\n\
{
\n\
float a = Roughness * Roughness;
\n\
float Phi = 2.0 * PI * uv.x;
\n\
float CosTheta = sqrt( (1.0 - uv.y) / ( 1.0 + (a*a - 1.0) * uv.y ) );
\n\
float SinTheta = sqrt( 1.0 - CosTheta * CosTheta );
\n\
return vecSpace * vec3(SinTheta * cos( Phi ), SinTheta * sin( Phi ), CosTheta);
\n\
}
\n\
mat3 matrixFromVector(vec3 n) {
\n\
float a = 1.0 / (1.0 + n.z);
\n\
float b = -n.x * n.y * a;
\n\
vec3 b1 = vec3(1.0 - n.x * n.x * a, b, -n.x);
\n\
vec3 b2 = vec3(b, 1.0 - n.y * n.y * a, -n.y);
\n\
return mat3(b1, b2, n);
\n\
}
\n\
\n\
vec4 testColorMap(float Roughness) {
\n\
vec4 color;
\n\
if(faceIndex == 0)
\n\
color = vec4(1.0,0.0,0.0,1.0);
\n\
else if(faceIndex == 1)
\n\
color = vec4(0.0,1.0,0.0,1.0);
\n\
else if(faceIndex == 2)
\n\
color = vec4(0.0,0.0,1.0,1.0);
\n\
else if(faceIndex == 3)
\n\
color = vec4(1.0,1.0,0.0,1.0);
\n\
else if(faceIndex == 4)
\n\
color = vec4(0.0,1.0,1.0,1.0);
\n\
else
\n\
color = vec4(1.0,0.0,1.0,1.0);
\n\
color *= ( 1.0 - Roughness );
\n\
return color;
\n\
}
\n\
void main() {
\n\
vec3 sampleDirection;
\n\
vec2 uv = vUv*2.0 - 1.0;
\n\
float offset = -1.0/mapSize;
\n\
const float a = -1.0;
\n\
const float b = 1.0;
\n\
float c = -1.0 + offset;
\n\
float d = 1.0 - offset;
\n\
float bminusa = b - a;
\n\
uv.x = (uv.x - a)/bminusa * d - (uv.x - b)/bminusa * c;
\n\
uv.y = (uv.y - a)/bminusa * d - (uv.y - b)/bminusa * c;
\n\
if (faceIndex==0) {
\n\
sampleDirection = vec3(1.0, -uv.y, -uv.x);
\n\
} else if (faceIndex==1) {
\n\
sampleDirection = vec3(-1.0, -uv.y, uv.x);
\n\
} else if (faceIndex==2) {
\n\
sampleDirection = vec3(uv.x, 1.0, uv.y);
\n\
} else if (faceIndex==3) {
\n\
sampleDirection = vec3(uv.x, -1.0, -uv.y);
\n\
} else if (faceIndex==4) {
\n\
sampleDirection = vec3(uv.x, -uv.y, 1.0);
\n\
} else {
\n\
sampleDirection = vec3(-uv.x, -uv.y, -1.0);
\n\
}
\n\
vec3 correctedDirection = vec3( tFlip * sampleDirection.x, sampleDirection.yz );
\n\
mat3 vecSpace = matrixFromVector( normalize( correctedDirection ) );
\n\
vec3 rgbColor = vec3(0.0);
\n\
const int NumSamples = SAMPLES_PER_LEVEL;
\n\
vec3 vect;
\n\
float weight = 0.0;
\n\
for( int i = 0; i < NumSamples; i ++ ) {
\n\
float sini = sin(float(i));
\n\
float cosi = cos(float(i));
\n\
float r = rand(vec2(sini, cosi));
\n\
vect = ImportanceSampleGGX(vec2(float(i) / float(NumSamples), r), vecSpace, roughness);
\n\
float dotProd = dot(vect, normalize(sampleDirection));
\n\
weight += dotProd;
\n\
vec3 color = envMapTexelToLinear(textureCube(envMap, vect)).rgb;
\n\
rgbColor.rgb += color;
\n\
}
\n\
rgbColor /= float(NumSamples);
\n\
//rgbColor = testColorMap( roughness ).rgb;
\n\
gl_FragColor = linearToOutputTexel( vec4( rgbColor, 1.0 ) );
\n\
}
"
,
blending
:
NoBlending
}
);
shaderMaterial
.
type
=
'
PMREMGenerator
'
;
return
shaderMaterial
;
}
return
PMREMGenerator
;
}
)();
export
{
PMREMGenerator
};
utils/modularize.js
浏览文件 @
7ff0b256
...
...
@@ -24,6 +24,9 @@ var files = [
{
path
:
'
loaders/OBJLoader.js
'
,
ignoreList
:
[]
},
{
path
:
'
loaders/MTLLoader.js
'
,
ignoreList
:
[]
},
{
path
:
'
pmrem/PMREMCubeUVPacker.js
'
,
ignoreList
:
[]
},
{
path
:
'
pmrem/PMREMGenerator.js
'
,
ignoreList
:
[]
},
{
path
:
'
utils/BufferGeometryUtils.js
'
,
ignoreList
:
[]
},
{
path
:
'
utils/GeometryUtils.js
'
,
ignoreList
:
[]
},
{
path
:
'
utils/MathUtils.js
'
,
ignoreList
:
[]
},
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录