计算机图形学 | 奇妙的真实感——片元着色

Android上基于HSV颜色模型实现取色盘功能 HSV色彩空间 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。 色调H 用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°; 饱和度S 饱和度S表示颜色接近光谱色的程度。一种颜 阅读详情

华中科技大学《计算机图形学》课程

MOOC地址:计算机图形学(HUST)

计算机图形学 | 奇妙的真实感——片元着色

9.1 图形渲染与视觉外观

图形渲染的光栅化阶段

光栅化阶段:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

片元着色器:

在这里插入图片描述

片元操作:

在这里插入图片描述

基于视觉外观的渲染

视觉物理现象

视觉感知的物理过程:

  • 太阳光与其他光源(天然或人造光)发出光
  • 光与场景中的物体相互作用,部分被吸收
  • 部分散射开来,向新的方向传播
  • 最终,光被人眼感知
视觉现象

详情见于9.2节:奇妙的颜色。

光照计算

详情见于9.3节:光照明模型。

  • 不同的物体表面材质
  • 不同的光源
  • 更复杂的情况:物体甚至可能是透明或者半透明的
  • 更复杂的情况:物体之间还有相互作用
着色方式

详情见于9.3节:光照明模型。

  • 平滑着色(Flat shading):简单来讲,就是一个三角面用同一个颜色。
  • 高洛德着色(Gouraud shading):每顶点求值后的线性插值结果通常称为高洛德着色。
  • 冯氏着色(Phong shading):冯氏着色是对着色方程进行完全的像素颜色求值。
表面细节

详情见于9.4节:让人头疼的纹理。

纹理决定了表面细节。

  • 颜色纹理
  • 几何纹理
有光有影才有真实感

详情见于9.5节:加入阴影会怎样?

9.2 奇妙的颜色

什么是颜色

美国光学学会(Optical Society of America)的色度学委员会曾把颜色定义为:颜色是除了空间的和时间的不均匀性以外的光的一种特性,即光的辐射能刺激规网膜而引起观察者通过规觉而获得的景象。

我国国家标准GB5698-85,颜色的定义为:颜色是光作用于人眼引起除形象以外的规觉特性。

英国科学家牛顿在1666年发现,太阳光经三棱镜折射后投射到白色屏幕上,显现出一条象彩虹一样美丽的彩色光带(称为光谱,spectrum),证明了白光是所有不同波长可见光的组合。

色散现象:

  • 不同波长折射系数不同
  • 折射后投影在屏上的位置也不同
可见光谱

人眼能看到的光波为波长约380-780纳米的光波。

在这里插入图片描述

人们色彩感觉形成的四大要素:

  • 光源
  • 彩色物体
  • 眼睛
  • 大脑

其中,光源辐射和物体反射属于物理学范畴,眼睛和大脑是生理学研究的内容。

颜色视觉的生理基础

在这里插入图片描述

颜色视觉原理(Color Vision Theory):

  • Young -Helmholtz的三原色学说
  • Hering的对立颜色学说(四色学说)
  • 阶段学说

Young -Helmholtz的三原色学说

在人眼规网膜上存在感受红、绿、蓝色的锥状细胞,分别对红、绿、蓝三种光最敏感。

一切颜色特性都由这些锥状体的响应量比例来表示。

三者共同作用,使人产生不同的颜色感觉。

在这里插入图片描述

Hering的对立颜色学说(四色学说)

由视觉现象总结出的规律。

在人眼视网膜上存在三组对立规素:红-绿、黄-蓝、白-黑。

所有的颜色特性都由这三组对立颜色的响应量比例来表示,绿和黄—蓝两组对立颜色响应值的组合决定其色调,黑—白响应值决定其亮度。

在这里插入图片描述

阶段学说

在这里插入图片描述

人眼视觉现象

颜色辨别

人眼能分辨100多种颜色,对490nm的青绿色和590nm的橙黄色的光波变化最敏感,在可见光谱的两端最不敏感。

颜色对比

相邻区域的不同颜色相互影响,是由是规觉暂留效应引起的。

视觉暂留:规觉暂留效应即规觉暂停现象(Persistence of vision,Visual staying phenomenon,duration of vision)又称“余晖效应”,1824年由英国伦敦大学教授皮特‘马克’罗葛特在他的研究报告《移动物体的规觉暂留现象》中最先提出。

颜色对比的分类:

  • 同时对比:对比区域的颜色不同,效果不同。
  • 继时对比:当看了一种色彩再看一种色彩时,会把前一种色彩的补色加到后一种色彩上。
  • 边界对比:当亮度发生跃变时,可看到有一种边缘增强的感觉。明度高的越高,明度低的越低;越接近边界线,影响越强烈,这也叫做马赫带效应(Mach Band Effect)。
  • 色相对比:互补色、同类色、对比色、邻近色。
  • 明度对比:因明度差异形成的对比,同一明度的色彩,在白底上显得暗,而在黑色背景上却显得更亮。
  • 纯度对比:在纯度低的背景色上的会显得鲜艳一些,在纯度高的背景色上会显得灰浊。
颜色错觉

同化现象

当配色的色相、明度接近时,同化现象的效果越明显。

色彩的醒目性

在这里插入图片描述

交通标志上醒目的配色:

在这里插入图片描述

色彩的进退

在这里插入图片描述

色彩的冷暖

