透視投影
行列
$ M = \begin{bmatrix} \frac{1}{aspect \cdot \tan(fov/2)} & 0 & 0 & 0 \\ 0 & \frac{1}{\tan(fov/2)} & 0 & 0 \\ 0 & 0 & -\frac{far + near}{far - near} & \frac{-2 \cdot far \cdot near}{far - near} \\ 0 & 0 & -1 & 0 \end{bmatrix}
$ M \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{aspect \cdot \tan(fov/2)} x \\ \frac{1}{\tan(fov/2)} y \\ -\frac{far + near}{far - near} z - \frac{2 \cdot far \cdot near}{far - near} \\ -z \end{bmatrix}
code:glsl
float aspect = resolution.x / resolution.y;
float sy = 1.0 / tan(fov / 2.0);
mat4 projectionMatrix = mat4(
sy / aspect, 0, 0, 0,
0, sy, 0, 0,
0, 0, -(far + near) / (far - near), -1,
0, 0, -2.0 * far * near / (far - near), 0
);
ベクトルで計算する
行列用意するのが面倒ならベクトルで計算してもいいよ
code:glsl
vec4 perspective(vec3 pos) {
float sy = 1.0 / tan(fov / 2.0);
float aspect = uResolution.x / uResolution.y;
return vec4(pos, 1.0) * vec4(
sy / aspect,
sy,
-(far + near) / (far - near),
0.0
) + vec4(
0.0,
0.0,
-2.0 * far * near / (far - near),
-pos.z
);
}
Depthどうなんの
$ depth = \frac{z'}{w'} = \frac{(far + near)z + 2 \cdot far \cdot near}{(far - near)z}
はぇ
far = 0.1, near = 10.0 のとき
$ depth = \frac{10.1 z + 2}{9.9 z}
わかんねー 直感的じゃねー
たすけてdesmos~
https://gyazo.com/c380d156d09ab51bf89d52a02c8a9e7d
あーーーーー
完全理解した
Depth逆変換
$ depth = \frac{(far + near)z + 2 \cdot far \cdot near}{(far - near)z}を$ zについて解けばええんよな
$ depth (far - near) z = (far + near)z + 2 \cdot far \cdot near
$ z = \frac{2 \cdot far \cdot near}{depth(far - near) - (far + near)}
オッケー
Screen Coordで1
$ \frac{z}{M_{22}} = z \tan(fov/2)がy方向の1(画面半分)になります