Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
72670aef
T
three.js
项目概览
Ablesons
/
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,体验更适合开发者的 AI 搜索 >>
提交
72670aef
编写于
9月 27, 2015
作者:
M
mkkellogg
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Unrolled loop in calculation of PCF shadow maps for point lights.
上级
83e2794a
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
116 addition
and
106 deletion
+116
-106
src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl
src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl
+84
-68
src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl
...enderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl
+31
-38
src/renderers/webgl/WebGLShadowMap.js
src/renderers/webgl/WebGLShadowMap.js
+1
-0
未找到文件。
src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl
浏览文件 @
72670aef
...
...
@@ -49,37 +49,44 @@
if
(
isPointLight
)
{
float
cubeTexelSize
=
1
.
0
/
(
shadowMapSize
[
i
].
x
*
0
.
25
);
vec3
baseDirection3D
=
normalize
(
lightToPosition
);
vec2
baseDirection2D
=
cubeToUV
(
baseDirection3D
,
texelSizeY
);
initGridSamplingDisk
();
float
diskRadius
=
1
.
25
;
float
numSamples
=
1
.
0
;
shadow
=
0
.
0
;
vec3
baseDirection
=
normalize
(
lightToPosition
);
float
curDistance
=
length
(
lightToPosition
);
float
dist
=
unpack1K
(
texture2D
(
shadowMap
[
i
],
baseDirection2D
)
)
+
0
.
1
;
if
(
curDistance
>=
dist
)
shadow
+=
1
.
0
;
// evaluate each sampling direction
for
(
int
s
=
0
;
s
<
20
;
s
++
)
{
vec3
offset
=
gridSamplingDisk
[
s
]
*
diskRadius
*
cubeTexelSize
;
vec3
adjustedBaseDirection3D
=
baseDirection3D
+
offset
;
vec2
adjustedBaseDirection2D
=
cubeToUV
(
adjustedBaseDirection3D
,
texelSizeY
);
dist
=
unpack1K
(
texture2D
(
shadowMap
[
i
],
adjustedBaseDirection2D
)
)
+
shadowBias
[
i
];
if
(
curDistance
>=
dist
)
shadow
+=
1
.
0
;
numSamples
+=
1
.
0
;
}
shadow
/=
numSamples
;
// bd3D = base direction 3D
vec3
bd3D
=
normalize
(
lightToPosition
);
// dp = distance from light to fragment position
float
dp
=
length
(
lightToPosition
);
shadow
=
0
.
0
;
// base measurement
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
// dr = disk radius
const
float
dr
=
1
.
25
;
// os = offset scale
float
os
=
dr
*
2
.
0
*
texelSizeY
;
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd0
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd1
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd2
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd3
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd4
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd5
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd6
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd7
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd8
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd9
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd10
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd11
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd12
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd13
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd14
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd15
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd16
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd17
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd18
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd19
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
shadow
/=
21
.
0
;
}
else
{
...
...
@@ -157,37 +164,44 @@
if
(
isPointLight
)
{
float
cubeTexelSize
=
1
.
0
/
(
shadowMapSize
[
i
].
x
*
0
.
25
);
vec3
baseDirection3D
=
normalize
(
lightToPosition
);
vec2
baseDirection2D
=
cubeToUV
(
baseDirection3D
,
texelSizeY
);
initGridSamplingDisk
();
float
diskRadius
=
2
.
25
;
float
numSamples
=
1
.
0
;
shadow
=
0
.
0
;
vec3
baseDirection
=
normalize
(
lightToPosition
);
float
curDistance
=
length
(
lightToPosition
);
float
dist
=
unpack1K
(
texture2D
(
shadowMap
[
i
],
baseDirection2D
)
)
+
0
.
1
;
if
(
curDistance
>=
dist
)
shadow
+=
1
.
0
;
// evaluate each sampling direction
for
(
int
s
=
0
;
s
<
20
;
s
++
)
{
vec3
offset
=
gridSamplingDisk
[
s
]
*
diskRadius
*
cubeTexelSize
;
vec3
adjustedBaseDirection3D
=
baseDirection3D
+
offset
;
vec2
adjustedBaseDirection2D
=
cubeToUV
(
adjustedBaseDirection3D
,
texelSizeY
);
dist
=
unpack1K
(
texture2D
(
shadowMap
[
i
],
adjustedBaseDirection2D
)
)
+
shadowBias
[
i
];
if
(
curDistance
>=
dist
)
shadow
+=
1
.
0
;
numSamples
+=
1
.
0
;
}
shadow
/=
numSamples
;
// bd3D = base direction 3D
vec3
bd3D
=
normalize
(
lightToPosition
);
// dp = distance from light to fragment position
float
dp
=
length
(
lightToPosition
);
shadow
=
0
.
0
;
// base measurement
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
// dr = disk radius
const
float
dr
=
2
.
25
;
// os = offset scale
float
os
=
dr
*
2
.
0
*
texelSizeY
;
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd0
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd1
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd2
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd3
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd4
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd5
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd6
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd7
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd8
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd9
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd10
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd11
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd12
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd13
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd14
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd15
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd16
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd17
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd18
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
+
gsd19
*
os
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
shadow
/=
21
.
0
;
}
else
{
...
...
@@ -257,12 +271,14 @@
if
(
isPointLight
)
{
vec3
baseDirection3D
=
normalize
(
lightToPosition
);
vec2
baseDirection2D
=
cubeToUV
(
baseDirection3D
,
texelSizeY
);
vec4
data
=
texture2D
(
shadowMap
[
i
],
baseDirection2D
);
float
dist
=
unpack1K
(
data
)
+
shadowBias
[
i
];
if
(
length
(
lightToPosition
)
>=
dist
)
shadowColor
=
shadowColor
*
vec3
(
1
.
0
-
realShadowDarkness
);
vec3
bd3D
=
normalize
(
lightToPosition
);
float
dp
=
length
(
lightToPosition
);
float
shadow
=
0
.
0
;
adjustShadowValue1K
(
dp
,
texture2D
(
shadowMap
[
i
],
cubeToUV
(
bd3D
,
texelSizeY
)
),
shadowBias
[
i
],
shadow
);
shadowColor
=
shadowColor
*
vec3
(
1
.
0
-
realShadowDarkness
*
shadow
);
}
else
{
...
...
src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl
浏览文件 @
72670aef
...
...
@@ -18,10 +18,15 @@
#if defined(POINT_LIGHT_SHADOWS)
float
unpack1K
(
vec4
color
)
{
// adjustShadowValue1K() upacks the depth value stored in @textureData, adds @bias to it, and then
// comapres the result with @testDepth. If @testDepth is larger than or equal to that result, then
// @shadowValue is incremented by 1.0.
const
vec4
bitSh
=
vec4
(
1
.
0
/
(
256
.
0
*
256
.
0
*
256
.
0
),
1
.
0
/
(
256
.
0
*
256
.
0
),
1
.
0
/
256
.
0
,
1
.
0
);
return
dot
(
color
,
bitSh
)
*
1000
.
0
;
void
adjustShadowValue1K
(
const
float
testDepth
,
const
vec4
textureData
,
const
float
bias
,
inout
float
shadowValue
)
{
const
vec4
bitSh
=
vec4
(
1
.
0
/
(
256
.
0
*
256
.
0
*
256
.
0
),
1
.
0
/
(
256
.
0
*
256
.
0
),
1
.
0
/
256
.
0
,
1
.
0
);
if
(
testDepth
>=
dot
(
textureData
,
bitSh
)
*
1000
.
0
+
bias
)
shadowValue
+=
1
.
0
;
}
...
...
@@ -96,41 +101,29 @@
}
vec3
gridSamplingDisk
[
20
];
bool
gridSamplingInitialized
=
false
;
void
initGridSamplingDisk
()
{
if
(
gridSamplingInitialized
)
{
return
;
}
gridSamplingDisk
[
0
]
=
vec3
(
1
,
1
,
1
);
gridSamplingDisk
[
1
]
=
vec3
(
1
,
-
1
,
1
);
gridSamplingDisk
[
2
]
=
vec3
(
-
1
,
-
1
,
1
);
gridSamplingDisk
[
3
]
=
vec3
(
-
1
,
1
,
1
);
gridSamplingDisk
[
4
]
=
vec3
(
1
,
1
,
-
1
);
gridSamplingDisk
[
5
]
=
vec3
(
1
,
-
1
,
-
1
);
gridSamplingDisk
[
6
]
=
vec3
(
-
1
,
-
1
,
-
1
);
gridSamplingDisk
[
7
]
=
vec3
(
-
1
,
1
,
-
1
);
gridSamplingDisk
[
8
]
=
vec3
(
1
,
1
,
0
);
gridSamplingDisk
[
9
]
=
vec3
(
1
,
-
1
,
0
);
gridSamplingDisk
[
10
]
=
vec3
(
-
1
,
-
1
,
0
);
gridSamplingDisk
[
11
]
=
vec3
(
-
1
,
1
,
0
);
gridSamplingDisk
[
12
]
=
vec3
(
1
,
0
,
1
);
gridSamplingDisk
[
13
]
=
vec3
(
-
1
,
0
,
1
);
gridSamplingDisk
[
14
]
=
vec3
(
1
,
0
,
-
1
);
gridSamplingDisk
[
15
]
=
vec3
(
-
1
,
0
,
-
1
);
gridSamplingDisk
[
16
]
=
vec3
(
0
,
1
,
1
);
gridSamplingDisk
[
17
]
=
vec3
(
0
,
-
1
,
1
);
gridSamplingDisk
[
18
]
=
vec3
(
0
,
-
1
,
-
1
);
gridSamplingDisk
[
19
]
=
vec3
(
0
,
1
,
-
1
);
gridSamplingInitialized
=
true
;
}
// gsdXX = grid sampling disk XX
// these values are used when rendering PCF shadow maps for point lights
const
vec3
gsd0
=
vec3
(
1
,
1
,
1
);
const
vec3
gsd1
=
vec3
(
1
,
-
1
,
1
);
const
vec3
gsd2
=
vec3
(
-
1
,
-
1
,
1
);
const
vec3
gsd3
=
vec3
(
-
1
,
1
,
1
);
const
vec3
gsd4
=
vec3
(
1
,
1
,
-
1
);
const
vec3
gsd5
=
vec3
(
1
,
-
1
,
-
1
);
const
vec3
gsd6
=
vec3
(
-
1
,
-
1
,
-
1
);
const
vec3
gsd7
=
vec3
(
-
1
,
1
,
-
1
);
const
vec3
gsd8
=
vec3
(
1
,
1
,
0
);
const
vec3
gsd9
=
vec3
(
1
,
-
1
,
0
);
const
vec3
gsd10
=
vec3
(
-
1
,
-
1
,
0
);
const
vec3
gsd11
=
vec3
(
-
1
,
1
,
0
);
const
vec3
gsd12
=
vec3
(
1
,
0
,
1
);
const
vec3
gsd13
=
vec3
(
-
1
,
0
,
1
);
const
vec3
gsd14
=
vec3
(
1
,
0
,
-
1
);
const
vec3
gsd15
=
vec3
(
-
1
,
0
,
-
1
);
const
vec3
gsd16
=
vec3
(
0
,
1
,
1
);
const
vec3
gsd17
=
vec3
(
0
,
-
1
,
1
);
const
vec3
gsd18
=
vec3
(
0
,
-
1
,
-
1
);
const
vec3
gsd19
=
vec3
(
0
,
1
,
-
1
);
#endif
...
...
src/renderers/webgl/WebGLShadowMap.js
浏览文件 @
72670aef
...
...
@@ -322,6 +322,7 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
}
_renderer
.
setViewport
(
_vector4
.
x
,
_vector4
.
y
,
_vector4
.
z
,
_vector4
.
w
);
}
// restore GL state
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录