在这里插入图片描述

色彩的胀缩

在这里插入图片描述

色彩的软硬

在这里插入图片描述

色彩的情绪

在这里插入图片描述

颜色的表示

颜色纺锤体(颜色锥体)

在这里插入图片描述

颜色视觉模型:颜色三特性的空间表示

  • 明度(亮度):垂直轴线表示白黑亮度变化
  • 色调:水平圆周上的不同角度点,代表了不同色调的颜色
  • 饱和度:从圆心向圆周过渡表示,同一色调下饱和度的提高。某个平面圆形上的色调和饱和度不同,而明度(亮度)相同。
CIE色度图

CIE(Commission Internationale de L‘Eclairage):国际照明委员会,根据其法语名称简写为CIE。

在这里插入图片描述

CIE 1931色度图是用标称值表示的CIE色度图。其中,x表示红色分量,y表示绿色分量,E点代表白光,它的坐标为(0.33,0.33),边界上的数字表示光谱色的波长。

所有单色光都位于舌形曲线上,这条曲线就是单色轨迹,曲线旁标注的数字是单色(或称光谱色)光的波长值;而自然界中各种实际颜色都位于这条闭合曲线内。

颜色模型

  • RGB颜色模型
  • CMY颜色模型
  • HSV颜色模型
  • HSL颜色模型

其中,RGB颜色模型和CMY颜色模型面向设备,HSV颜色模型和HSL颜色模型面向用户。

RGB颜色模型

采用三维直角坐标系,R-Red G-Green B-Blue。

  • 构成一个RGB颜色立方体
  • 通常使用于彩色光栅图形显示设备中
  • 真实感图形学中的主要的颜色模型

在这里插入图片描述

CMY颜色模型

以红、绿、蓝的补色青(Cyan)、品红(Magenta)、黄(Yellow)为原色构成的颜色模型。

  • 常用于从白光中滤去某种颜色,又被称为减性原色系统,在白色中减去某种颜色来定义一种颜色
  • 用于印刷行业中

在这里插入图片描述

HSV颜色模型

HSV(HSB)颜色模型:一个基于颜色六边形的六棱锥。

在这里插入图片描述

归纳的要点如下:

  • H(Hue):色调,用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算
  • S(Saturation):饱和度,表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色不白色混合的结果。通常取值范围为0%~100%,值越大,颜色越饱和。光谱色的白光成分为0,饱和度达到最高。
  • V(Value或Brightness):明度,表示颜色明亮的程度。

HSV模型对应画家的配色的方法:

  • 在一种纯色中加入白色以改变色浓(白色越多S越小)
  • 加入黑色以改变色深(黑色越多V越小)
  • 同时加入不同比例的白色,黑色即可得到不同色调的颜色

应用:调色板

在这里插入图片描述

HSL颜色模型

HSL(HSI)颜色模型:

  • H(Hue):色调,使用不水平轴之间的角度来表示,范围从0o到360o,从蓝色开始
  • S(Saturation):饱和度,说明颜色的相对浓度
  • L(Lightness)或者I(Intensity):亮度,在L=0处为黑色,在L=1处为白色,灰度沿着L轴分布

在这里插入图片描述

采用近似的圆柱坐标系:

  • S=1,L=0.5 纯色彩
  • S=0 仅有灰度
颜色模型间的相互转换

在这里插入图片描述

OpenGL中的颜色

两种颜色存储方式:

  • 颜色值:像素点附加颜色信息之后,就必须为每一个像素点额外分配一个内存空间保存该点的颜色信息,对于RGB或者RGBA颜色模式,保存的数据直接代表其颜色值。
  • 颜色索引:对于颜色索引模式,保存的是该颜色在颜色索引表中的位置,通过查颜色索引表对应到相应的颜色。颜色索引模式的优点是占用空间小,运行速度快,缺点是显示效果稍差。

随着硬件的提速升级,目前一般采用直接存储颜色值的方式。

RGB颜色模式

RGB模式中,RGB分别表示红绿蓝三色的分量。

每个分量在0.0~1.0之间。

通过设置RGB不同的比例,可以获得任意的颜色

RGB三个分量不颜色的对照:

在这里插入图片描述

RGBA颜色模式

RGBA模式中:

  • RGB分别表示红绿蓝三色的分量
  • A(实际上是α系数,Alpha Coeefficient)表示颜色的透明度

通过设置RGBA不同的值,可以获得任意的颜色。

在这里插入图片描述

OpenGL一般采用RGBA颜色模式。

