OpenGL的渲染流水线:

OpenGL的渲染流水线:

OpenGL的渲染流水线:

 
 

OpenGL的坐标系

在3D图形学里,OpenGL为右手坐标系(准确来说,OpenGL的世界空间和相机空间是右手坐标系)。随便提一下,D3D11为左手坐标系。
 
(1) 右手坐标系
 
 
 
(2) 左手坐标系
 

OpenGL的矩阵和向量结合方式

OpenGL的向量为列向量,矩阵和向量采用的方式为“矩阵X列向量”的方式,而D3D11为"行向量X矩阵"的方式。OpenGL的向量矩阵结合如下所示:
 
 
当多个矩阵乘以向量时,应该从右向左计算,比如存在三个矩阵:Proj,View,Model    向量:Pos
 
Proj*View*Model*Pos 代表 向量Pos先进行Model的变换,然后在进行View的变换,最后进行Proj的变换
 
 

OpenGL的各个空间的变换矩阵

 

世界变换矩阵

我一般称世界矩阵为SRT矩阵,SRT分别是"Scale","rotate","translate"三个单词的缩写,也就是世界矩阵由缩放矩阵,旋转矩阵,平移矩阵构成的
 

(1)缩放矩阵 (ScaleMatrix)

假设在X轴缩放Sx倍,在Y轴缩放Sy倍,在Z轴缩放Sz倍,缩放如下所示:
 
 
顶点乘以矩阵的公式如下:
 

(2)旋转矩阵

在说明旋转矩阵之前,我得说明一下,在右手坐标系如何判断哪个方向为顺时针方向旋转。

先来看下面的图,我们先用右手的拇指朝向Y的正方向,则四指所绕的方向也就是饶Y轴渲染的顺时针方向了,其它轴的顺时针方向同理也就是这样判断。

一,绕X轴顺时针旋转Θ度数

 
二,绕Y轴顺时针旋转Θ度数
 
 
 
 

三,绕Z轴顺时针旋转Θ度数

 
 
 

(3)移动矩阵(TranslateMatrix)

假设某个顶点在X轴方向移动dx个单位,Y轴移动dy个单位,在Z轴移动dz个单位
 
 

二,相机变换矩阵(ViewMatrix)

在此之前看看UVN相机模型,如图所示:
注视向量N的方向跟相机空间(ViewSpace)的Z轴方向是一致的,而竖直向量V的方向与相机空间(ViewSpace)的Y轴方向是一致的,右向量U的方向与相机空间(ViewSpace)的X轴方向是一致的。
计算UVN向量的公式如下:
 
这里的“X”为叉乘的意思,并且一样可以通过右手规则(OpenGL世界空间为右手坐标系)得到叉乘向量的方向,也就是用右手从叉乘符号左边那个向量绕向叉乘符号右边的那个向量,拇指所指方向即为叉乘得到向量的方向。
 
相机矩阵如下所示:
 
 
 
具体推导见文章:推导相机变换矩阵,当然这篇博客对于OpenGL的相机矩阵计算是有些错误的。
 

三,透视投影矩阵(PerspectiveMatrix)



在推导透视投影矩阵前先看看视截体(Frustum)是怎么样的:
视截体在YZ平面的投影如下面图所示,
 
 
n为原点到近截面的距离,f为原点到远截面的距离,α为视截体在YZ平面投影的FOV视角,r为投影平面的宽高比,则透视投影矩阵为:
 
 
 
具体推导参见文章:  
posted @   unicornsir  阅读(432)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示