OpenGL超级宝典笔记二 - 基础变换

1、向量:

点乘:float m3dDotProduce3(u,v):返回两个单位向量的余弦值

叉乘:float m3dCrossProduct3(result,u,v):返回垂直于两个向量定义的平面的向量

2、矩阵:

OpenGL使用的是列优先排序的矩阵

单位矩阵(对角线为1,其他为0):任何向量乘以一个单位矩阵都不会发生任何改变

3、变换:最终获得的变换矩阵会应用到每个顶点

视图矩阵x模型矩阵x投影矩阵->投影摄像机的位置变换,物体对象的位置变换,投影裁剪变换

若顶点向量为Vert,则变换公式是:P * MV * Vert

视觉坐标:一个虚拟的固定坐标系,作为参考坐标系使用

视图变换:其实就是照相机在场景中的位置变换,忧郁视图变换会移动当前的工作坐标系,所以视图变换必须在其他模型变换之前

模型变换:场景中的对象的变换,变换的结果与变换的顺序相关

模型视图:就是视图矩阵和 模型矩阵的结合

投影变换:定义了视景体并创建了裁剪平面。

视口变换:剪裁平面和物理窗口的映射过程

4、模型视图矩阵变换的函数:

快速或获取一个单位矩阵:void m3dLoadIdentity44(m)

平移矩阵:void m3dTranslationMatrix44(m,x,y,z)

旋转矩阵:void m3dRotationMatrix44(m,angle,x,y,z):逆时针,弧度,xyz指定各轴上的分量

如果需要按角度选择,可以这样调用m3dRotationMatrix44(m,m3dDegToRad(angle),x,y,z)

缩放矩阵:void m3dScaleMatrix44(m,xScale,yScale,zScale)

矩阵相乘:void m3dMatrixMultiply44(product,a,b)->product = a*b

5、变换管线:

Vert * V : 顶点根据视图转换的矩阵变换,落在新的视图坐标系中

-> * M   : 顶点进行模型变换,落在试图坐标的新位置中

-> * P   : 顶点经过投影剪裁之后,落在新的剪裁坐标中

-> 视口变换: 顶点最终落在Windows视口坐标中

6、矩阵堆栈的使用:GLMatrixStack,初始化时已经在堆栈中包含了单位矩阵

载入单位矩阵:GLMatrixStack::LoadIdentity()

载入任何矩阵:GLMatrixStack::LoadMatrix(m)

任何矩阵乘以栈顶元素并压栈:GLMatrixStack::MultMatrix(m)

获取栈顶矩阵:1.const M3DMatrix44f& GLMatrixStack::GetMatrix()

2.void GLMatrixStack::GetMatrix(m)

压栈:复制当前矩阵(或指定矩阵),压入栈顶

1、GLMatrixStack::PushMatrix()

2、GLMatrixStack::PushMatrix(m)

3、GLMatrixStack::PushMatrix(frame)

出栈:GLMatrixStack::PopMatrix()

栈顶变换:对当前栈顶矩阵进行变换

Rotate(angle,x,y,z)

Translate(x,y,z)

Scale(x,y,z)

7、管线管理:GLGeometryTransform

用于管理顶点变换矩阵堆栈和光照法线矩阵堆栈的一个类

protected:
		M3DMatrix44f	_mModelViewProjection;
		M3DMatrix33f	_mNormalMatrix;

		GLMatrixStack*  _mModelView;
		GLMatrixStack* _mProjection;

用于在渲染的时候将对应的矩阵传递给Shader

8、角色帧和抽象的照相机

角色帧是一个用于代替对象在场景内变换矩阵的一个数据结构:包含空间中的一个位置,一个指向前方的向量,一个指向上方的向量。主要用于照相机对象的变换

class GLFrame{
		protected:
			M3DVector3f vLocation;
			M3DVector3f vUp;
			M3DVector3f vForward;
	}

x列的向量可以通过y和z的叉乘得出,所以不需要存储

GLFrame->Matrix 获取帧的矩阵: GLFrame::GetMatrix(m,bRotationOnly)

照相机:用于管理观察点,为了使用照相机变换,我们使用照相机的角色变换对它进行反转,这样向后移动照相机就相当于向前移动整个场景

3D环境中典型的渲染循环流程:

9、光照变换:光源位置需要转换到视觉坐标系中,所以光源的位置也需要相对于照相机进行变换,再传递给Shader

<span style="white-space:pre">	</span>M3DVector4f vLightPos = {0.0f,10.0f,5.0f,1.0f};
	M3DVector4f vLightEyePos;
	m3dTransformVector4(vLightEyePos,vLightPos,mCamera);
	shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,transformPipline.GetModelViewMatrix(),transformPipline.GetProjectionMatrix(),vLightEyePos,vTorColor);
时间: 2024-10-06 03:13:56

OpenGL超级宝典笔记二 - 基础变换的相关文章

OpenGL超级宝典笔记三 - 基础纹理1

纹理对象的使用:纹理图像数据的类型,图像数据的导入导出方式,纹理的使用过程:图像数据的加载,纹理参数的设置,纹理的绑定. 一.图像数据的分类:位图图像和像素图像 二.像素图像数据的包装: 在OpenGL中:使用4字节的行对齐方式,每一行补全到4的倍数,使用glPixelStorei(pname,param)可以改变或者恢复像素的存储方式 介绍常用的两组:内存<->缓冲区的压缩和解包 glPixcelStorei(GL_UNPACK_ALIGNMENT) ----图像数据从内存到缓冲区的解包设置