颜色混合(Color Blending

当A(实际上是α系数,Alpha Coeefficient)不为1.0f,即颜色有一定透明度时,可以进行颜色混合。

RGBA源颜色值(Rs,Gs,Bs,As),RGBA目标颜色值(Rd,Gd,Bd,Ad),源调和因子(Sr,Sg,Sb,Sa),目标调和因子(Dr,Dg,Db,Da)。

新的调和颜色计算:SrRs+DrRd,SgGs+DgGd,SbBs+DbBd,SaAs+DaAd。

在这里插入图片描述

HDR(High-Dynamic Range,高动态范围图像)

特点:

  • RGBA分量都是在0.0f到1.0f之间。

  • 记录大范围的颜色值,再向0~1之间映射。

决定颜色值的因素
  • 颜色
  • 光照
  • 材质
  • 纹理
  • 遮挡
  • 透明

9.3 光照明模型

光照模型的发展

1967年,Wylie等人第一次在显示物体时加迚光照效果,认为光强不距离成反比。

1970年,Bouknight提出第一个光反射模型:Lambert 漫反射+环境光。

1971年,Gouraud提出漫反射模型加插值的思想。

1975年,Phong提出图形学中第一个有影响的光照明模型。

Phong模型

简单光照明模型模拟物体表面对光的反射作用。

特点:

  • 光源为点光源
  • 反射作用分为:环境光(Ambient Light)、漫反射(Diffuse Reflection)、镜面反射(Specular Reflection)。

在这里插入图片描述

环境光(Ambient Light)

在没有光源的地方,景物没有受到光源的直接照射,但其表面仍具有一定的亮度,使它们可见。这是因为光线在场景中经过复杂的传播之后,形成了弥漫于整个空间的光线,称为环境光。

  • 环境光是指光源间接对物体的影响
  • 光在物体和环境之间多次反射,最终达到平衡
  • 同一环境下的环境光光强分布均匀
  • 近似表示:Ie=Ia∙Ka。其中,Ia为环境光强度,Ka为物体对环境光的反射系数
理想漫反射和镜面反射相关的点光源

点光源是位于空间某个位置的一个点,向周围所有的方向上辐射等光强的光,记其光强为Ip。

在点光源的照射下,物体表面的不同部分亮度不同,亮度的大小依赖于它的朝向以及它不点光源之间的距离。

在这里插入图片描述

理想漫反射(Diffuse Reflection)

在一个粗糙的、无光泽的表面呈现为漫反射。当光线照射到这样的表面上时,光线沿各个方向都作相同的反射,所以从任何角度去看这种表面都有相同的亮度。

漫反射的特点:光源来自一个方向,反射光均匀地射向各个方向,不视点无关。

由 Lambert 余弦定律,漫反射光强为Id=IpKd×cosθ。

其中,Ip是入射光的强度,Kd是不物体有关的漫反射系数,0< Kd <1,θ是L和N的夹角0≤θ≤π/2L是P点指向光源的方向矢量N是物体表面在P点的法矢量。

在这里插入图片描述

多个点光源(m个):

在这里插入图片描述

镜面反射(Specular Reflection)

镜面反射遵循反射定律,反射光位于表面法矢的两侧。

对于理想的高光泽度反射面,反射角等于入射角时候,光线才会被反射。这时,如果观察者正好处在P点的镜面反射方向上,就会看到一个比周围亮得多的一个高光点。

在这里插入图片描述

非理想的反射面,只要其表面是光滑的,在点光源的照射下,也会产生一块特别亮的区域,称为高光点。尽管这时镜面反射光的强度会随α角的增加而急剧地减少,但观察者还是可以在α角很小的情况下接受到这种改变了方向的一部分镜面反射光。

在这里插入图片描述

多个点光源(m个点光源):

在这里插入图片描述

综合表示

假定只有一个光源,Phong光照明模型的综合表述:由物体表面上一点P反射到规点的光强I为环境光的反射光强Ie、理想漫反射光强Id和镜面反射光强Is的总和。

I=IaKa+IpKd(L∙N)+IpKs(R∙V)n

在这里插入图片描述

Phong模型的实现

公式:I=IaKa+IpKd(L∙N)+IpKs(R∙V)n

近似处理

为了减少计算量,假设:

  • 光源在无穷远处,L为常向量
  • 视点在无穷远处,V为常向量
  • H为L不V的二分向量H=(L+V)/2
  • 用(H•N)近似(R•V)

在这里插入图片描述

节省计算时间的原因:

  1. 在L和V为常量,对所有的点只需计算一次H的值
  2. H的计算比R的计算简单

在这里插入图片描述

近似计算后的高光区域更大:

在这里插入图片描述

多个光源(m个点光源)

光强计算假定只有一个点光源,若在场景中有m个点光源,则可以在任一P点上叠加各个光源所产生的光照效果:

在这里插入图片描述

光的衰减

在同一光源的照射下,距光源比较近的景物看起来会亮一些,而距光源较远的景物看起来会暗一些,这是因为光在传播的过程中,其能量会収生衰减。

令距离为d,最简单的衰减因子为1/d2。d很小时,1/d2产生过大的强度变化;d很大时,1/d2变化太小。

实际上采用一个不d相关的函数:

在这里插入图片描述

于是:

在这里插入图片描述

Phong光照明模型的RGB颜色模型形式

假定选择RGB颜色模型:

在这里插入图片描述

RGB公式:

在这里插入图片描述

如何消除或者减弱马赫带效应?

方法一:多边形细分

在这里插入图片描述

方法二:明暗处理

典型方法:Gouraud明暗处理

多边形内部各点颜色的计算:对顶点颜色双线性插值。

在这里插入图片描述

典型方法:Phong明暗处理

多边形内部各点法矢量的获得:对顶点法矢量双线性插值

在这里插入图片描述

Phong明暗处理效果好于Gouraud明暗处理,但是计算量也更大。

在这里插入图片描述

OpenGL中的实现

基于Phong模型模拟平行光、点光源和聚光灯效果:

平行光

平行光:不加衰减因子。

无穷远处照射过来可以看作是平行光而且没有衰减。

代码实现:

// 计算定向光
vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir)
{
	if(!light.on) {
	return vec3(0.0);
	}
	// 漫反射
	vec3 lightDir = normalize(-light.direction);
	float diff = max(dot(normal, lightDir), 0.0);
	// 镜面反射
	vec3 reflectDir = reflect(-lightDir, normal);
	float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
	// 在漫反射光下物体颜色
	vec3 diffuseColor = vec3(material.diffuse);
	// 计算环境光,漫反射光和镜面光
	vec3 ambient = light.ambient * diffuseColor;
	vec3 diffuse = light.diffuse * diff * diffuseColor;
	vec3 specular = light.specular * spec * vec3(material.specular);
	return ambient + diffuse + specular;
}
点光源

