六、PBR:6.1 理论

  • PBR,或者用更通俗一些的称呼是指基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。
  • 正因为基于物理的渲染目的便是为了使用一种更符合物理学规律的方式来模拟光线,因此这种渲染方式与我们原来的Phong或者Blinn-Phong光照算法相比总体上看起来要更真实一些。
  • 除了看起来更好些以外,由于它与物理性质非常接近,因此我们(尤其是美术师们)可以直接以物理参数为依据来编写表面材质,而不必依靠粗劣的修改与调整来让光照效果看上去正常。
  • 使用基于物理参数的方法来编写材质还有一个更大的好处,就是不论光照条件如何,这些材质看上去都会是正确的,而在非PBR的渲染管线当中有些东西就不会那么真实了。
  • 虽然如此,基于物理的渲染仍然只是对基于物理原理的现实世界的一种近似
    • 这也就是为什么它被称为基于物理的着色(Physically based Shading) 而非物理着色(Physical Shading)。
  • 判断一种PBR光照模型是否是基于物理的,必须满足以下三个条件
    1. 基于微平面(Microfacet)的表面模型。
    2. 能量守恒。
    3. 应用基于物理的BRDF。

微平面模型

  • 所有的PBR技术都基于微平面理论。

    • 这项理论认为,达到微观尺度之后任何平面都可以用被称为微平面(Microfacets)的细小镜面来进行描绘。
    • 根据平面粗糙程度的不同,这些细小镜面的取向排列可以相当不一致。
  • 产生的效果就是:一个平面越是粗糙,这个平面上的微平面的排列就越混乱,反之亦然。
  • 在微观尺度下,没有任何平面是完全光滑的。
  • 然而由于这些微平面已经微小到无法逐像素的继续对其进行区分,因此我们只有假设一个**粗糙度(Roughness)**参数,然后用统计学的方法来概略的估算微平面的粗糙程度。
  • 我们可以基于一个平面的粗糙度来计算出某个向量的方向与微平面平均取向方向一致的概率。
  • 这个向量便是位于光线向量l和视线向量v之间的中间向量(Halfway Vector)
  • 微平面的取向方向与中间向量的方向越是一致,镜面反射的效果就越是强烈越是锐利。
  • 然后再加上一个介于0到1之间的粗糙度参数,这样我们就能概略的估算微平面的取向情况了。
  • 较高的粗糙度值显示出来的镜面反射的轮廓要更大一些。与之相反地,较小的粗糙值显示出的镜面反射轮廓则更小更锐利。

能量守恒

  • 微平面近似法使用了这样一种形式的能量守恒(Energy Conservation)

    • 出射光线的能量永远不能超过入射光线的能量(发光面除外)。
  • 随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降。
    • 如果不管反射轮廓的大小而让每个像素的镜面反射强度(Specular Intensity)都一样的话,那么粗糙的平面就会放射出过多的能量,而这样就违背了能量守恒定律。
  • 为了遵守能量守恒定律,我们需要对漫反射光和镜面反射光之间做出明确的区分
    • 当一束光线碰撞到一个表面的时候,它就会分离成一个折射部分和一个反射部分。
    • 反射部分就是会直接反射开来而不会进入平面的那部分光线,这就是我们所说的镜面光照。
    • 折射部分就是余下的会进入表面并被吸收的那部分光线,这也就是我们所说的漫反射光照。
  • 这里还有一些细节需要处理,因为当光线接触到一个表面的时候折射光是不会立即就被吸收的。
  • 一般来说,并非所有能量都会被全部吸收,而光线也会继续沿着(基本上)随机的方向发散,然后再和其他的粒子碰撞直至能量完全耗尽或者再次离开这个表面。
  • 而光线脱离物体表面后将会协同构成该表面的(漫反射)颜色。
  • 不过在基于物理的渲染之中我们进行了简化,假设对平面上的每一点所有的折射光都会被完全吸收而不会散开
  • 而有一些被称为次表面散射(Subsurface Scattering)技术的着色器技术将这个问题考虑了进去,它们显著的提升了一些诸如皮肤,大理石或者蜡质这样材质的视觉效果,不过伴随而来的则是性能下降代价。
  • 金属表面对光的反应与非金属材料(也被称为介电质(Dielectrics)材料)表面相比是不同的。
  • 它们遵从的反射与折射原理是相同的,但是所有的折射光都会被直接吸收而不会散开,只留下反射光或者说镜面反射光。
  • 亦即是说,金属表面不会显示出漫反射颜色。
  • 由于金属与电介质之间存在这样明显的区别,因此它们两者在PBR渲染管线中被区别处理
  • 反射光与折射光之间的这个区别使我们得到了另一条关于能量守恒的经验结论:
    • 反射光与折射光它们二者之间是互斥的关系。
    • 无论何种光线,其被材质表面所反射的能量将无法再被材质吸收。
    • 因此,诸如折射光这样的余下的进入表面之中的能量正好就是我们计算完反射之后余下的能量。
  • 按照这种方法折射/漫反射与反射/镜面反射所占的份额都不会超过1.0,如此就能保证它们的能量总和永远不会超过入射光线的能量。而这些都是我们在前面的光照教程中没有考虑的问题。

