OpenGL笔记-4.基础变化

抗锯齿

   抗锯齿是混合的一个实际用法,先说下锯齿,再说抗锯齿,一般来说是照片或者游戏就会有锯齿,但是当分辨率足够大的照片或者贴图在相对小的取景框(或者说屏幕,或者界面),则锯齿就看起来不明显,相反的话就会很严重,在严重的情况下就需要抗锯齿了,但是抗锯齿只能减轻锯齿效果,不可能完全解决问题,所以叫抗锯齿,不是解决锯齿

   首先说锯齿是怎么产生的,如果一张图是2k的,刚好显示在2k的屏幕上, 每一个像素点都有对应的颜色,所以一点都不会失真,但如果放到4k屏来显示就会有一点点失真了,原因是因为对应的像素点没有内容了,所以都会用白色或者其它颜色来填充,抗锯齿的原理就是把两个像素的边缘混合一下,就使得过渡没有那么的突兀,不是直接显示的内种

   开启代码也十分简单

   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  

   glEnable(GL_BLEND);  //开启混合

   glEnable(GL_POINT_SMOOTH);   //对点进行平滑处理

   glEnable(GL_LINE_SMOOTH);   //对线进行平滑处理

   glEnable(GL_POLYGON_SMOOTH);  //对多边形进行平滑处理

   关闭代码为对应的glDisable

   但其实通过看原理就知道这个破玩意儿在点线还好,处理多边形可能就有一点麻烦,因为一般来说多边形都是多个图元组成的,每个图元都处理,就有一点麻烦了,所以一般多边形都是多重采样

   上面的混合操作也包含了多重采样GL_ONE_MINUS_SRC_ALPHA这个就是,代码很简单,glEnable(GLUT_MULTISAMPLE);和对应的disable来关闭,值得注意的是,需要在glut的初始化代码里面加入GLUT_MULTISAMPLE

矩阵和向量

   先说向量,比如一个点在笛卡尔坐标系里面,是x,y或者在三维里面是x,y,z,那么它对应的原点就有一个向量,这个向量就有了三个值,方向(角度),位置(坐标)和长度(数量),而一般长度为1的就叫标准向量,这个过程叫标准化

   在OpenGL里面的函数对应为,typedef float M3DVector3f[3];是一个一位数组,也是个三维向量,一般使用的话这个值是[x,y,z,x1,y1,z1...]这种类型,或者typedef float M3DVector4f[4];这种除了在(x,y,z)的基础上加一个w,w可以表示颜色,准确说是一个属性,该点的某个属性

   向多个标准向量之间就一定会有点乘,俗话所说的夹角inline float m3dGetAngleBetweenVectors3(const M3DVector3f u, const M3DVector3f v),函数是这样,返回的结果是一个弧度并不是角度值,转角度值也挺容易就是这个值V 除以π乘以180 比如代码(v3 / M3D_PI * 180),值得注意的是这里只能处理单位向量!!!!

    叉乘   点乘得到夹角,叉乘则会得到一个同时垂直于两个向量的第三个向量,或者说垂直于这两个向量所属平面的第三个向量,也不需要自己算,有函数 

inline void m3dCrossProduct3(M3DVector3f result, const M3DVector3f u, const M3DVector3f v)

{

result[0] = u[1]*v[2] - v[1]*u[2];

result[1] = -u[0]*v[2] + v[0]*u[2];

result[2] = u[0]*v[1] - v[0]*u[1];

}直接写好了,其中需要自己定义一个空的M3DVector3f,作为接受者,然后定义两个向量算出点乘,这里并不需要单位向量,并且U ,V的位置不可颠倒,否则就是另一个方向的向量了,这里并不需要一定是单位向量

矩阵在OpenGL中的作用

      投影 说矩阵之前先说说投影,投影是啥,常见理解就是把一个内容投影到一个屏幕,或者把一个画面通过某种方式放到另一个画面上,比如拿3D来说,创建的是x,y,z的三个坐标系,理论上是个3D的,但手机是个2d平面,这是没法显示的,而把3D图形转换到手机平面上显示的这一功能就叫投影,比如平面投影,就是直接把3d效果进行2D化,然后显示,并没有太多其它操作,再比如透视投影,在2D化的基础上,加了远近大小的概念,使得3D图形更加立体逼真

      视图,就是照相机的位置,或者说观察者的位置,注意不是看屏幕的时候眼睛的位置,可能这个观察者在设置上就是平时看屏幕的位置,但实际你偏一下脑袋观察者的位置也不会变,并且整个视图是可以变化的,比如有时候看见模型移动,实际上是视图在移动,模型没变

      模型 场景中移动或者变化的物体就是模型  

      模型视图 描述视图和模型的变化,比如旋转啊平移啊, 那两者变化可以是物体变化,也可以是观察者,也就是视图的变化

      哔哔了这么多和矩阵有个球关系啊,上面不管是投影还是视图,还是模型还是模型视图,都提到了个很重要的词,叫做变化,平移也算变化,旋转也算变化,这个变化是怎么来的,然后透视投影里边儿,z值大的物体会显示的比较小,这一系列的变化,究竟肿么完成的,随便举个例子吧比如一个物体的所有图元的顶点都用[x,y,z,w]来表示,那么我要将这个图形所有值x轴移动x/2的距离,y,z和w不变,那么将它上面所有的顶点乘以一个这样的矩阵$$ \begin{matrix} 0.5 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \tag{1} $$,那么所有的x值都会减少0.5,也就是完成了变化里面的平移操作,这个就是单x轴的平移如果是旋转的话就需要设计映射了,就不会是随手写的矩阵了,但一般都是4*4的矩阵,只是取值会更复杂一些,值得注意的一点是:在数学表达式上面,矩阵一般都是这样表示的$$ \begin{matrix} A1 & A2 & A3 \\ A4 & A5 & A6 \\ A7 & A8 & A9 \end{matrix} \tag{1} $$,但是在计算机里边儿却不是,而是竖直表示的$$ \begin{matrix} A1 & A4 & A7 \\ A2 & A5 & A8 \\ A3 & A6 & A9 \end{matrix} \tag{1} $$,这是因为计算机里面还是用线性的一维数组来表示矩阵的,比如[x,y,z]矩阵乘以一个上述矩阵,那么先相乘的是x*A1 + y*A4 + Z*A7,所以如果用常规的数学方式表示,那么计算效率会大大的降低,既然都用OpenGL来写图形了当然是考虑到了性能的问题,否则直接用图片的帧动画不就完了么

OpenGL的矩阵和矩阵运算的代码实现

     M3DVector4f v44;   //创建一个4*4的矩阵

    m3dLoadIdentity44(v44);   //把4*4的矩阵加载成单元矩阵(单元矩阵就是相乘不会产生变化的矩阵)

inline void m3dTranslationMatrix44(M3DMatrix44f m, float x, float y, float z)这是个平移代码,其中m是需要平移的矩阵,x,y,z为偏移量

void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z); 这个是旋转代码,x,y,z表示是否旋转一般是传1或者0,而angle是弧度,不是角度,比如旋转60度 (60/180 * π)就是弧度了

inline void m3dScaleVector4(M3DVector4f v, const float scale) { v[0] *= scale; v[1] *= scale; v[2] *= scale; v[3] *= scale; } 缩放源码挺简单的,就是把传入的矩阵所有值都进行缩放

正投影和透视投影

   要说正投影和透视投影有啥区别就真没啥好说的,主要就是在3D图形上边,正投影比较平面,3D失真厉害,透视则很3D,后续单独写篇笔记吧,比较复杂   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值