【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= RL20000TB20000ZfarZnear10RLR+LTBT+BZfarZnearZnear1
其中:
     R、L–投影平面左右边界的X坐标
     T、B–投影平面上下边界的Y坐标

摄像机视口的宽高分别是R-L、T-B, 那么获取这俩值就不用多说了吧。 在Shader中直接提取投影矩阵的值计算即可。具体这个视口的长宽怎么影响面片的坐标需要根据具体的需求进行编码。

相关推荐

  1. android 在onCreate方法获得view

    2023-12-18 16:52:03       10 阅读
  2. android 在 Activity onCreate 获取View

    2023-12-18 16:52:03       9 阅读
  3. js 获取元素几种方法

    2023-12-18 16:52:03       33 阅读
  4. ffmpeg解析rtsp流获取视频

    2023-12-18 16:52:03       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-18 16:52:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-18 16:52:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-18 16:52:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-18 16:52:03       20 阅读

热门阅读

  1. C# 的迭代器

    2023-12-18 16:52:03       50 阅读
  2. 01矩阵(课程F)

    2023-12-18 16:52:03       42 阅读
  3. 9月8日星期五,今日早报简报微语报早读

    2023-12-18 16:52:03       41 阅读
  4. Golang中方法定义及使用

    2023-12-18 16:52:03       38 阅读
  5. 算法leetcode|93. 复原 IP 地址(多语言实现)

    2023-12-18 16:52:03       49 阅读
  6. SpringSecurity源码学习七:OAuth 2.0登录

    2023-12-18 16:52:03       34 阅读