反射率方程

  • 在这里我们引入了一种被称为渲染方程(Render Equation)的东西

    • 它是某些聪明绝顶人所构想出来的一个精妙的方程式,是如今我们所拥有的用来模拟光的视觉效果最好的模型。
  • 基于物理的渲染所坚定的遵循的是一种被称为反射率方程(The Reflectance Equation)的渲染方程的特化版本
  • 对于涉及的辐射度量学概念介绍内容,GAMES101课程中也有介绍,在此略去。
  • 事实上,当涉及到辐射率时,我们通常关心的是所有投射到点p上的光线的总和,而这个和就称为辐射照度或者辐照度(Irradiance)。
  • 在理解了辐射率和辐照度的概念之后,让我们再回过头来看看反射率方程。
  • 我们知道在渲染方程中L代表通过某个无限小的立体角ωi在某个点上的辐射率,而立体角可以视作是入射方向向量ωi
  • 注意我们利用光线和平面间的入射角的余弦值cosθ来计算能量,亦即从辐射率公式L转化至反射率公式时的n⋅ωi
  • ωo表示观察方向,也就是出射方向,反射率公式计算了点pωo方向上被反射出来的辐射率Lo(p,ωo)的总和。
    • 或者换句话说:Lo表示了从ωo方向上观察,光线投射到点p上反射出来的辐照度。
  • 基于反射率公式是围绕所有入射辐射率的总和,也就是辐照度来计算的,所以我们需要计算的就不只是是单一的一个方向上的入射光,而是一个以点p为球心的半球领域Ω内所有方向上的入射光。
    • 一个半球领域(Hemisphere)可以描述为以平面法线n为轴所环绕的半个球体。
    • 我们会需要用到一种称为积分(Integral)的数学手段,也就是反射率公式中的符号,它的运算包含了半球领域Ω内所有入射方向上的dωi
    • 积分运算的值等于一个函数曲线的面积,它的计算结果要么是解析解要么就是数值解。
    • 由于渲染方程和反射率方程都没有解析解,我们将会用离散的方法来求得这个积分的数值解
    • 这个问题就转化为,在半球领域Ω中按一定的步长将反射率方程分散求解,然后再按照步长大小将所得到的结果平均化。
    • 这种方法被称为黎曼和(Riemann sum)
    • 请牢记,使用离散步长得到的是函数总面积的一个近似值
    • 我们可以通过增加离散部分的数量来提高黎曼和的准确度(Accuracy)。
  • 反射率方程概括了在半球领域Ω内,碰撞到了点p上的所有入射方向ωi上的光线的辐射率,并受到fr的约束,然后返回观察方向上反射光的Lo
  • 现在唯一剩下的未知符号就是fr了,它被称为BRDF,或者双向反射分布函数(Bidirectional Reflective Distribution Function) ,它的作用是基于表面材质属性来对入射辐射率进行缩放或者加权。

