走样指的是:用离散量表示连续量引起的失真
反走样:为了提高图形的显示质量,需要减少或消除因走样带来的阶梯形或闪烁的效果,用于减少或消除这种效果的方法称为反走样。
反走样技术:
例题
色调(Hue),饱和度(Saturation)和亮度(Value)
RGB的取值通常是0~255的整数。
C = 255 – R
M = 255 – G
Y = 255 – B
查表法:
最可靠方法:
把RGB坐标转换为1931CIE-XYZ系统中的(x, y, Y)坐标
根据(x, y, Y)查找对应表,得到相应的(H, S, V)坐标
逆向操作则可以从HSV坐标转换到RGB坐标
xyY坐标与HSV坐标的对照表已由色度学实验得到[Newhall 1943]
这种方法需要依赖对照表,比较笨重。
数学公式:
RGB与CIE XYZ颜色模型之间转换算法:
CIE XYZ与CIE Lab*颜色模型之间转换算法:
RGB与CIE YUV颜色模型之间转换算法:
BRep是什么:网格表示数据结构
BRep表示的两种类型:拓扑信息(网格之间的关系)、几何信息(网格坐标在哪,大小是多少)
于是诞生了:
即使包含了面、顶点和边的邻接信息,数据结构的大小是固定的(没有使用动态数组)且紧凑的。
纹理是指覆盖在三维模型表面的图像,它给模型增加了颜色和细节,让模型看起来更加真实和复杂。纹理可以是简单的颜色图案,也可以是高度复杂的图片,如照片或者绘画作品。
半边存顶点坐标,法向量、纹理也要存,要存光线、颜色、几何
真实的obj不考
表示简单
可以表示具有任意拓扑的物体
可以表示具有丰富细节的物体
大部分图形硬件支持多边形物体的加速绘制
逼近表示,难以满足交互时放大要求
难以用传统方法修改(编辑)物体外形
缺乏解析表达式,几何属性计算困难
在表示复杂拓扑和具有丰富细节的物体时,数据量庞大,建模、编辑、绘制、存储的负担重
以前都没出过b样条的计算,这次要出b样条的计算
直线的参数方程
初始:(R0,R1,R2,R3)
然后每次选取中间(或者其他比例)的点
例题:
下列有关Bezier曲线性质的叙述语句中,错误的结论为( B )
A Bezier曲线可用其特征多边形来定义;
B Bezier曲线不一定通过其特征多边形的各个顶点;(除了首尾两个控制点外,Bezier曲线不一定通过其特征多边形的其他顶点。)
C Bezier曲线两端点处的切线方向必须与其特征折线集(多边形)的相应两端线段走向一致;
D n次Bezier曲线,在端点处的r阶导数,只与r个相邻点有关。
在两端的节点值重复d次,其他节点是均匀的
https://zhuanlan.zhihu.com/p/561065426
在图中,我们有一个由四个控制点定义的B样条曲线(因为 n=3 ,而控制点的数量总是n+1),并且这个曲线是三次的(因为 k=3)。这里提到的 u 是参数值,它定义了曲线上特定点的位置。
基函数的和在每一个参数值 u 上都是1。这是B样条曲线的一个重要性质,意味着所有基函数的加权和会构成曲线,并且保持曲线的连续性和平滑性。
B-样条曲线具有凸包性和几何不变性。
当曲线的两个端节点的重复度是k+1时
B-样条曲线具有类似于Bézier曲线的性质
端点插值性质
端点导数与控制的起始边与终止边相切
当n=k+1时,B-样条曲线就是一条Bézier曲线
例如,三次(四阶)B-样条,则节点向量
{0,0,0,0,1,1,1,1}
给一个图形,用什么函数来模拟
B样条曲线是NURBS的特殊情形。
NURBS曲线表示圆:
B样条曲线相较于Bézier曲线的优点:
B样条曲线具有局部控制性质。这意味着移动一个控制点只会影响曲线的一小部分,而不是整个曲线。相比之下,贝塞尔曲线的一个控制点的移动可能影响整条曲线的形状。
细分曲面会改两个东西:几何规则(因为点增加了)、拓扑规则(点之间的连接关系变了),其实就是算几何和拓扑之间怎么变
具体怎么细分的不要求大家知道,但要知道有哪些细分方法(Loop族的)
绘制耗时
限制了物体外形的修改
将边界表示和布尔运算结合起来,形成一种界与边界表示和CSG实体表示之间的混合表示
靠记忆
渲染3D场景:每层是干啥的
相机参数:内参、外参
pipeline:每一个步骤是干啥的
将场景中所有物体的顶点放置到一个共享的三维“世界”坐标系统中。
渲染管线中的变换部分:
建模变换(Modeling Transforms):
建模变换是在建立或编辑三维模型时使用的。这些变换决定了模型的位置、旋转、缩放等,可以理解为是在虚拟世界中放置和调整模型的过程。比如,你可以将一座房子模型放在地面上,然后将它缩放到合适大小,或者旋转以面向正确的方向。
"光照计算(Lighting Calculations)"部分是渲染管线中的一个关键环节,它负责对场景中的所有几何图元进行照明处理,以模拟现实世界中的光照效果。
在这个过程中,需要考虑以下几个光照参数:
“Viewing Transform” 即视图变换,其结果是:场景顶点位于3D“视图”或“相机”坐标系统中。
视图变换的步骤包括:
结果:移除视图之外的几何体。
通俗易懂的解释:
在三维图形渲染过程中,裁剪是一个重要的步骤,其目的是移除那些用户在当前视角下看不见的几何体。这样做的好处是可以提高渲染效率,因为不必处理那些最终不会出现在最终图像上的数据。
想象一下你用相机拍照,你的镜头只能捕捉到一定范围内的景象,这个范围就像是一个视野框。在三维渲染中,我们也有一个虚拟的“镜头”,它只能“看到”一定范围内的物体。裁剪的过程就是确定哪些物体在这个视野框内,哪些是在外面。在外面的物体就会被裁剪掉,因为它们无论如何都不会被渲染到最终的图像上。
在技术上,裁剪通常发生在将三维场景转换到二维图像之前的某个点,确保只有那些可能被用户看到的物体才会进入下一步渲染流程。这个过程不仅包括裁剪掉完全在视野外的物体,也可能涉及到将部分位于视野边缘的物体进行适当裁剪,使其与视野边界匹配。
结果:裁剪后顶点的二维屏幕坐标。(三维转为二维)3D到2D的转换过程,它定义了物体在视图平面上的位置和形状。
通俗易懂的解释:
投影变换是三维渲染管线中的一个步骤,它的作用是将三维场景中的物体映射到二维屏幕上。这个过程类似于现实世界中,物体通过光线在我们眼前的幕布上形成影像。
在这个过程中,我们首先需要对三维坐标进行计算,以便它们能正确地反映在二维屏幕上。这涉及到两种主要的投影方式:
在渲染管线中,“光栅化(Rasterize)”负责将投影变换得到的2D图像转换为实际的像素(或点阵图)。并确定哪些像素将被渲染以及如何渲染。
齐次坐标就是n维空间中的物体可以用n+1维坐标空间来表示
作用:矩阵变换的统一表示、防止浮点数溢出
给你一个变换矩阵,你要知道是干啥的,给一个结果,矩阵怎么求?
至多只能有三个主灭点,可以有无数个灭点
从以上结果可以看到:当Y值无限变大时,所有点经过变换后均集中于Y轴上的 1/q 处,于是所有平行于Y轴的直线将延伸相交于此点。 该点( 0,1/q ,0)称为灭点。形成一个灭点的透视称为一点透视。为了取得较好的效果,取 q0 。(让灭点位于Y轴的负半轴上)
投影:是一个矩阵,不是三个矩阵,是用一个矩阵,带入的图形角度不一样,生成的矩阵自然不一样。投影怎么算的,要会。
顶点表示:用多边形的有序顶点序列表示多边形
点阵表示:用位于多边形内部的像素集合来表示多边形
四连通区域:区域内任意两个像素,从一个像素出发,可以通过上、下、左、右四种运动,到达另一个像素
八连通区域:区域内任意两个像素,从一个像素出发,可以通过水平、垂直、正对角线、反对角线八种运动,到达另一个像素
练习题:(ppt上的练习都是要考的)
递归弹出
逐点判断算法:逐个像素判别其是否位于多边形内部
判断一个点是否位于多边形内部:射线法
从当前像素发射一条不经过顶点的射线,计算射线与多边形的交点个数
速度慢:几十万甚至几百万像素的多边形内外判断,大量的求交、乘除运算
没有考虑像素之间的联系
结论:逐点判断算法不可取!
梯形分为两类:多边形内部和多边形外部
结论:两类梯形在多边形内部相间排列(相邻的两个梯形必然有一个位于多边形内部,有一个在多边形外部)
推论:如果上述梯形属于多边形内(外),那么该梯形内所有点的均属于多边形内(外)。
效率提高的根源:逐点判断->区域判断
如果上述交点区间属于多边形内(外),那么该区间内所有点均属于多边形内(外)。
边的连贯性是连接区域连贯性和扫描线连贯性的纽带
扫描线连贯性+边连贯性=区域连贯性
极值点(线都在同一侧)算两个交点
非极值点(线两侧都有)算一个交点
处理非极值点的奇异点:将扫描线上方线段截断一个单位,这样扫描线就只与多边形有一个交点。
算法的数据结构与实现
分类的边表(ET)
例子:
极值点的处理:
了解这两种消隐不同的特性:图像空间、对象空间,算法特点、与什么相关的
受分辨率限制
时间复杂度 O(nN):
适合于精密的CAD工程领域
复杂度 O(n2):
(2D投影空间中操作,与其他的消隐算法的不同)
首先绘制最远的部分,然后逐渐绘制更靠近观察者的部分。通过这种方式,后绘制的物体会遮挡之前绘制的物体,从而解决了对象间的遮挡关系。
给大家一个c-buffer(颜色缓冲区)和一个z-buffer,给大家几个面片,要把最后的c-buffer和z-buffer都填充出来
1.第一步初始化。Zbuffer的每个像素初始化为正无穷。Cbuffer每个像素初始化为0
2.计算第一个多边形
[0,7,5]的意思是,x为0,y为7(从左下角到右上角,第一格为0),赋值为5
这里的赋值是递增的
不考:re-cosin
课堂练习:如何计算z值
缺点:(面片多的时候效率低)
位于正侧:左节点先的中序遍历
位于负侧:右节点先的中序遍历
有哪些加速状况?
按行逐像素处理屏幕,计算每一行上哪些像素是可见的。这种方法适用于多边形基的渲染。
就把phong模型记下来,每个参数什么意思 漫反射光是物体表面对入射光线朝各个方向的均匀反射。 对屏幕上每一像素,执行下述4个步骤: 求交不考 它不仅考虑到光源的光照,而且考虑到场景中各物体之间彼此反射的影响,因此显示效果十分逼真。 反走样处理方法: 为复杂的几何形状创建一个简单的外部容器或"盒子",这个盒子通常是矩形或正方形(二维情况下)或长方体(三维情况下)。在光线跟踪时,首先检测光线是否与这个简单的盒子相交。如果光线与盒子不相交,那么就可以确定光线也不可能与盒子内部的复杂几何形状相交,从而无需进行进一步计算。如果光线与盒子相交,才进行更详细的交点计算。这样就可以快速排除很多不可能的情况,只对有可能相交的光线进行详尽的交点计算。 这种技术将整个场景划分为许多小区域,并对每个区域内的对象进行管理。当光线穿过场景时,只需检查光线所经过的具体小区域内的对象,而不是场景中的每一个对象。这大大减少了需要检查的对象数量,提高了效率。当场景中的物体非常密集时,这种方法尤其有效。 纹理(texture)通常指物体的表面细节 欠采样问题。无论是纹理过小还是过大,在纹理采样时坐标之间的无法一一映射。 前置滤波方法 用区域均值作为一个点的采样值。 将屏幕像素P的四个角点分别映射到纹理空间,得到四个纹理像素值 预处理: 借助低精度模型和一个法向纹理,获得高精度模型的绘制效果 基本思想是:用纹理去修改物体的法向而不是颜色。改变物体表面接受光线的方式,但不改变物体的实际形状。 依据与表面上点所对应的纹理值,沿表面法向偏移该点的几何位置 辐射度算法就是:把场景细分到很细很细的面片(如1个像素那么大的三角形),分别计算它们接受和发出的光能,然后逐次递归,直到每个面片的光能数据不再变化(或者到一定的阀值)为止.因此,计算量很大(要计算很多次),而且难以并行(因为递归) 第一辐射光强。尽管我曾说过我们应该认为光源和普通物体是一样的,但场景中显然要有光发出的源头。在真实世界中,一些物体会辐射出光线,但有些不会。并且所有的物体会吸收某些波段的光。我们必须有某种方法区分出场景中那些能够辐射光线的物体。我们在辐射度算法中通过辐射光强来表述这一点 。我们认为,所有的面片都会辐射出光强,然而大多数面片辐射出的光强为0 。 均匀化网格分割。将场景分割为均匀大小的网格。 本影就是不被任何光源所照到的区域。 (失败+1,成功不变?) LOD是以固定分辨率离线创建的 优点: View-dependent LOD 解决了大物体渲染的问题 Hierarchical LOD 可以解决小物体渲染的问题 采用类似于三角形带或三角形扇这样的复合结构,将把处理与传输m个三角形的代价从3m个顶点降到(m+2)个顶点
A 深度缓存算法(Z-Buffer):这是实时渲染中常用的方法,因为它为每个像素独立执行,适合并行处理。每个像素的深度值被存储在Z缓冲区,并与新像素的深度值进行比较,以确定哪个像素在前面,因此不需要对整个场景的面片进行排序。
B 扫描线消隐算法:这种方法适用于将面片投影到屏幕上,并在每一条扫描线上确定哪些部分是可见的。虽然这种方法比深度排序算法快,但在面片数量非常大时,它通常比Z-Buffer算法慢,因为它需要处理和排序每条扫描线上的交点。
C 深度排序算法(画家算法):这种方法需要将所有面片按照它们离观察者的远近进行排序,然后从最远到最近绘制。在面片数量非常大时,排序过程本身就非常耗时,所以这是三者中最慢的方法
用时:C
第九章:真实感图形_光照与明暗
光照明模型
泛光模型:
Lambert漫反射模型:
大小只与入射光的光亮度和入射方向有关
与漫反射光的反射方向无关
phong镜面反射模型:(重点)
Blinn-Phong模型:
Whitted模型:
基础的明暗处理模型:
Flat Shading:
Gouraud Shading:怎么做明暗的,双线差值
缺点:生成曲面体真实感图形效果差
计算量比phong shading小Phong Shading :直接差值法向
改进的phong算法:
第九章:真实感图形_光线跟踪
建立光线树:
光线跟踪算法原理:
Step1:从视点出发通过该像素中心向场景发出一条光线R,并求出R与场景中物体的全部交点;获得离视点最近交点P;并依据局部光照明模型计算P处颜色值Ic (光线投射)
Step2:在P处沿着R镜面反射方向和透射方向各衍生一条光线
若点P所在表面非镜面或不透明体,则无需衍生出相应光线
Step3:分别对衍生出的光线递归地执行前面步骤,计算来自镜面反射和透射方向上周围环境对点P光亮度的贡献Is和It
Step4:依据Whitted光照明模型即可计算出点P处的光亮度,并将计算出的光亮度赋给该像素光线跟踪递归过程终止条件:
光线跟踪算法的伪语言描述:
main ( ) //主函数
{
for(需要计算颜色的每一像素pixel) {
确定通过视点V和像素pixel的光线R;
depth = 0; // 递归深度
ratio = 1.0; //当前光线的衰减系数,1.0表示无衰减
// color是经计算后返回的颜色值
RayTrace(R, ratio, depth, color);
置当前像素pixel的颜色为color;
}
}
RayTrace(R, ratio, depth, color) //说明:光线跟踪子函数
{
if(ratio < THRESHOLD) { //终止条件2
置color为黑色;
return;
}
if(depth > MAXDEPTH) { //终止条件3
置color为黑色;
return;
}
光线R与场景中的所有物体求交。若存在交点,找出离R起始点最近的交点P;
if(交点不存在) { //终止条件1
置color为黑色;
return;
}
用局部光照明模型计算交点P处的颜色值,并将其存入local_color;
依照Whitted模型合成最终的颜色值,即:
color = local_color + ks*reflected_color + kt*transmitted_color;
return;
}
小结:光线跟踪中的四类光线:
光线跟踪方法的优缺点:
有消隐功能:采用光线跟踪方法,在显示的同时,自动完成消隐功能。
有影子效果:光线跟踪能完成影子的显示,
该算法具有并行性质:每条光线的处理过程相同,结果彼此独立,因此可以大并行处理的硬件上快速实现光线跟踪算法。反走样:
引起走样的原因:光线跟踪算法本质上是对画面的点采样
超采样:超采样是一种直接而有效的方法,它通过在一个像素内部取多个样本点,计算这些样本点的颜色值,然后将这些颜色值平均化以得到最终的像素颜色。简单来说,就是以比屏幕分辨率更高的分辨率来渲染图像,然后将这个高分辨率的图像缩小以适应屏幕分辨率,这样每个像素的颜色都是由多个更小单元的颜色混合而成,从而减少了锯齿效果。
自适应超采样:只在图像中那些可能出现走样的区域(例如边缘)进行超采样处理,而不是对整个图像进行超采样。它会先检测图像的哪些部分可能产生走样,然后只对这些部分进行多个样本的颜色值计算和平均化处理。加速光线跟踪的技术:
包围盒技术:
空间分割技术:
包含阴影计算的Phong模型:
第九章:真实感图形_纹理映射
纹理分类:
根据定义域:
根据纹理的表现形式:
如何映射:
纹理扫描:
像素次序扫描:
像素次序扫描将一个像素映射到物体表面一个区域,再投影到纹理数据的一个区域获得具体的颜色数据。具体的运算就是前面已经讲过的投影变换,坐标系变换,因此这里不再详述映射过程。
“将一个像素映射到物体表面一个区域”这句话描述的是纹理映射过程中的一个步骤,即确定屏幕上的一个像素点在3D物体的表面上对应的具体区域。纹理反走样:
原因:
常用纹理反走样方法:
超采样方法
Mipmap方法前置滤波方法:
确定屏幕像素P上可见的景物表面区域A
将区域A直接映射到纹理空间区域T
取区域T内的所有纹理像素颜色值的平均作为景物表面区域A的平均纹理颜色
代入光照明模型,计算出像素P应显示的光亮度值超采样方法:
将上述四个纹理颜色值取平均作为像素P所对应的可见表面区域的纹理颜色。
缺点:计算量太大、内存占用多Mipmap方法:
生成一个由不同分辨率图像构成的纹理图像序列
从原始纹理图像出发,生成一个其分辨率为原始图像1/4的新的纹理图像版本
新版本中的每一个像素值取为原始图像中相对应的四个像素颜色值的平均
类似地基于所得到的新纹理图像版本生成一个更低分辨率的、尺寸更小的纹理图像版本
这一过程一直持续到最后生成的纹理图像仅包含一个像素为止
[图片]
映射阶段:
屏幕上的每一像素内的可见表面区域被映射到原始纹理图像上的一块区域。
估计该区域所覆盖的原始纹理图像中像素的个数并以此作为选取适当分辨度的纹理图像版本的一种测度。
从预先构造的纹理图像序列中找出其压缩率最接近当前纹理像素与屏幕像素比率的两个纹理图像。
在相邻分辨率的两纹理图像上计算当前屏幕像素映射点的纹理颜色值。
根据两纹理图像对原始图像的压缩率在所得到的两个纹理颜色值间取加权平均,作为当前屏幕像素可见表面区域的颜色值。三维/几何纹理:怎么做的,什么效果
法向映射:
先计算高精度模型的法向,将其保存在法向纹理中,再将法向纹理映射到低精度模型上进行光照计算凹凸映射:
物体表面的几何法向保持不变,我们仅仅改变光照明模型计算中的法向。位移映射:
能产生很强的深度感
计算代价大(与凹凸映射、法向映射相比)第九章:真实感图形_辐射度方法
辐射度系统方程:方程组怎么建立,怎么求解
辐射度计算中的几个定义。
这个面片的属性称为辐射光强(Emmision) 。这里一个面片的表面的辐射光强等于面片的辐射度值乘以面片面积。
第二反射率。当光线击中表面时,一些光线被吸收并且转化为热能,剩下的则被反射开去。我们称反射出去的光强比例为反射率(Reflectance) 。
第三入射和出射光强。在每一次遍历的过程中,记录另外两个东西是有必要的: 有多少光强抵达一个面片,
有多少光强因反射而离开面片。我们把它们称为入射光强和出射光强。出射光强是面片对外表现的属性。当我们观看某个面片时,其实是面片的出射光被我们看见了。
示例:
辐射度算法:网格怎么分割,形状因子怎么算(掌握理念)
辐射度算法:表面分割
改进:自适应网格化辐射度算法:形状因子计算
辐射度算法:方程求解
辐射度算法
第九章:真实感图形_阴影
本影和半影:
半影是指只有部分光线到达的区域
Depth Pass算法计算shadow volume count:
z-pass问题:
先后渲染阴影体的正面和背面,视线经过正面时深度测试通过则模板值 加1,经过背面时深度测试通过则模板值减1。
最后模板值不为0的片元就在阴影体中。
但是,z-pass算法的致命缺点是当视点在阴影中时,得到的模板值会导致错误的结果。
先后渲染阴影体的背面和正面,视线经过背面时深度测试失败则模板值 加1,经过正面时深度测试失败则模板值减1。
这样一来,即使在阴影体中,也能得到正确的模板值。与前者正好相反。也叫Carmack’s Reverse(Carmack给Mark Kilgard的mail中提出的)
但是,该算法还需要一个闭合的volume,并且令前后的两边都为背面。这样也就增加了计算量,因此应根据实际情况来选择算法。zfail怎么写:
我们分辨看物体位于shadow volum 中和外时通过zfail计算的stencil值。为了方便这里我们对两个vlolum进行了编号1和2。假设物体位于A处,那么先对后面进行检测,第1个volume后面检测失败stencil加1,为1.第2个volume后面检测失败加1,stencil为2.然后检查前面,第一个volume检测成功,stencil值不变。第二个volume检测失败,stencil减1.最终stencil值为1.
这里看下物体C。由于物体C的深度值位于volume1和2的后面。因此volume1和2的后面和前面深度检测均成功,stencil值不变为0
一个简单方法:画出视线与光线的交点,只看在位置A后面的视线,若交点是与背后相交,则标为+1,若与正面相交,则标为-1,然后统计就可以了。第十章:实时绘制加速技术
基本问题:了解LOD(简化远处)
离散LOD:
优点:
缺点:大型对象的问题连续LOD:
更好的粒度->更好的保真度
LOD是精确计算的,而不是从几个预先创建的选项中选择的
因此,对象使用的多边形不超过所需数量,这将为其他对象释放多边形
最终结果:更好的资源利用率,导致更好的整体保真度/多边形
更好的粒度->平滑过渡
在传统LOD之间切换会引入视觉“冲击”效果
连续LOD可以逐步增量调整细节,减少视觉冲击View-Dependent LOD:
Hierarchical LOD:
网络压缩传输技术
如果应用程序的瓶颈为填充率时,很难使用这种方法提高系统性能
填充率:每秒可填充的像素数量