笔记07-着色(01)

文章介绍了光栅化的基本概念,包括画家算法及其局限性,然后详细阐述了Z-Buffer(深度缓存)算法的工作原理,用于解决图像层叠问题。接着,讨论了着色的三个方面——高光、漫反射和环境光照,并深入探讨了漫反射的兰伯特余弦定律和光能衰减模型。
摘要由CSDN通过智能技术生成

笔记07-着色(01)

1.光栅化

1.1画家算法

画家算法的操作是从远至进一层一层画,最终将画像完整。
但是,缺点是如果画像没有很明显的逻辑层次,画家算法将不适用。例如下图:

 

为了解决这个矛盾,于是进行改进发明了 ”Z-Buffer“ 算法。

1.2深度缓存 Z-缓存

 

简单来说,步骤:

1.通过离相机最近的一点进行深度插值,知道每一个三角形的深度值。

2.利用for循环,计算每个采样点的深度值。(注:不是对每一个像素求Z-Buffer,是对每一个采样点。)

3.一个一个采样点的深度值叠加进行光栅化,只保留当前最小值(最近才可以被看见,远了就被挡住,因此被近的覆盖。)

效果图:

 

由于需要对采样点进行挨个比较,但是只保留最小值,因此其时间复杂度为O(n)。并且至于采样点(三角形)叠加的顺序并不会影响光栅化效果(因为只保留最小值)

2. 着色(shading)

着色(shading):物体应用不同的材质表现着色过程 

 

高光(Specular highlights):亮度极高,在镜面反射附近方向反射。

漫反射(Diffuse reflection):亮度有变化,光线会反射到四面八方。漫反射到每个方向上是均匀的

环境光照(Ambient lighting):这属于间接光照,其实点光源并不会射到环境光照所指的位置。

2.1着色是局部

 

定义参数:

观察方向(Viewer direction):v

表面法线(Surface normal):n

光照方向(Light direction):l (适用于多个灯光中的每一个)

表面参数(Surface parameters):颜色、光泽明暗

2.2漫反射

 

A.计算被吸收的能量 - 兰伯特余弦定律

 

兰伯特余弦定律(Lambert’s cosine law) :

一般来说,表面接收到的能量和光线方向 l与法线方向 n的余弦 cos θ = l * n 成正比

B.光的能量衰减

可以将光照的能量看做一个球壳状的波,根据能量守恒定律,随着波的扩散,球壳表面积变大,球壳单位面积上的能量会衰减(设能量在传播过程中没有发生损失)

 

公式:

Ld=kd(I/r2)max(0,n*l)

Ld :漫反射的反射光

Kd :漫反射系数,向四周漫射的光通量与总的反射光通量之比

(I/r2) :在着色点处的光的能量(该式根据光的能量衰减模型来获得)

max(0,n*l) : 着色点接收到的光的能量(根据兰伯特余弦定律,特别地,当余弦为负数时,能量为零)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于绘制多边形,我会为您提供一些OpenGL学习笔记。 首先,我们需要了解一下OpenGL绘制多边形的基本流程。OpenGL绘制多边形的过程包括三个基本步骤:指定顶点数据、指定绘制方式和执行绘制。 指定顶点数据:在OpenGL中,我们可以使用glVertex等函数来指定多边形的顶点。例如,如果我们要绘制一个三角形,我们可以使用以下代码: ``` glBegin(GL_TRIANGLES); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); ``` 其中,glBegin和glEnd函数用来指定绘制的方式,GL_TRIANGLES表示绘制三角形。glVertex3f函数用来指定三角形的三个顶点,每个顶点由三个坐标值组成。 指定绘制方式:OpenGL支持多种绘制方式,例如GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN等。在上面的代码中,我们使用了GL_TRIANGLES来指定绘制三角形的方式。 执行绘制:最后,我们需要调用glDrawArrays函数来执行绘制。例如,如果我们要绘制一个三角形,我们可以使用以下代码: ``` glDrawArrays(GL_TRIANGLES, 0, 3); ``` 其中,GL_TRIANGLES表示绘制三角形的方式,0表示顶点数组的起始位置,3表示顶点的数量。 以上就是OpenGL绘制多边形的基本流程,下面我们来看一下如何绘制着色多边形。 绘制着色多边形的过程与绘制普通多边形的过程基本相同,只需要在绘制前调用glColor函数来指定颜色即可。例如,如果我们要绘制一个红色的三角形,我们可以使用以下代码: ``` glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); // 指定颜色为红色 glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); ``` 其中,glColor3f函数用来指定颜色,三个参数分别表示红、绿、蓝三个颜色通道的值,取值范围为0到1。 希望以上内容能够帮助到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值