OpenGL超级宝典笔记四 - 基础纹理2

一.使用MipMap贴图(主要是应用在纹理缩小过滤中) 优点: 防止当纹理缩小太大的时候,出现闪烁的问题 提高性能,需要缩小的时候就不加载大内存的纹理 缺点: 需要额外的内存作为代价 组成:由一系列缩小的纹理图像组成,子层是父层的1/4 过滤类型:NEAREST快速,LINEAR效果好 GL_NEAREST_MINMAP_NEAREST选择最邻近Mip层并执行邻近过滤 GL_NEAREST_MINMAP_LINEAR选择最Mip层线性插补并执行邻近过滤 GL_LINEAR_MINMAP_NEAR

OpenGL超级宝典笔记一 - 基础渲染

1.渲染中的双缓冲: 使用但缓冲的时候,在渲染每一帧的绘图时,会对画板进行擦除然后在慢慢填充绘制,如果绘制时间过长的时候,就会出现闪烁的现象.为解决这个问题,所以引入双缓冲 双缓冲相当于,在显示的画板中重新创建另外一个画板,绘制的过程在另外的画板进行,绘制完成之后,将显示的画板的内容直接替换成另外一个画板的内容.这样呈现的过程中就不会出现闪烁的问题,即使是绘制的过程比较慢,最多就是出现顿的现象 在例子中渲染的RenderScene()函数中,每次渲染结束之后都会调用glutSwapBuffers

OpenGL超级宝典笔记五 - 基础Shader

1.基本着色器的架构 顶点着色器:接收客户端输入的Attribute属性数据,有些计算后自己用于顶点变换,有些传给片段着色器.除此之外,顶点着色器还接受uniform数据,一般是变换矩阵.最后输出顶点的位置变换值. 片段着色器:接收来自顶点着色器输出的纹理坐标和纹理等属性,另外也接收用于计算光照的光照颜色的uniform值,最后输出像素的颜色值. 2.Shader的变量和数据类型 数据类型:整数(有符号和无符号),浮点数和布尔值..没有指针和字符类型 复合数据类型:向量类型(vec3,ivec3

【转载】OpenGL超级宝典笔记——GLSL语言基础

变量 GLSL的变量命名方式与C语言类似.变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量.当然还有一些GLSL保留的名称是不能够作为变量的名称的. 基本类型 除了布尔型,整型,浮点型基本类型外,GLSL还引入了一些在着色器中经常用到的类型作为基本类型.这些基本类型都可以作为结构体内部的类型.如下表: 类型 描述 void 跟C语言的void类似,表示空类型.作为函数的返回类型,表示这个函数不返回值.

OpenGL超级宝典笔记——深度纹理和阴影 【转】

目录[-] 光源视角 新型的纹理 深度纹理的大小 首先绘制阴影 然后是光照 投影阴影贴图 阴影比较 之前我们介绍过简单的把物体压平到投影平面来制造阴影.但这种阴影方式有其局限性(如投影平面须是平面).在OpenGL1.4引入了一种新的方法阴影贴图来产生阴影. 阴影贴图背后的原理是简单的.我们先把光源的位置当作照相机的位置,我们从这个位置观察物体,我们就知道哪些物体的表面是被照射到(被光源看到) 的,哪些是没有被照射到(被遮挡住)的(在某个方向上离光源最近的表面是被照射的,后面的表面则没有被照射到

OpenGL超级宝典总结(二)2D/3D笛卡尔坐标、坐标裁剪、纹理坐标、MVP转换等概念

如果你想把图形渲染在正确的位置上,那么坐标的设置就很重要了.在OpenGL中,与坐标相关的主要有笛卡尔坐标.坐标裁剪.纹理坐标.MVP(Model View Projection)转换. 1.笛卡尔坐标 在二维绘图中,笛卡尔坐标有一个X轴和一个Y轴组成,X轴为水平方向,Y轴为垂直方向,X和Y相互垂直.如图1.关于正负方向问题,默认如图1上标示,但是我们可以根据实际需求自己定义.(左下角为(0, 0)原点) 图1: 在三维绘图中,笛卡尔坐标多了一个Z轴,Z轴同时垂直于X和Y轴.Z轴的实际意义代表着

OpenGL超级宝典笔记——贝塞尔曲线和曲面(转)

http://my.oschina.net/sweetdark/blog/183721 参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即与y轴的交点坐标).类似地,我们也可以用一个参数方程来表示一条曲线.1962年,法国工程师贝塞尔发明了贝塞尔曲线方程.关于贝塞尔曲线的详细介绍可以参考(维基贝塞尔).这里只介绍OpenGL实现贝塞尔的函数. OpenGl定义一条曲线时,也把它定义为一个曲线方程.我们把这条曲线的参数成为u,它的值域就

OpenGL超级宝典笔记——画三角形(转)

http://my.oschina.net/sweetdark/blog/161002 学习了画线的知识,我们可以使用GL_LINE_LOOP来画闭合的多边形.但是使用这种方式画出来的只有线框,多边形没有填充颜色.OpenGL支持绘制实心的多边形,并使用当前的颜色进行填充. 三角形 简单的三角形,需要指定三个顶点. 1: glBegin(GL_TRIANGLES); 2: glVertex2f(0.0f, 0.0f); // V0 3: glVertex2f(25.0f, 25.0f); //