take back something from lost……
好记性不如烂笔头……
GLSL中的Uniform变量?
uniform变量是外部程序传递给shader的变量,因此在vfshader中不可以修改uniform变量,类似于c语言中的const变量。
openGL中有几种缓冲?作用分别是什么?
帧缓冲 Frame Buffer:(颜色缓存、模板缓存、深度缓存)
顶点缓存:用于缓存顶点数据
元素缓冲:用于缓存顶点序号数据
空间变换矩阵为什么是四阶的?如何构造?
根据矩阵和向量的运算特性,三阶矩阵只能实现缩放和其次空间旋转,所以需要额外的一行一列来实现平移操作。
//如何构造?
旋转物体的三种方式分别是什么?都有什么优缺点?
https://blog.csdn.net/zhaotianyu950323/article/details/79955805
矩阵旋转、欧拉角旋转、四元数
矩阵旋转
优点: 旋转轴可以使任意向量;
缺点: 旋转其实只需要知道一个向量 + 一个角度, 一共4个值的信息,但矩阵却使用了16个元素;
而且在做乘法操作时也会增加计算量,造成了空间和时间上的一些浪费;
欧拉旋转
优点: 很容易理解,形象直观;表示更方便,只需要3个值(分别对应x,y,zx,y,z轴的旋转角度);但依照其他博主的理解,她还是转换到了3个 3*3的矩阵变换,效率不如四元数;
缺点: 之前提到过这种方法是要按照一个固定的坐标轴的顺序旋转的,因此不同的顺序会造成不同的结果;
会造成万向节锁(Gimbal Lock) 现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上,欧拉选择可以靠这种顺序让一个物体指到任何一个想要的方向, 但如果在旋转中不幸让某些坐标轴重合了就会发生万向节锁,这时候就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转(当然还是按照原先的顺序)都不可能得到某些想要的旋转效果,除非我们打破原先的旋转顺序或者同时旋转3个坐标轴。这里有个欧拉旋转可以直观的理解下;
由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;
四元数旋转
优点: 可以避免万向节锁现象;
只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高;
可以提供平滑插值;
缺点: 比欧拉选择稍微复杂了一点点,因为多了一个维度;
理解更困难,不直观
什么是万向锁?
见上一条。。。
什么是多级渐进纹理?对于游戏优化有什么作用?
多级渐变纹理,是对一张目标纹理进行减精度采样,生成分辨率逐渐降低的纹理序列。
没有mipmap的问题:
(以下回答来自知乎etnlGD的回答:https://www.zhihu.com/question/66993945?sort=created)
在不使用mipmap的情况下使用高精度贴图,性能损失主要在于texture cache会很难命中,因为相邻pixel采样的texel都是空间不连续的,对cache非常不友好,因此会造成远处平面像素的闪点。
此时,一个pixel像素对应问题上的很多纹素,那么如何来从多个texel中得到该像素的颜色值?
不管一个pixel覆盖多少个texel,point采样1个,bi-linear采样4个,tri-linear采样8个,anisotropic则可能会采样更多。mipmap就是为了解决1个像素覆盖很多个texel的情况,相当于离线计算好1个pixel覆盖多个texel的结果,存在mipmap中。mipmap1是1个覆盖4个,mipmap2是1个覆盖16个······
正面作用:
mipmap提供了预处理好的多重采样数据,主要目的是改善平面渲染中的表现,同时也提高了纹理采样时的命中率。
反面作用:
提前生成的贴图序列会占用纹理总内存33%的额外内存
什么是四元数(quaternion)?
https://blog.csdn.net/candycat1992/article/details/41254799