齐次坐标
就是将一个原本是n维的向量用一个n+1维的向量来表示,目的是合并矩阵运算中的乘法好加法
点P(4,2)的齐次坐标为(8,4,2)、(4,2,1) //注意二者区别
向量P(1,2,3)的齐次坐标为(1,2,3,0)
矩阵变换
vmath::mat4 translate = vmath::translate(1.0, 2.0, 3.0); //平移
vmath::mat4 scale = vmath::scale(0.5); //缩放
vmath::mat4 rotate = vmath::rotate(30, 60, 90); //旋转glUniformMatrix4fv(matrix_loc, 1, GL_FALSE, translate) //将这个矩阵传递给当前的着色程序
投影
透视投影:vmath::frustum(左,右,下,上,近,远) 也可用lookAt(eye, center, up)
正交投影:vmath::ortho(eye, center, up)
剪切
glEnable(GL_CLIP_PLANE0)
gl_ClipDistance[0] = dot(Vertex, Plane); //计算平面方程
transform feedback
重新捕获即将进入图元装配的顶点,再将它们的属性传递到缓存对象中。因为整个图元数据会被捕获到缓存对象中,而我们认为缓存的空间不够,必须丢弃一部分图元,为了确保这一过程,需要transform feedback阶段给出当前的图元类型信息。目的是让应用程序可以获取到渲染流水线上的顶点数据。
glTransformFeedbackVaryings(render_prog, 1, varyings2, GL_INTERLEAVED_ATTRIBS); //配置变量
glGenBuffers(2, vbo);
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, vbo[i]);
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, ...);
glBeginTransformFeedback(GL_POINTS); //开始捕获
glDrawArrays(GL_POINTS, 0, min(point_count, (frame_count >> 3)));
glEndTransformFeedback();
=====================
视口变换:就是决定可视窗口的大小。
视图变换:从不同的位置去观察它。
模型变换:移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。
投影变换:如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。