【OpenGL/WebGL】Shader中如何获取摄像机视口的宽高
一、需求背景
在有些需求中,物体的大小是随着摄像机的视口的大小而变化的。如下图中,蓝色小方块,随着不断放大,其大小有个最大值,并不会无限放大。
这种实现的原理是在Shader中,不断根据摄像机近平面尺寸大小改变其面片的坐标,让其尺寸有最大值。
二、如何获取摄像机视口大小?
本文只讨论正交相机的视口获取,透视相机的获取稍微复杂一点点。
一般的WebGL或OpenGL开发框架都会将摄像机的投影矩阵传入Shader当中。根据投影矩阵即可获得视口的长宽。正交投影中,投影矩阵的计算公式如下:
M
p
r
o
j
e
c
t
=
[
2
R
?
L
0
0
?
R
+
L
R
?
L
0
2
T
?
B
0
?
T
+
B
T
?
B
0
0
1
Z
f
a
r
?
Z
n
e
a
r
?
Z
n
e
a
r
Z
f
a
r
?
Z
n
e
a
r
0
0
0
1
]
M_{project}=\begin{bmatrix} \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{1}{Z_{far}-Z_{near}} & -\frac{Z_{near}}{Z_{far}-Z_{near}} \\ 0 & 0 & 0 & 1 \end{bmatrix}
Mproject?=
?R?L2?000?0T?B2?00?00Zfar??Znear?1?0??R?LR+L??T?BT+B??Zfar??Znear?Znear??1?
?
其中:
???? R、L–投影平面左右边界的X坐标
???? T、B–投影平面上下边界的Y坐标
摄像机视口的宽高分别是R-L、T-B, 那么获取这俩值就不用多说了吧。 在Shader中直接提取投影矩阵的值计算即可。具体这个视口的长宽怎么影响面片的坐标需要根据具体的需求进行编码。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!