点光源:保留衰减因子。

有穷远处照射过来,有衰减。

代码实现:

// 距离和衰减
float d = length(light.position -fragPos);// 距离
float attenuation = 1.0 / (light.c + light.l * d + light.q * d * d);// 衰减

......

// 可以实现距离越近就会越亮,距离越远就越暗的效果
return (ambient + diffuse + specular) * attenuation;
聚光灯

聚光灯:光锥的内圆锥和外圆锥。

代码实现:

// 聚光强度
float theta = dot(lightDir, normalize(-light.direction));
float epsilon = light.cutOff -light.outerCutOff;
// 这里为了使聚光效果看起来边缘更加圆滑,我们需要模拟聚光有一个内圆锥和外圆锥,通过内外圆锥之间的余弦值差来计算聚光强度(intensity),clamp函数把聚光强度约束在了[0,1]之间。
float intensity = clamp((theta -light.outerCutOff) / epsilon, 0.0, 1.0);

......

// 漫反射和镜面反射需要乘以聚光强度
return (ambient + (diffuse + specular) * intensity) * attenuation;

全局光照

全局光照的概念

定义:全局光照(Global Illumination,简称GI), 或被称为 Indirect Illumination,间接光照。

全局光照 = 直接光照 + 间接光照

Whitted光透射模型

Whitted光透射模型 = Phong模型 + 透射光强 + 反射光强(对其余物体反射光的反射)

在这里插入图片描述

光照明模型的发展:

在这里插入图片描述

光线追踪算法

全局光照的主要算法流派:

  • Ray tracing 光线追踪;
  • Path tracing 路径追踪;
  • Photon mapping 光子映射;
  • Point Based Global Illumilation 基于点的全局光照;
  • Voxel-based Global Illumilation 基于体素的全局光照;
  • Ambient occlusion 环境光遮蔽;

而其中的每种流派,又可以划分为多种改进和衍生算法,有些又相互关联。如路径追踪,就是基于光线追踪,结合了蒙特卡洛方法而成的一种新的派系。

在这里插入图片描述

光线投射

光线投射(Ray Casting),作为光线追踪算法中的第一步,其理念起源于1968 年,由 Arthur Appel 在一篇名为《Some techniques for shading machine rendering of solids》的文章中提出。具体思路:从每一个像素射出一条射线,然后找到最接近的物体挡住射线的路径,而视平面上每个像素的颜色取决于从可见光表面产生的亮度。

加上光线追踪

1979 年,Turner Whitted 在光线投射的基础上,加入光不物体表面的交互,让光线在物体表面沿着反射、折射等方式上继续传播,直到不光源相交。

这一方法后来也被称为经典光线跟踪方法、递归式光线追踪(Recursive Ray Tracing)方法,或Whitted-style 光线跟踪方法。

光线追踪的定义:追踪光线路径,然后模拟光线不虚拟对象相互作用的方式。主要思想:从视点向成像平面上的像素发射光线,找到不该光线相交的最近物体的交点

  • 如果该点处的表面是漫反射表面,则计算光源直接照射该点产生的颜色
  • 如果该点处表面是镜面或折射面,则继续向反射或折射方向跟踪另一条光线如此递归下去,直到达到结束条件(光线不光源相交、逃逸出场景或者达到设定的最大递归深度)。

光线追踪过程

如果该点处的表面是漫反射表面,则计算光源直接照射该点产生的颜色。

如果该点处表面是镜面或折射面,则继续向反射或折射方向跟踪另一条光线。

结束条件

  • 到光源
  • 逃逸出场景
  • 递归到一定深度

存在的问题

传统的逆向光线追踪算法有两个突出的缺点:

  1. 表面属性的单一:完全看不见折射光?完全没有镜面反射?
  2. 不考虑漫反射:漫反射成为结束条件

改进方法

通过模型的修正来缓解这两个问题,将一个表面的属性认为可以是混合的。

比如:它有20%的成分是镜面反射,30%的成分是折射,50%的成分是漫反射折射。

改进后算法变为:从视点发出一条光线,光线与物体表面相交时根据表面的材质属性继续采样一个方向。

改进后的新问题:计算量很大。

解决办法:蒙特卡罗方法。通过概率理论,进行近似简化。

衍生出路径追踪

路径追踪的定义:为光线追踪的衍生技术,同样是追踪光线路径,但是一种引入了蒙特卡洛方法的全局光照技术。

路径追踪 = 光线追踪 + 蒙特卡洛方法

效果演示

光线追踪:

在这里插入图片描述

路径追踪:

在这里插入图片描述

全局光照:

在这里插入图片描述

9.4 让人头疼的纹理

纹理的概念

