最后如果用对数拆分方案,可以推导出(详细过程省略)
Z
i
=
n
(
f
/
n
)
i
/
N
Z_i = n(f/n)^{i/N}
Zi=n(f/n)i/N 其中Z是视锥体分段处的值,对应上图中的Ci,n是近平面距离,f是远平面距离,N是视锥体分割的个数,一般是1~4个
如果使用均匀拆分方案
Z
i
=
n
+
(
f
−
n
)
(
i
/
N
)
Z_i = n + (f - n)(i / N)
Zi=n+(f−n)(i/N)
而PSSM方法是他们的折中,用系数λ来加权平均,
Z
i
=
λ
n
(
f
/
n
)
i
/
N
+
(
1
−
λ
)
[
n
+
(
f
−
n
)
(
i
/
N
)
]
Z_i = λn(f/n)^{i/N} + (1 - λ)[ n + (f - n)(i / N) ]
Zi=λn(f/n)i/N+(1−λ)[n+(f−n)(i/N)]
float nd = camera->near;
float fd = camera->far;
float lambda = 0.75;
float ratio = fd / nd;
frustums[0].near(nd);
for(int i = 1 ; i < 分段个数 ; i++)
{
float si = i / (float)分段个数;
float t_near = lambda * (nd * powf(ratio, si)) + (1 - lambda) * (nd + (fd - nd) * si);
float far = near * 1.005f;//略微增加重合,避免断裂
frustums[i].near(near);
frustums[i-1].far(far);
}
frustums[分段个数-1].far(fd);
正交投影矩阵公式为:
[
2
r
−
l
0
0
−
r
+
l
r
−
l
0
2
t
−
b
0
−
t
+
b
t
−
b
0
0
−
2
f
−
n
−
f
+
n
f
−
n
0
0
0
1
]
\left[ \begin{matrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{-2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1 \end{matrix} \right]
⎣⎢⎢⎡r−l20000t−b20000f−n−20−r−lr+l−t−bt+b−f−nf+n1⎦⎥⎥⎤
根据已有条件,设缩放平移的变换矩阵为:
[
S
x
0
0
O
x
0
S
y
0
O
y
0
0
1
0
0
0
0
1
]
\left[ \begin{matrix} S_x & 0 & 0 & O_x \\ 0 & S_y & 0 & O_y \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right]
⎣⎢⎢⎡Sx0000Sy000010OxOy01⎦⎥⎥⎤
因此:
S
x
=
2
r
−
l
=
2.0
m
a
x
.
x
−
m
i
n
.
x
S_x = \frac{2}{r-l} = \frac{2.0}{max.x - min.x}
Sx=r−l2=max.x−min.x2.0
S
y
=
2
t
−
b
=
2.0
m
a
x
.
y
−
m
i
n
.
y
S_y = \frac{2}{t-b} = \frac{2.0}{max.y - min.y}
Sy=t−b2=max.y−min.y2.0
由
r
−
l
=
2
S
x
,
得
:
O
x
=
−
r
+
l
2
S
x
=
−
0.5
(
m
a
x
.
x
+
m
i
n
.
x
)
S
x
由 r-l = \frac{2}{S_x},得:O_x = -\frac{r+l}{2}S_x = -0.5(max.x + min.x)S_x
由r−l=Sx2,得:Ox=−2r+lSx=−0.5(max.x+min.x)Sx
由
t
−
b
=
2
S
y
,
得
:
O
y
=
−
t
+
b
2
S
y
=
−
0.5
(
m
a
x
.
y
+
m
i
n
.
y
)
S
y
由 t-b = \frac{2}{S_y},得:O_y = -\frac{t+b}{2}S_y = -0.5(max.y + min.y)S_y
由t−b=Sy2,得:Oy=−2t+bSy=−0.5(max.y+min.y)Sy
与阴影贴图一样,在摄像机空间中,投影矩阵使用的是透视投影:
p
r
o
j
M
a
t
=
[
2
n
r
−
l
0
r
+
l
r
−
l
0
0
2
n
t
−
b
t
+
b
t
−
b
0
0
0
−
f
+
n
f
−
n
−
2
f
n
f
−
n
0
0
−
1
0
]
projMat = \left[ \begin{matrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & \frac{-2fn}{f-n} \\ 0 & 0 & -1 & 0 \end{matrix} \right]
projMat=⎣⎢⎢⎡r−l2n0000t−b2n00r−lr+lt−bt+b−f−nf+n−100f−n−2fn0⎦⎥⎥⎤
[
X
C
Y
C
Z
C
W
C
]
=
p
r
o
j
M
a
t
∗
[
X
E
Y
E
Z
E
W
E
]
\left[ \begin{matrix} X_C \\ Y_C \\ Z_C \\ W_C \end{matrix} \right] = projMat * \left[ \begin{matrix} X_E \\ Y_E \\ Z_E \\ W_E \end{matrix} \right]
⎣⎢⎢⎡XCYCZCWC⎦⎥⎥⎤=projMat∗⎣⎢⎢⎡XEYEZEWE⎦⎥⎥⎤
把
−
f
+
n
f
−
n
用
A
替
换
,
−
2
f
n
f
−
n
用
B
替
换
,
得
:
Z
C
=
A
Z
E
+
B
W
E
把 -\frac{f+n}{f-n}用A替换,\frac{-2fn}{f-n}用B替换,得:Z_C = AZ_E + BW_E
把−f−nf+n用A替换,f−n−2fn用B替换,得:ZC=AZE+BWE
再
变
换
成
标
准
设
备
坐
标
:
Z
N
=
Z
C
W
C
=
A
Z
E
+
B
W
E
W
C
再变换成标准设备坐标:Z_N = \frac {Z_C} {W_C} = \frac {AZ_E + BW_E}{W_C}
再变换成标准设备坐标:ZN=WCZC=WCAZE+BWE
又
因
为
W
E
=
1
,
W
C
=
−
Z
E
,
所
以
Z
N
=
A
Z
E
+
B
−
Z
E
又因为W_E = 1,W_C = -Z_E,所以Z_N = \frac{AZ_E+B}{-Z_E}
又因为WE=1,WC=−ZE,所以ZN=−ZEAZE+B
由
于
标
准
设
备
坐
标
的
范
围
是
[
−
1.0
,
1.0
]
,
所
以
再
把
Z
N
∗
0.5
+
0.5
由于标准设备坐标的范围是[-1.0,1.0],所以再把Z_N * 0.5 + 0.5
由于标准设备坐标的范围是[−1.0,1.0],所以再把ZN∗0.5+0.5