BRDF

  • 对于BRDF,GAMES101中也有所介绍~
  • BRDF,或者说双向反射分布函数,它接受入射(光)方向ωi,出射(观察)方向ωo,平面法线n以及一个用来表示微平面粗糙程度的参数a作为函数的输入参数。
  • BRDF可以近似的求出每束光线对一个给定了材质属性的平面上最终反射出来的光线所作出的贡献程度。
    • 举例来说,如果一个平面拥有完全光滑的表面(比如镜面),那么对于所有的入射光线ωi(除了一束以外)而言BRDF函数都会返回0.0 ,只有一束与出射光线ωo拥有相同(被反射)角度的光线会得到1.0这个返回值。
  • BRDF基于我们之前所探讨过的微平面理论来近似的求得材质的反射与折射属性。
  • 对于一个BRDF,为了实现物理学上的可信度,它必须遵守能量守恒定律,也就是说反射光线的总和永远不能超过入射光线的总量。
  • 严格上来说,同样采用ωiωo作为输入参数的 Blinn-Phong光照模型也被认为是一个BRDF。
    • 然而由于Blinn-Phong模型并没有遵循能量守恒定律,因此它不被认为是基于物理的渲染。
  • 现在已经有好几种BRDF都能近似的得出物体表面对于光的反应,但是几乎所有实时渲染管线使用的都是一种被称为Cook-Torrance BRDF模型
  • Cook-Torrance BRDF兼有漫反射和镜面反射两个部分:
  • 这里的kd是早先提到过的入射光线中被折射部分的能量所占的比率,而ks是被反射部分的比率。
  • BRDF的左侧表示的是漫反射部分,这里用flambert来表示。
  • 它被称为Lambertian漫反射,这和我们之前在漫反射着色中使用的常数因子类似,用如下的公式来表示:
  • c表示表面颜色(回想一下漫反射表面纹理)。除以π是为了对漫反射光进行标准化,因为前面含有BRDF的积分方程是受π影响的(会在IBL的教程中探讨这个问题)。
    • 这个Lambertian漫反射和我们之前经常使用的漫反射的关系:之前我们是用表面法向量与光照方向向量进行点乘,然后再将结果与平面颜色相乘得到漫反射参数。点乘依然还在,但是却不在BRDF之内,而是转变成为了Lo积分末公式末尾处的n⋅ωi
  • 按照Epic公司给出的结论,Lambertian漫反射模型已经足够应付大多数实时渲染的用途了。
  • BRDF的镜面反射部分要稍微更高级一些,它的形式如下所示:
  • Cook-Torrance BRDF的镜面反射部分包含三个函数,此外分母部分还有一个**标准化因子 **。
  • 字母D,F与G分别代表着一种类型的函数,各个函数分别用来近似的计算出表面反射特性的一个特定部分。
  • 三个函数分别为法线分布函数(Normal Distribution Function),菲涅尔方程(Fresnel Rquation)和几何函数(Geometry Function):
    • 法线分布函数:估算在受到表面粗糙度的影响下,取向方向与中间向量一致的微平面的数量。这是用来估算微平面的主要函数。
    • 几何函数:描述了微平面自成阴影的属性。当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。
    • 菲涅尔方程:菲涅尔方程描述的是在不同的表面角下表面所反射的光线所占的比率。
  • 以上的每一种函数都是用来估算相应的物理参数的,而且你会发现用来实现相应物理机制的每种函数都有不止一种形式。
  • 它们有的非常真实,有的则性能高效。你可以按照自己的需求任意选择自己想要的函数的实现方法。
  • 英佩游戏公司的Brian Karis对于这些函数的多种近似实现方式进行了大量的研究。
  • 我们将会采用Epic Games在Unreal Engine 4中所使用的函数,其中:
    • D使用Trowbridge-Reitz GGX
    • F使用Fresnel-Schlick近似(Fresnel-Schlick Approximation)
    • G使用Smith’s Schlick-GGX