用简单光照明模型生成真实感图象,由亍表面过亍光滑单调,反而显得不真实。现实物体表面有各种表面细节,这些细节就叫纹理。

纹理:体现物体表面的细节。

纹理类型:

  • 颜色纹理:物体表面(平面戒者曲面)花纹、图案
  • 几何纹理:基于物体表面的微观几何形状

纹理的定义和映射

生成纹理的一般方法,是预先定义纹理模式,然后建立物体表面的点与纹理模式的点之间的对应。

当物体表面的可见点确定之后,以纹理模式的对应点参与光照模型进行计算,就可把纹理模式附到物体表面上。这种方法称为纹理映射(Texture Mapping)。

在这里插入图片描述

纹理模式定义:

  • 图象纹理:将二维纹理图案映射到三维物体表面,绘制物体表面上一点时,采用相应的纹理图案中相应点的颜色值。
  • 函数纹理:用数学函数定义简单的二维纹理图案,如方格地毯。戒用数学函数定义随机高度场,生成表面粗糙纹理即几何纹理。

在这里插入图片描述

纹理映射:

  • 建立纹理与三维物体之间的对应关系
  • 扰动法向量

在这里插入图片描述

纹理模式定义方法:纹理空间。

纹理定义在纹理空间上的函数,纹理空间通常是一个单位正方形区域 0 ≤u ≤ 1,0≤ v ≤1之上。

在这里插入图片描述

纹理映射方法:建立物体空间表面和纹理空间之间的对应关系。

根据物体空间的表面坐标(x,y,z)计算其纹理空间坐标(u,v)值,对物体表面坐标(x,y,z)用u、v进行参数化,然后反求出参数u、v用物体表面坐标(x,y,z)的表达,根据纹理空间定义的纹理(u,v)得到该处的纹理值,并用此值取代光照明模型中的相应项,实现纹理映射。

实例:圆柱面映射

假定有一个半径为r,高为h的圆柱。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

基于OpenGL的颜色纹理

纹理映射的一般方法:

  • 设置纹理属性加载纹理生成纹理
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

  • 加载纹理
    unsigned char *data = stbi_load(“res/texture/contain.jpg”, &width, &height, &nrchannels, 0);

  • 生成纹理
    glGenTextures(1, &texture1);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

  • 绑定纹理
    glBindTexture(GL_TEXTURE_2D, texture1);

立方体贴图

立方体贴图包含6个2D纹理,每个2D纹理是一个立方体(cube)的一个面。

几何纹理的概念及算法

几何纹理方法:对物体表面几何性质作微小扰动,产生凹凸不平的细节效果,给物体表面图象加上一个粗糙的外观。

物体表面上的每一个点P(u,v),都沿该点处的法向量方向位移F(u,v)个单位长度,新表面位置:P’(u,v) = P(u,v) + F(u,v) * N(u,v)。

在这里插入图片描述

几何纹理算法:

年代算法思想
1978Bump Mapping(凹凸贴图)计算顶点光强时,不是直接使用原始法向量,而是加上一个扰动
1984Displacement Mapping(移位贴图)直接作用于顶点,根据DisplacementMapping中相对应的像素值,使顶点沿法向移动,产生真正的凹凸表面(除了移位贴图以外,表面并没有变得真正的凹凸不平)
1996Normal Mapping(法线贴图)通过height map获得法向量信息,而且对应的RGB值表示法向量的XYZ,利用这个信息计算光强,产生凹凸阴影的效果
2001Parallax Mapping(视差贴图)通过视线和height map的计算,陡峭的视角就给顶点更多的位移,平缓的就给较小的位移,通过视差获得更强的立体感
2005Relief Mapping(浮雕贴图)更精确地找出观察者视线与高度的交点,实现更精确的位移

从Phong模型可见,法向量N不同,光照计算结果就不同。

光强计算假定只有一个点光源,若在场景中有m个点光源,则可以在任一P点上叠加各个光源所产生的光照效果:

在这里插入图片描述

法线贴图

现实中的物体表面并非是平坦的,而是表现出无数(凹凸不平的)细节。

每个fragment 使用了自己的法线,我们就可以让光照相信一个表面由很多微小的(垂直于法线向量的)平面所组成,物体表面的细节将会得到极大提升。这种每个 fragment 使用各自的法线,替代一个面上所有 fragment 使用同一个法线的技术叫做法线贴图。

问题一:height map的使用

高度图

高度图上存储的是RGB值,但每个颜色通道实际上是表面的法线坐标:

  • R红色通道对应x方向
  • G绿色通道对应y方向
  • B蓝色通道对应z方向

通过height map获得法向量信息,即对应的RGB值表示法向量的XYZ,利用这个信息计算光强,产生凹凸阴影的效果。

在这里插入图片描述

问题二:切线空间的引入

一个平面上顶点的法向量方向会根据height map取值

多个不同朝向的平面呢?需要将相对于某个平面的法向量变换到全局中!

每个平面都有一个自己的切线空间:

在这里插入图片描述

TBN矩阵的计算:

在这里插入图片描述

基于OpenGL的法线贴图

在OpenGL中的实现TBN矩阵:

在这里插入图片描述

