渲染 管线
https://blog.csdn.net/jxw167/article/details/54695181
渲染管线主要分为四个步骤:顶点变换,图元装配,光栅化,像素处理。
顶点处理:
顶点渲染的作用是对三维图元的顶点进行坐标变换和光照计算,生成可用于渲染到投影空间的顶点坐标、颜色和纹理坐标。顶点渲染就是定义了一系列针对顶点的渲染指令或渲染语句,当Direct3D处理图元顶点时,自动使用这些渲染指令或者渲染语句对每一个顶点逐一进行处理,完成顶点数据的处理工作。
像素处理:
对每个像素的颜色斤西瓜混合纹理采样,包括迭代颜色和纹理坐标、纹理采样以及将纹理采样与灯光和材质的颜色进行混合。比如:Alpha测试、深度测试、模版测试、计算每个像素的雾化值、Alpha混合等。
管线定义为数据序列并用于处理元素。渲染管线主要由以下阶段构成,即顶点处理、光栅化过程、片元处理过程以及输出合并操作。
渲染管线流程
https://blog.csdn.net/limu693992297/article/details/52605479
关于渲染管线将什么呢?无非就是在OpenGL的管道当中各个部分的功能以及如何在管道当中形成了我们想要的最终的一幅图.(像素).而管线当中的操作可分为以下几个部分:
阶段1. 指定几何对象
如:点 线 三角形.等一些几何图元…OpenGL绘制几何图元的方法有以下三种:
- 一次一个顶点.即使用glBegin() glVertex() glEnd() 指定几何对象.
- 使用顶点数组…如glDrawArrays.glDrawElements.等.一次性的绘制大量图元.
上面这两种模式则是立即模式.即指定完图元之后会被立即渲染.即将所有数据发往渲染管线后立即被渲染. - 显示列表模式.它存储于OpenGL服务端 (接收OpenGL命令的一端.) glNewList glEndList glCallList .
阶段2. 顶点处理操作:
不管以上的几何对象是如何指定的,所有的几何数据都将会经过这个阶段,这个阶段负责的则是逐个顶点的操作.
在这个阶段能做的工作则是:
- 顶点变换…根据模型视图和投影矩阵变换
- 光照计算 法线变换(法线矩阵 是模型矩阵的左上角3*3的逆矩阵)和法线规格化
- 纹理坐标变换.(纹理矩阵)
4.材质状态 纹理坐标生成?
而最重要的则是变换以及光照. 每个顶点在这个阶段分别是单独处理的.
这个阶段所接收到的数据则是每个顶点的属性特征…输出则是变换后的顶点数据.
阶段3. 图元组装
在顶点处理之后,顶点的全部属性都已经被确定 在这个阶段顶点将会根据应用程序送往的图元规则.
GL_POINTS GL_TRIANGLES 等 将会被组装成图元
阶段4 图元处理(裁剪 消隐)
- 这个步骤第一个所做的应当是裁剪操作…会将图元与用户定义的裁剪平面 即glClipPlane 和模型投影矩阵所建立的视景比较. 这将会裁剪且丢弃位于视景和裁剪平面外部的图元.不在予以处理.
- 其次.若是采用透视投影 那么.将会对每个顶点的x,y z坐标分别除以w.
- 紧接着 则是由视口变换将顶点坐标变换至窗口坐标.
- 执行消隐操作
阶段5 栅格化操作
- 由图元处理传递过来的图元数据.在此将会被分解成更小的单元并对应帧缓冲区的各个像素.这些单元被称之为 片元. 一个片元可能包含窗口左边 深度 颜色 纹理坐标等属性.
- 片元的属性则是图元上顶点数据等经过插值而确定的…这里生成的片元将会包含主颜色和次颜色.
glShadeMode() 函数的作用将会这里体现.即使用插值(平滑着色) 或者使用最后一个顶点颜色(平面着色) - 点宽 线宽.多边形模式,正面背面等一些特征也将是这阶段发生作用.
- 反走样也是这个阶段起作用.
阶段6 片元处理
- 上纹理 通过纹理坐标取得纹理内存中相对应的颜色
- 雾化 通过片元距离当前视点位置修改颜色.
- 颜色汇总…(这个与混合完全不同概念.将(纹理,主定义的颜色,雾化的颜色,次颜色光照阶段计算的颜色)汇总一起.
阶段7 逐个片元的操作
- 所有的一些测试 像素所有权 剪切(glScissor) Alpha测试(glAlphaFunc) 模版测试(glStencilFunc)
深度测试 (glDephtFunc) 混合(glBlendFunc)
这些操作将会最后影响其在帧缓冲区的颜色值.
阶段8 帧缓冲操作
-
这个阶段执行帧缓冲的写入等操作等…最后产生了显示出来的像素.
glColorMask glStrncilMask glDepthMask glClearDepht glClearStencil glClearColor 等.将在这个阶段影响写入的值.
以上只是讨论OpenGL 图元绘制的基本过程 那么基于像素图像绘制.几乎形同之上…只是在光栅化处理前的操作不一样.即经过像素解码 像素传输.栅格化 最后形成片元…片元之后的处理完全一样…
光栅化:把点线面构成的图形变成像素图片。
alpha测试:符合条件的像素显示出来,不符合的丢掉
摄像机模型与标定——三个坐标系及其之间关系
图像坐标系、相机坐标系、世界坐标系。
世界坐标系:平移向量t和旋转矩阵R可以用来表示相机坐标系与世界坐标系的关系。
- 物体坐标系(本地坐标系)Local Space 或 Model Space
- 世界坐标系 World Space
- 观察者坐标系(摄像机坐标系) View Space
- 裁剪空间 Clipping Space
- 屏幕空间 Screen Space
其中前四个矩阵之间,主要通过model, view, projection矩阵进行相关的变换, 裁剪空间到屏幕空间通过视口变换进行;前三个是三维空间,后面两个是二维空间。
射线与平面的相交检测(Ray-Plane intersection test)
射线:p = p0+tu
平面:n·(p-p1)=0
联立得 t = (n·p1-n·p0)/n·u
若t >= 0, 则射线与平面相交,且交点为p0 + tu,若t < 0,则不相交。(注意这里,n不可约去,因为做的是点积,而不是普通乘法)
unity3d中碰撞器和触发器的区别
C#知识点
C#委托
委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。委托(Delegate)特别用于实现事件和回调方法。
C#匿名方法
委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法。
匿名方法(Anonymous methods) 提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。
在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。
四维坐标
在3D数学中,齐次坐标就是将原本3维的向量(x,y,z)用4维向量(wx,wy,wz,w)来表示。引入齐次坐标的主要有如下目的:
1、可更好地区分向量和点。在三维空间中, (x,y,z)既可以表示点也可以表示分量,不便于区分,如果引入齐次坐标,则可以使用(x,y,z,1)来表示坐标点,使用(x,y,z,0)来表示向量。
2、统—用矩阵乘法表示平移、旋转、缩放变换。如果使用3×3的矩阵,矩阵乘法只能表示旋转和缩放变换,无法表示平移变换。而在4D齐次空间中,可以使用4×4的齐次矩阵来统一表示平移、旋转、缩放变换。
3、当分量w=0时可以用来表示无穷远的点。
避免万向节锁的现象(欧拉旋转)
z缓冲器
https://blog.csdn.net/Jurbo/article/details/75007260
当我们观察空间任何一个不透明的物体时,只能看到该物体朝向我们的那些表面,其余的表面由于被物体所遮挡我们看不到。把可见的和不可见的线都画出来,对视觉会造成多义性。要消除这种二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面,简称为消隐。
先将 Z 缓冲器中各单元的初始置设置为最小值。当要改变某个像素的颜色值时,首先检查当前多边形的深度值是否大于该像素原来的深度值(保存在该像素所对应的Z 缓冲器的单元中)。如果大于原来的 Z 值,说明当前多边形更靠近观察点,用它的颜色替换像素原来的颜色。
A*算法
https://zh.wikipedia.org/wiki/A*搜尋演算法
https://blog.csdn.net/hitwhylz/article/details/23089415
A*搜索算法,俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或网络游戏的BOT的移动计算上。
该算法综合了Best-First Search和Dijkstra算法的优点:在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径(基于评估函数)。
在此算法中,如果以 {\displaystyle g(n)} g(n)表示从起点到任意顶点 {\displaystyle n} n的实际距离, {\displaystyle h(n)} h(n)表示任意顶点 {\displaystyle n} n到目标顶点的估算距离(根据所采用的评估函数的不同而变化),那么A*算法的估算函数为:
{\displaystyle f(n)=g(n)+h(n)} {\displaystyle f(n)=g(n)+h(n)}
这个公式遵循以下特性:
如果 {\displaystyle g(n)} g(n)为0,即只计算任意顶点 {\displaystyle n} n到目标的评估函数 {\displaystyle h(n)} h(n),而不计算起点到顶点 {\displaystyle n} n的距离,则算法转化为使用贪心策略的Best-First Search,速度最快,但可能得不出最优解;
如果 {\displaystyle h(n)} h(n)不高于顶点 {\displaystyle n} n到目标顶点的实际距离,则一定可以求出最优解,而且 {\displaystyle h(n)} h(n)越小,需要计算的节点越多,算法效率越低,常见的评估函数有——欧几里得距离、曼哈顿距离、切比雪夫距离;
如果 {\displaystyle h(n)} h(n)为0,即只需求出起点到任意顶点 {\displaystyle n} n的最短路径 {\displaystyle g(n)} g(n),而不计算任何评估函数 {\displaystyle h(n)} h(n),则转化为单源最短路径问题,即Dijkstra算法,此时需要计算最多的定点;