法线分布函数

  • 法线分布函数D,或者说镜面分布,从统计学上近似的表示了与某些(中间)向量h取向一致的微平面的比率
  • 举例来说,假设给定向量h,如果我们的微平面中有35%与向量h取向一致,则法线分布函数或者说NDF将会返回0.35。
  • 目前有很多种NDF都可以从统计学上来估算微平面的总体取向度,只要给定一些粗糙度的参数以及一个我们马上将会要用到的参数Trowbridge-Reitz GGX:
  • 在这里h表示用来与平面上微平面做比较用的中间向量,而a表示表面粗糙度。
  • 如果我们把h当成是不同粗糙度参数下,平面法向量和光线方向向量之间的中间向量的话,我们可以得到如下图示的效果:
  • 使用GLSL代码编写的Trowbridge-Reitz GGX法线分布函数是下面这个样子的:
    float D_GGX_TR(vec3 N, vec3 H, float a)
    {float a2     = a*a;float NdotH  = max(dot(N, H), 0.0);float NdotH2 = NdotH*NdotH;float nom    = a2;float denom  = (NdotH2 * (a2 - 1.0) + 1.0);denom        = PI * denom * denom;return nom / denom;
    }
    

几何函数

  • 几何函数从统计学上近似的求得了微平面间相互遮蔽的比率,这种相互遮蔽会损耗光线的能量。
  • 与NDF类似,几何函数采用一个材料的粗糙度参数作为输入参数,粗糙度较高的表面其微平面间相互遮蔽的概率就越高。
  • 我们将要使用的几何函数是GGX与Schlick-Beckmann近似的结合体,因此又称为Schlick-GGX:
  • 这里的kα基于几何函数是针对直接光照还是针对IBL光照的重映射(Remapping) :
  • 注意,根据你的引擎把粗糙度转化为α的方式不同,得到α的值也有可能不同。
  • 为了有效的估算几何部分,需要将观察方向(几何遮蔽(Geometry Obstruction))和光线方向向量(几何阴影(Geometry Shadowing))都考虑进去。
  • 我们可以使用史密斯法(Smith’s method)来把两者都纳入其中:
  • 使用史密斯法与Schlick-GGX作为Gsub可以得到如下所示不同粗糙度的视觉效果:
  • 几何函数是一个值域为[0.0, 1.0]的乘数,其中白色或者说1.0表示没有微平面阴影,而黑色或者说0.0则表示微平面彻底被遮蔽。
  • 使用GLSL编写的几何函数代码如下:
    float GeometrySchlickGGX(float NdotV, float k)
    {float nom   = NdotV;float denom = NdotV * (1.0 - k) + k;return nom / denom;
    }float GeometrySmith(vec3 N, vec3 V, vec3 L, float k)
    {float NdotV = max(dot(N, V), 0.0);float NdotL = max(dot(N, L), 0.0);float ggx1 = GeometrySchlickGGX(NdotV, k);float ggx2 = GeometrySchlickGGX(NdotL, k);return ggx1 * ggx2;
    }
    