三维计算机图形学L-System实验项目实战 想象一下,植物的生长就像写一篇不断自我修改的文章。一开始只有一句话(比如“向前走一步”),然后每过一段时间,文章里的每个词都按照某种语法规则被替换成新的句子。这个过程重复几十次后,原本简单的句子就变成了一部结构复杂的“小说”——而这本小说的内容,恰好描述了一棵树的完整形态。这就是L-System 的本质:一个并行重写系统。它的形式化定义其实很简洁:别被公式吓到,我们来拆解一下:$ V $:符号集合,比如F表示前进,表示左转; 阅读详情

相关推荐

基于OpenGL的3D室内场景建模与碰撞检测实战

判断是否碰撞只需检查三轴区间是否重叠:从一条简单的顶点着色器开始,到完整的光照系统、纹理映射、天空盒与碰撞检测,我们走过了一段完整的OpenGL学习之旅。这套技术体系不仅适用于室内场景,更是几乎所有3D应用的基础骨架。未来的方向还有很多:PBR材质、阴影映射、后期处理、GPU粒子系统……但万变不离其宗,掌握好这些核心概念,你就拥有了打开虚拟世界大门的钥匙。现在,是时候动手实践了——毕竟,最好的学习方式,就是亲手渲染出属于你的第一缕阳光。🌅本文还有配套的精品资源,点击获取。

weixin_36122351的博客 731

华科_图形学笔记_09_奇妙的真实感_片元着色01_01

计算机图形学_华中科技大学_中国大学MOOC(慕课) 9.1_图形渲染与视觉外观 提纲 图形渲染的光栅化阶段 一个在精准的线框模型也不可能有真实感。 这里每个三角形的面片叫做一个片元fragment 我们,需要对这个三角形进行片元着色,也就是计算出三角形内部所有像素的颜色值, 只有这样,这个模型才可能最终获得真实感。 其实片元着色是光栅化阶段的第三步 之前的三角形设定和遍历是由gpu根据屏幕映射的结果自动完成的。 显然,接下来的片元着色的工作就十分

精密时空设计局 810

告别CMake依赖!在Visual Studio 2022中直接配置VTK 9.4开发环境(附完整项目示例)

本文详细介绍了如何在Visual Studio 2022中直接配置VTK 9.4开发环境,无需依赖CMake。通过图文教程和完整项目示例,帮助C++开发者快速集成VTK库,简化开发流程,提升工作效率。特别适合科学可视化任务的开发者。

weixin_26804345的博客 416

Unity Shader学习之片元着色器

本文详细介绍了Unity Shader中的片元着色器(Fragment Shader)的核心概念、功能实现及应用案例。片元着色器作为渲染管线的关键阶段,负责像素最终颜色的计算,通过纹理采样、光照计算、颜色混合和特效等功能实现丰富的视觉效果。文章深入解析了5个典型案例:灰度化效果基于加权平均计算亮度;漫反射光照模型实现基础明暗;波浪纹理通过噪声扰动创造动画;边缘发光利用视角法线夹角检测轮廓;溶解效果借助噪声纹理控制消失过程。这些案例展示了片元着色器在图像处理、光照模拟、动态效果等方面的强大能力,为开发者提供了

tiankongdeyige的博客 1399

告别环境配置噩梦:用Docker Desktop + WSL2在Windows上5分钟搞定vLLM运行环境

本文详细介绍了如何在Windows系统上使用Docker Desktop和WSL2快速搭建vLLM开发环境,5分钟内完成配置。通过容器化技术解决传统环境配置中的依赖冲突、环境污染等问题,提供一键复用的高效方案,特别适合AI开发者快速部署和测试vLLM框架。

weixin_28728495的博客 503

AAC编解码器在实时通信中的性能对比与应用选择

本文深入分析了AAC编解码器在实时通信中的性能优化,重点对比了faac、faad2与fdk-aac三大开源方案在WebRTC场景下的表现。通过实测数据揭示其在延迟、音质和资源消耗等关键指标的差异,并提供场景化选型建议与调优技巧,帮助开发者提升实时音视频通信质量。

weixin_29210727的博客 391

图形学理论 光照模型

  光照模型   1. Lambert模型   理想漫反射模型,各个方向一样。 2.Phong(1975)[1]                             经验模型,R和V的夹角决定镜面高光的强度。   3.Blinn-Phong(1977)[2]         引入了半角向量的概念,对Phong模型进行了改进,镜面高光由n和h的夹角决定。   4....

weixin_33769207的博客 516

为R720安装iDRAC Service Module

这玩意找了好久资料, 教程都不咋靠谱, 要不就是有不理解的地方 所以直接一路莽着过河: 去官网找到设备对应的驱动程序: 几个查找筛选项看图 官网链接: https://www.dell.com/support/home/zh-cn/product-support/product/poweredge-r720/drivers 在下方的列表中找到对应系统版本的驱动并下载: 由于安装的系统为ESXi 6.5 U2 Dell定制版, 这里没有刚好的驱动, 所以下了个兼容的: 下载好后是一个压缩包:

Janus 6363

OpenGL学习之颜色

