本片笔记记录来自视频:http://gad.qq.com/content/coursedetail/7169132
1.shade处理流程
shade就执行一个函数叫VS(Vertex Shade),顶点处理的对象是顶点
1.投影
顶点坐标变了,比如从(11.2, 11.5, -29)变成(2.0,3.0),投影完成空间坐标系.变换的过程叫投影. 简单说, 就是站在世界的位置看四个点顶点,变成从相机的角度看四个顶点. gpu是并行处理这4个顶点,这是硬件决定.顶点VS函数处理的源是单个模型的点,一个函数处理只有一个顶点,这里会并行执行4次VS函数.
2.图源装配
处理的单元由顶点变成了三角形,三角形是光栅化(把对象变成屏幕像素的过程)的最小单元,这个过程是不可见的,gpu自动完成,使用索引把每三个点组成一个三角形.
a.图源装配数据结构 ,把点连接成三角形的过程,光栅化的操作,是以三角形作为基本单元.
3.光栅化
当得到最小单元三角形,具体怎么去填充它的像素,目标是把顶点数据位图化,从四个顶点变成200 * 200个像素,等待后边填充颜色值.
光栅化的意义: 因为模型(三角形)在屏幕上出现的大小不一定,光栅化就是在最终确定这个模型,在屏幕上到底占多少个像素,是实时计算的。
光栅化,以三角形作为基本的处理单元,填充像素,模型都是用三角形组成的。是一个把顶点组成的线段,数据位图化的过程。是一个有损处理的过程。
把一个矢量的效果,变成一个位图的效果, 上图可以看出锯齿产生的原因,
光栅化另外一个任务是顶点的属性做插值,包括位置坐标,UV, 顶点色等;
UV概念
UV是贴图的XY 坐标,如UV = (0.5,0.6) , 左上角位原点。 原理如刺绣框差不多,我们只要显示绣布在框里面的部分,为了显示纹理具体的内容定位用的.
4.像素(片段)片段
shade就执行一个函数叫PS(Pixel Shader)
像素处理的过程也是并行,PS函数处理的源是光栅化后的单个像素点,一个函数只处理一个像素点,一次绘制要执行200*200次的PS函数,这个次数会随着这个模型光栅化最后的结果变化。
但是顶点处理函数VS的次数是确定的4次.
TexMain:贴图
texcoord就是UV值
贴图转位图颜色值最主要代码 tex2D
Vetex(顶点)函数的输入就是原始顶点信息。
Vetex函数的输出是Pixel(像素)函数的输入
Pixel(像素)函数的输出就是颜色值 float4(r,g,b,a)
顶点shader处理的源是模型的顶点, 输入投影后的变换的顶点, 像素shade处理源是顶点shade处理完成的顶点,经过了光栅化插值后产生的像素点,它具有顶点的所有属性,并且是经过插值了的;
马赛克原理
每个像素的UV的取值范围是[0.01.0]先把这个值扩大100倍值为[0.0100];
有些数值是9.45,9.87,0.35;
再把UV通过Floor的方法取整,就会得到9,9,10,再把UV缩小100倍,0.09,0.09,0.1
CPU的限制:始终是单线程的一个像素一个像素的在处理;
GPU的Core直接是硬件的多线程;
实现阴影
从光源方向添加一个摄像机,把场景渲染一遍。生成一张Shadow的RenterTexture,记录的是从光源摄像机出现每一个位置最近的像素的深度值;
在最终的渲染里,当前像素的在光源摄像机空间的深度值和shadowmap中里光源最近的的深度值作比较,大于就所以,当前像素在阴影中;
像素溢出
全屏泛光-影响到模型本身之外的像素
模糊
.2顶点处理的公式
是对模型上单独一个点进行一次函数运算
输入参数: 模型上每一个点相对于模型原点的世界坐标(Pos(3D))
输出参数:在最终完成投影后的屏幕坐标(Pos(proj)).
Vert参数结构体
提到顶点UV,Mesh结构
Pos(proj) = MVP x Pos(3D)
公式变现的意思就是,模型的顶点要经过矩阵和点的乘法的数学运算,就能变成投影后的点。
MVP分辨是三个不同的三个矩阵
一个模型在3D空间的变换分为三种,旋转,缩放,位移。任何一种变换可以由这三种结合而成。数学的表达方式为一个数学结构,Matrix(矩阵)4*4个float组成。
M(模型原点在整个世界坐标系的变换矩阵)
不是简单的坐标相加,要考虑缩放,旋转,位移。数字表达就是位移。Matrix
V(世界坐标上的一个点,到摄像机(View)坐标系的变化矩阵)
P(摄像机坐标下的投影变换矩阵,就是挤压的过程)
最简单的VS代码就是1行,它包含了整个顶点变换的过程。
MVP的应用
广告牌(Billboard),原理:我有一个模型,无论怎样都让它对着屏幕,对着摄像机,摄像机一走它也跟着走,实现代码如下
3D渲染投影到底是怎么做?
每一个3D的点到2D的点的过程,处理的基本单元是点。
透视投影的表现,空间上同样大小的事情,越远离投影面越小,和显示表现的一直,比如所一段铁轨,与正交投影相对。(tous)
模型上每一个点都会进行投影操作,投影完成之后,每个点的Z分量会归一化[0.0 ~ 1.0]。Z分量数值越小,越靠近投影面,渲染时会遮挡数值比较大比它大的。渲染会自动完成这个遮挡。
景深图(投影后的Z分量来制作景深.)
3. 像素处理
为什么要使用shader
Directx9之前是固定渲染管线,只有基本的变换,变换的过程,几乎不能参与,Shader是可以编程的渲染管线
为什么要用GPU来处理顶点?
GPU和CPU的硬件架构决定,显存和内存是分开的,手机硬件也一样,渲染终究在GPU进行。