菲涅尔方程

  • 菲涅尔(发音为Freh-nel)方程描述的是被反射的光线对比光线被折射的部分所占的比率,这个比率会随着我们观察的角度不同而不同。
  • 当光线碰撞到一个表面的时候,菲涅尔方程会根据观察角度告诉我们被反射的光线所占的百分比。
  • 利用这个反射比率和能量守恒原则,我们可以直接得出光线被折射的部分以及光线剩余的能量。
  • 当垂直观察的时候,任何物体或者材质表面都有一个基础反射率(Base Reflectivity),但是如果以一定的角度往平面上看的时候所有反光都会变得明显起来。
  • 你可以自己尝试一下,用垂直的视角观察你自己的木制/金属桌面,此时一定只有最基本的反射性。
  • 但是如果你从近乎90度(译注:应该是指和法线的夹角)的角度观察的话反光就会变得明显的多。
  • 如果从理想的90度视角观察,所有的平面理论上来说都能完全的反射光线。
  • 这种现象因菲涅尔而闻名,并体现在了菲涅尔方程之中。
  • 菲涅尔方程是一个相当复杂的方程式,不过幸运的是菲涅尔方程可以用Fresnel-Schlick近似法求得近似解:
  • F0表示平面的基础反射率,它是利用所谓折射指数(Indices of Refraction)或者说IOR计算得出的。
  • 然后正如你可以从球体表面看到的那样,我们越是朝球面掠角的方向上看(此时视线和表面法线的夹角接近90度)菲涅尔现象就越明显,反光就越强:
  • 菲涅尔方程还存在一些细微的问题
    • 其中一个问题是Fresnel-Schlick近似仅仅对电介质或者说非金属表面有定义。
    • 对于导体(Conductor)表面(金属),使用它们的折射指数计算基础折射率并不能得出正确的结果,这样我们就需要使用一种不同的菲涅尔方程来对导体表面进行计算。
    • 由于这样很不方便,所以我们预先计算出平面对于法向入射(F0)的反应(处于0度角,好像直接看向表面一样)然后基于相应观察角的Fresnel-Schlick近似对这个值进行插值,用这种方法来进行进一步的估算。
    • 这样我们就能对金属和非金属材质使用同一个公式了。
  • 平面对于法向入射的响应或者说基础反射率可以在一些大型数据库中找到。
  • 导体材质表面的基础反射率起点更高一些并且(大多)在0.5和1.0之间变化。
  • 此外,对于导体或者金属表面而言基础反射率一般是带有色彩的,这也是为什么F0要用RGB三原色来表示的原因(法向入射的反射率可随波长不同而不同)。
  • 这种现象我们只能在金属表面观察的到。
  • 金属表面这些和电介质表面相比所独有的特性引出了所谓的金属工作流的概念。也就是我们需要额外使用一个被称为**金属度(Metalness)**的参数来参与编写表面材质。
    • 金属度用来描述一个材质表面是金属还是非金属的。
    • 理论上来说,一个表面的金属度应该是二元的:要么是金属要么不是金属,不能两者皆是。但是,大多数的渲染管线都允许在0.0至1.0之间线性的调配金属度。这主要是由于材质纹理精度不足以描述一个拥有诸如细沙/沙状粒子/刮痕的金属表面。通过对这些小的类非金属粒子/刮痕调整金属度值,我们可以获得非常好看的视觉效果。
  • 通过预先计算电介质与导体的F0值,我们可以对两种类型的表面使用相同的Fresnel-Schlick近似,但是如果是金属表面的话就需要对基础反射率添加色彩。我们一般是按下面这个样子来实现的:
    vec3 F0 = vec3(0.04);
    F0      = mix(F0, surfaceColor.rgb, metalness);
    
  • 我们为大多数电介质表面定义了一个近似的基础反射率。F0取最常见的电解质表面的平均值,这又是一个近似值。
  • 不过对于大多数电介质表面而言使用0.04作为基础反射率已经足够好了,而且可以在不需要输入额外表面参数的情况下得到物理可信的结果。
  • 然后,基于金属表面特性,我们要么使用电介质的基础反射率,要么就使用F0来作为表面颜色。
  • 因为金属表面会吸收所有折射光线而没有漫反射,所以我们可以直接使用表面颜色纹理来作为它们的基础反射率。
  • Fresnel Schlick近似可以用代码表示为:
    vec3 fresnelSchlick(float cosTheta, vec3 F0)
    {return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
    }
    
  • 其中cosTheta是表面法向量n与观察方向v的点乘的结果。