一、颜色的表示 颜色纺锤体(颜色锥体) 颜色的视觉模型:颜色三特性的空间表示 明度(亮度):垂直轴线表示黑白亮度变化 色调:水平圆周上的不同角度点,代表了不同色调的颜色 饱和度:从圆心向圆周过渡表示,同一色调下饱和度的提高。某个平面圆形上的色调饱和度不同,而明度(亮度)相同。 CIE(Commission...

Estelle 1851

STM32驱动MG996R舵机的PWM控制与闭环原理

舵机是一种典型的模拟闭环伺服系统,其核心是通过电位器反馈实现角度位置的自动校正。工作原理基于负反馈控制:目标PWM脉宽决定期望角度,电位器输出实时反馈实际角度,控制电路计算偏差并驱动电机消除误差。该机制赋予舵机强带载能力与抗干扰性,是机器人、云台、智能执行器等场景的关键执行单元。在嵌入式开发中,STM32通过定时器生成标准20ms周期、0.5–2.5ms脉宽的PWM信号,需严格遵循电气规范,并解决PA15引脚SWJ复用冲突、定时器重映射及CCR精度计算等关键问题。本文深入解析MG996R舵机控制全流程,涵盖

weixin_42600407的博客 564

USB2.0基础知识总结

目录 1、协议层: 1.1、域分类 1.2 、USB传输方式: 1、协议层: 域和包定义:包是一次传输的单位,每个包由多个域组成; USB中是按照LSB进行字节传输; 1.1、域分类 1.1.1: 同步域(SYNC field) 所有的包都开始于同步域,在低速和全速通信中SYNC field用7个0和1个1来表示。 由于USB2.0使用了NRZI编码(0用翻转来表示,1用不翻转表示),所以00000001就是上图那样。 ...

qq_32938605的博客 4410

华科_图形学笔记_09_奇妙的真实感_片元着色02

计算机图形学_华中科技大学_中国大学MOOC(慕课) 9.4_让人头疼的纹理_上_颜色纹理 在之前的光照模型中,我们看到在给物体加上了光照之后,物体获得了一定的真实感。 可是大家也会发现一个现象,那就是由于表面过于光滑单调,反而显得不是那么真实了。其实,这是因为现实世界中的物体表面,往往还有各种纹理,也就是表面细节。 比如这里的球。加上一定的细节,让我们感觉是地球了。 这里的金属缠绕物加上了纹理,也显得更加逼真了。 所以,我们可以在光照的基础上给物体叠加一个表面细

精密时空设计局 2827

解决anaconda占用C盘空间过多问题

anaconda就算安装在其他盘,默认会把索引、锁定文件、压缩包等都放到系统盘(C盘),我用了两年,占用30GB。 1. 卸载不用的虚拟环境 查看已安装的虚拟环境 conda env list 卸载不用的、过期的虚拟环境 conda remove -n (要卸载的环境的名字) --all 2. 删除索引缓存、锁定文件、未使用过的包和tar包 conda clean -a 清理完之后,删除了15GB,还剩15GB,舒服了 ...

沉迷单车的追风少年 3万+

华科_图形学笔记_09_奇妙的真实感_片元着色01_02

计算机图形学_华中科技大学_中国大学MOOC(慕课) 9.3_光照明模型_上_Phong模型初步 首先,我们来看看光照模型发展的历史。 在1967年,Wylie等人,第一次在显示物体时加进了光照的效果。并且,认为光强与距离成反比。 进而在1970年,Booknight提出了第一个光反射模型。 主要就考虑了lambert漫反射加上环境光。 紧接着,1971年高洛德提出了漫反射模型加插值的思想。 到了1975年,冯提出了图形学中第一个有影响的光照明模型。 此后,又有了全局光照

精密时空设计局 888

SAP_MM/CO模块-超详细的CK11N/CK40N取值逻辑梳理(十几种业务场景,1.76W字)

本文主要讲述的是三个大的知识点,超详细,涉及到知识点比较多,并且串起来讲解,这也是我在网上搜不到相关资料才自己慢慢研究测试出来的,断断续续耗费了我一周多时间,相信只要你们认真看完,肯定会有所收获; 1、CK11N/CK40N成本发布功能中,系统前台的取数逻辑,涉及到多个采购信息记录、生产版本、货源清单、配额协议等对成本价发布的影响~~!! 2、CK11N与CK40N发布的成本价不一致的问题~~!! 3、如何处理外协加工物料的外协价与BOM组件成本取值不匹配的问题~~!!

风沙的博客 4094

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算机图形学

计算机图形学

ProgramNovice的博客 662

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

POV-Ray 3.6:渲染与 Phone 着色法的奇妙之旅

其中,POV-Ray 3.6 以其强大的渲染能力和独特的技术特性,成为了众多创作者的得力工具。POV-Ray 3.6 和 Phone 着色法处理技术为我们提供了强大的工具,让我们能够创造出令人惊叹的三维图像。通过掌握这些技术,你可以将自己的创意转化为真实的视觉作品,与他人分享你的想象力和创造力。无论是专业的设计师还是业余的爱好者,都可以尝试使用 POV-Ray 3.6 和 Phone 着色法,探索计算机图形学的无限可能。其渲染过程基于光线追踪技术,通过模拟光线在场景中的传播和反射,计算出每个像素的颜色值。

ThomasLLL25的博客 583

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Goo Engine 终极指南:如何快速掌握非真实感渲染技术

Goo Engine 是一个基于 Blender 构建的定制渲染引擎,专注于非真实感渲染(NPR)技术。这款强大的工具为艺术家和设计师提供了创作动漫风格、插画效果和手绘质感的能力,让3D场景呈现出独特的2D艺术风格。 ## 🎨 什么是非真实感渲染? 非真实感渲染是一种计算机图形学技术,旨在创建不追求照片真实感的视觉效果。Goo Engine 通过扩展 EEVEE 渲染引擎的功能,为创作者提供

gitblog_00403的博客 329

图形渲染的技术和原理:探索视觉效果的奇妙世界

图形渲染是计算机图形学领域的核心技术之一,它通过将三维模型转化为二维图像,实现了各种视觉效果的呈现。无论是电影特效、视频游戏还是虚拟现实,都离不开图形渲染的应用。在图形渲染中,光栅化、光线投射和光线跟踪是常见的渲染方法,每种方法都有其独特的原理和优势。本文将深入探讨图形渲染的技术和原理,以及它们在实际应用中的作用和局限性。无论你是对图形渲染感兴趣的初学者,还是希望深入了解其背后原理的专业人士,都能...

weixin_49393016的博客 667

[简化版 GAMES 101] 计算机图形学 21:从光栅化到光线追踪

本文深入浅出地讲解了计算机图形学中光栅化与光线追踪技术的核心差异与应用场景。文章首先剖析了光栅化技术在全局光照效果上的局限性(如硬阴影、Glossy反射和间接光照的实现困难),继而引出光线追踪技术的物理准确性优势。通过对比表展示了两种技术在渲染精度、性能表现等方面的显著差异,并详细阐述了光线追踪的三大光学假设基础(直线传播、光线互不干扰、光路可逆性)。 文章重点解析了Whitted-Style递归光线追踪的工作原理,包括主光线投射、阴影光线检测以及反射/折射光线的递归追踪机制,同时强调了能量守恒原理在光线追

软件科学-郝学胜 624

光影魔术师的秘密:用 JavaScript 打造软阴影的奇幻世界

在计算机图形学的奇妙宇宙里,光影是塑造真实感的魔法棒。而软阴影,就像是光影魔法师手中最神秘的咒语,能让虚拟世界的物体笼罩在柔和朦胧的阴影中,告别生硬的 “黑块”,瞬间变得鲜活灵动。今天,就让我们一起揭开软阴影的神秘面纱,用 JavaScript 书写属于我们的光影传奇。

CbukeJ的博客 175

【原】unity shader(3)反射贴图

改编自《cg教程--可编程实时图形学权威指南》上的demo。 反射向量计算公式 R=I-2N(N*I) 备注N*I是点乘 I入射光线,N法向量 函数实现: float3 reflect(float3 I,float3 N) { return I-2.0*N*dot(N,I); } Shader "CG shader Reflect"{ Properties {...

weixin_30284355的博客 125

graphics-workshop 3D光栅化实战:揭秘游戏图形渲染的核心算法

graphics-workshop是一个通过编写GPU着色器学习计算机图形学的开源项目,涵盖了从基础的2D图案生成到复杂的3D渲染技术。本文将聚焦于3D光栅化这一游戏图形渲染的核心算法,带你一步步揭开实时渲染的神秘面纱。 ## 为什么光栅化是游戏渲染的黄金标准 在计算机图形学领域,3D渲染主要有两种技术路径:光栅化和光线追踪。光栅化凭借其高效的计算性能,成为了绝大多数游戏和实时应用的首选方案。

gitblog_00504的博客 561

终极粒子系统指南:用Flutter打造惊艳视觉特效与动画粒子

想要为你的Flutter应用添加令人惊叹的视觉特效吗?粒子系统正是实现这一目标的完美解决方案。本文将带你深入了解GitHub_Trending/sam/samples项目中的粒子系统实现,探索如何创建动态、交互式的视觉体验。 ## 🔥 什么是粒子系统? 粒子系统是一种计算机图形学技术,通过大量小型图形元素(粒子)来模拟某些模糊现象。在Flutter中,粒子系统可以用来创建: - 火焰、烟雾

gitblog_00665的博客 485

如何在终端中打造3D世界:无需GPU的JavaScript渲染革命

你知道吗?你不需要昂贵的显卡,也不需要复杂的图形库,只需要一个普通的命令行终端,就能体验完整的3D图形渲染。Zero终端3D渲染器正是这样一个神奇的项目——它用纯JavaScript实现了完整的3D渲染管线,将3D世界直接呈现在你的终端窗口中。 ## 传统3D渲染的局限与突破 在传统的图形开发中,3D渲染通常依赖于GPU硬件加速和专门的图形API(如OpenGL、DirectX或WebGL)。

gitblog_01147的博客 776

Processing粒子系统实战:从零构建动态雨景模拟与交互优化

粒子系统是计算机图形学和动态视觉模拟中的基础概念,它通过管理大量具有相似行为的微小对象(粒子)来模拟自然现象。其核心原理在于定义粒子的属性(如位置、速度)和行为规则(如重力、风力),并在每一帧循环中更新状态并重新绘制,从而形成连续动画。这一技术在游戏特效、数据可视化和交互艺术中具有重要价值,能够高效模拟雨、雪、火焰等复杂视觉效果。本文以Processing为实践环境,深入探讨如何构建一个逼真的雨景模拟,涵盖粒子系统设计、物理模拟、视觉分层和性能优化等关键技术,并自然融入了【对象池】和【PGraphics】等

weixin_33713707的博客 346
上一篇: 如何写好科研论文 | 讨论
下一篇: Leetcode50. Pow(x, n)
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值