OpenGL学习笔记


文章内容主要来自 《计算机图形学编程(使用OpenGL和C++)》

OpenGL图像管线

OpenGL渲染管线

渲染管线

顶点着色器
曲面细分着色器
几核着色器
光栅化
片段着色器
像素操作

光栅化

光栅化过程确定了用以显示3个顶点所确定的三角形的所有像素需要绘制的位置

  1. 光栅化过程开始时先对三角形的每对顶点进行插值
    如果光栅化过程到此为止,那么呈现出的图像将会是线框模型

    使用 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 会显示线框下的模型;

  2. 如果不适用上面的代码或第二个参数 GL_LINE 修改为 GL_FILL,那么插值过程会继续沿着光栅线填充三角形的内部
  • 光栅化不仅可以对像素插值,任何顶点着色器输出的变量和片段着色器输入的变量都可以基于对应的像素进行插值,可以使用该功能生成平滑的颜色渐变,实现真实光照以及许多其他效果

片段着色器

  • 片段着色器用于为光栅化的像素指定颜色

隐藏面消除 Hidden Surface Removal

Z-Buffer 算法

  1. 在每个场景渲染前,深度缓冲区全部初始化为表示最大深度的值
  2. 当像素颜色由片段着色器输出时,计算它到观察者的距离
  3. 如果距离小于深度缓冲区存储的值(对当前像素),那么用当前像素颜色替换颜色缓冲区中的颜色,同时用当前距离替换深度缓冲区中的值,否则抛弃当前像素

数学基础

点积

公式

A·B = ux + vy + wz

glm: dot(vec3, vec3) 或 dot(vec4, vec4);
GLSL: dot(vec3, vec3) 或 dot(vec4, vec4);

  • 点积最重要也是最基本的应用是求 两向量夹角
    A ⋅ B = ∣ A ∣ ∣ B ∣ c o s ( θ ) A·B = \vert A\vert \vert B\vert cos(\theta) AB=ABcos(θ)

c o s ( θ ) = V ⋅ W ∣ V ∣ ⋅ ∣ W ∣ cos(\theta) = {V · W \above{1pt} \vert V \vert · \vert W \vert} cos(θ)=VWVW

点积的用处

  • 求解向量的大小 V ⋅ V \sqrt{V · V} VV
  • 求解两向量是否正交,若正交,则 V·W = 0;正交可视为两个向量相互垂直,因为 c o s ( θ ) = 0 cos(\theta)=0 cos(θ)=0,所以垂直的两个向量点积为0
  • 求解两向量视为平行,若平行,则 V ⋅ W = ∣ V ∣ ⋅ ∣ W ∣ V·W=\vert V\vert ·\vert W\vert VW=VW
  • 求解两向量是否平行但指向相反方向,若满足,则 V ⋅ W = − ∣ V ∣ ∣ W ∣ V·W=-\vert V\vert \vert W\vert VW=VW
  • 求解两向量夹角是否在 ( − 90 °   + 90 ° ) (-90\degree ~+90\degree) (90° +90°) : V ˆ ⋅ W ˆ > 0 \text{\^{V}} · \text{\^{W}}>0 VˆWˆ>0

叉积

glm: cross(vec3, vec3)
GLSL: cross(vec3, vec3)

  • 叉积的重要特性是,它会生成一个新的向量,新的向量垂直于之前两个向量所定义的平面
  • 叉积后所得到的法向量方向遵从 右手定则,即将右手手指从V向W卷曲会使大拇指指向法向量R (注: R = V × W R=V\times W R=V×W)

通过叉积来获得法向量的能力对学习光照部分非常重要
在这里插入图片描述

MV矩阵

(内容来自《计算机图形学编程(使用OpenGL和C++)》3.7节)
假设

  • 相机期望世界位置为 C w = ( C x , C y , C z ) C_w=(C_x, C_y, C_z) Cw=(Cx,Cy,Cz)
  • 点P的世界位置为 P w = ( P x , P y , P z ) P_w=(P_x, P_y, P_z) Pw=(Px,Py,Pz)
  • 需要得到点P在相机空间坐标下的位置 P C = ( P c x , P c y , P c z ) P_C=(P_{cx}, P_{cy}, P_{cz}) PC=(Pcx,Pcy,Pcz)

需要做的变换如下

  1. P w P_w Pw平移,其向量内容为负的期望相机位置,即 − C w -C_w Cw
  2. P w P_w Pw旋转,其角度为负的期望相机旋转欧拉角

我们可以构建一个单一变换矩阵以完成旋转和平移,矩阵叫视图变换矩阵V;矩阵V通过合并矩阵T(包含负相机期望位置的平移矩阵)和R(包含负相机期望旋转的旋转矩阵
P c = R ( T ∗ P w ) → P c = ( R ∗ T ) P w → P c = ( V ∗ P w ) P_c = R(T*P_w) \rightarrow P_c = (R*T)P_w \rightarrow P_c=(V*P_w) Pc=R(TPw)Pc=(RT)PwPc=(VPw)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值