Cook-Torrance反射率方程

随着Cook-Torrance BRDF中所有元素都介绍完毕,我们现在可以将基于物理的BRDF纳入到最终的反射率方程当中去了:

这个方程现在完整的描述了一个基于物理的渲染模型,它现在可以认为就是我们一般意义上理解的基于物理的渲染也就是PBR。

编写PBR材质

  • 在了解了PBR后面的数学模型之后,最后我们将通过说明美术师一般是如何编写一个我们可以直接输入PBR的平面物理属性的来结束这部分的讨论。
  • PBR渲染管线所需要的每一个表面参数都可以用纹理来定义或者建模。
  • 使用纹理可以让我们逐个片段的来控制每个表面上特定的点对于光线是如何响应的:不论那个点是金属的,粗糙或者平滑,也不论表面对于不同波长的光会有如何的反应。
  • 在下面你可以看到在一个PBR渲染管线当中经常会碰到的纹理列表,还有将它们输入PBR渲染器所能得到的相应的视觉输出:
  • 反照率:反照率(Albedo)纹理为每一个金属的纹素(Texel)(纹理像素)指定表面颜色或者基础反射率。
    • 这和我们之前使用过的漫反射纹理相当类似,不同的是所有光照信息都是由一个纹理中提取的。
    • 漫反射纹理的图像当中常常包含一些细小的阴影或者深色的裂纹,而反照率纹理中是不会有这些东西的。它应该只包含表面的颜色(或者折射吸收系数)。
  • 法线:法线贴图纹理和我们之前在法线贴图教程中所使用的贴图是完全一样的。
    • 法线贴图使我们可以逐片段的指定独特的法线,来为表面制造出起伏不平的假象。
  • 金属度:金属(Metallic)贴图逐个纹素的指定该纹素是不是金属质地的。
    • 根据PBR引擎设置的不同,美术师们既可以将金属度编写为灰度值又可以编写为1或0这样的二元值。
  • 粗糙度:粗糙度(Roughness)贴图可以以纹素为单位指定某个表面有多粗糙。
    • 采样得来的粗糙度数值会影响一个表面的微平面统计学上的取向度。
    • 一个比较粗糙的表面会得到更宽阔更模糊的镜面反射(高光),而一个比较光滑的表面则会得到集中而清晰的镜面反射。
    • 某些PBR引擎预设采用的是对某些美术师来说更加直观的光滑度(Smoothness)贴图而非粗糙度贴图,不过这些数值在采样之时就马上用(1.0 – 光滑度)转换成了粗糙度。
  • AO:环境光遮蔽(Ambient Occlusion)贴图或者说AO贴图为表面和周围潜在的几何图形指定了一个额外的阴影因子。
    • 比如如果我们有一个砖块表面,反照率纹理上的砖块裂缝部分应该没有任何阴影信息。
    • 然而AO贴图则会把那些光线较难逃逸出来的暗色边缘指定出来。
    • 网格/表面的环境遮蔽贴图要么通过手动生成,要么由3D建模软件自动生成。
  • 美术师们可以在纹素级别设置或调整这些基于物理的输入值,还可以以现实世界材料的表面物理性质来建立他们的材质数据。
  • 这是PBR渲染管线最大的优势之一,因为不论环境或者光照的设置如何改变这些表面的性质是不会改变的,这使得美术师们可以更便捷的获取物理可信的结果。
  • 在PBR渲染管线中编写的表面可以非常方便的在不同的PBR渲染引擎间共享使用,不论处于何种环境中它们看上去都会是正确的,因此看上去也会更自然。

LearnOpenGL笔记——六、PBR:理论相关推荐

  1. JS学习笔记六:js中的DOM操作

    1. JS学习笔记六:js中的DOM操作 文章目录 1. JS学习笔记六:js中的DOM操作 1.1. 获取Dom节点 1.2. 元素属性的操作方式 1.3. DOM节点的创建.插入和删除 1.4. ...

  2. 【智能车辆工程】专业课笔记:汽车理论

    [智能车辆工程]专业课笔记:汽车理论 参考书:清华大学第六版汽车理论 余志生主编 考了94(●'◡'●) 在这里插入图片描述

  3. Ethernet/IP 学习笔记六

    Ethernet/IP 学习笔记六 EtherNet/IP defines two primary types of communications: explicit and implicit (Ta ...

  4. 吴恩达《机器学习》学习笔记六——过拟合与正则化

    吴恩达<机器学习>学习笔记六--过拟合与正则化 一. 过拟合问题 1.线性回归过拟合问题 2.逻辑回归过拟合问题 3.过拟合的解决 二. 正则化后的代价函数 1.正则化思想 2.实际使用的 ...

  5. ROS学习笔记六:理解ROS服务和参数

    ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...

  6. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:// ...

  7. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  8. 网络层笔记六、硬件地址与IP地址

    网络层笔记六.硬件地址与IP地址 引言:前面三篇笔记中,我们介绍了IP地址的三种编址方式,依次是分类的IP编址.划分子网(改进分类编址)及无分类IP地址.本篇笔记我们将介绍硬件地址与IP地址的关系,真 ...

  9. Python学习笔记六——画小猪佩奇

    目录 Python学习笔记六--画小猪佩奇 画布 画笔 属性设置 操纵命令 运动命令 画笔控制命令 全局控制命令 其他命令 Python学习笔记六--画小猪佩奇 使用Python的turtle库可以绘 ...

最新文章

  1. React Native学习总结第一天
  2. Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型
  3. Matlab GUI 设计(3):edit、slider、table数据同步
  4. CentOS7中多台服务器配置时钟同步
  5. JSF优点(转载自中国IT实验室)
  6. jquery手写轮播图_jquery 实现轮播图详解及实例代码_jquery_脚本之家
  7. opengl png图片 qt_Qt资源文件的格式,并用CMake添加Qt资源文件
  8. python安装whl_1 Matplotlib在win10下安装
  9. java 封闭类型_java – 如何获取封闭类?
  10. D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力
  11. loadrunner下载地址
  12. 虚拟机怎么启动共享文件服务器,VMware虚拟机中ubuntu启用本地文件共享的设置方法...
  13. win7系统iis服务器删除,Win7系统如何卸载iis 删除win7中iis的方法
  14. matlab画任意正多边形,MATLAB——patch绘制多边形
  15. [研究笔记] Travis CI 使用介绍
  16. Android 通讯录的实现,根据拼音首字母快速索引到名字
  17. 测试/开发程序员喜欢跳槽?跳了就能涨工资吗?
  18. php liger 表格排序,LigerUI之grid表格点击表头标题排序实现
  19. 怎么测试Tomcat是否安装配置成功
  20. Ultra-Fast Mathematician

热门文章

  1. ConfigReader(三)—— ReadAdvancedGuideConfig
  2. csdn论坛中关于在word中生成日历的问题的解答
  3. 【王喆-推荐系统】(task1)推荐系统的五大特征(特征工程篇)
  4. 天涯社区谢巍:Facebook区块链转型难度可能大于初创公司
  5. mac android studio 快捷键,Android Studio(Mac版本)最常用的快捷键
  6. 微信小程序 Vant Weapp 引入Dialog的使用
  7. FlatList使用示例包含RefreshControl
  8. 转载光荣之路:与领导沟通那点事儿
  9. java.net.SocketException: Unrecognized Windows Sockets error: 10106: create which imposes a more or
  10. 网站内容禁止复制的js代码