Feeding a physically based shading model

怎么满足基于物理的渲染(PBR)模型

Sebastien Lagarde

August 17, 2011

译者注:本文是虚幻的官方文档推荐看的。有趣的是其作者是Unity的渲染研究总监。

上篇文章采用基于物理的渲染模型 是掌握PBR的第一步。基于物理的渲染模型(PBR),要获得好的渲染效果,要基于真实物理来设置光照。并且需要好的好的材质。

用物理可信的数据设置PBR依赖于艺术家们。网上有很多贴图创建教程。但是很多时候,艺术家没有把他们要工作的光照模型和他们要创建的贴图联系起来。在传统的光照模型里,一般有RGB漫反射贴图,RGB高光贴图,高光遮罩贴图,高光乘方常量和法线。某些高级的材质里,你可以添加高光乘方常量贴图,菲涅尔强度贴图,菲涅尔缩放贴图,反射遮罩贴图等等

PBR模型则更加简单,并且可以在不同的光照环境下表现稳定。但是艺术家们必须多加联系和培训。因为正确的参数不总是很容易调制得到。艺术家们应该接受不要全权控制高光表现。

译者注:下面介绍的PBR模型,还虚幻有差别。不过原理类似。因为对于金属部分,漫反射贴图总是黑的,而高光贴图是有颜色的。对于非金属部分则正好相反,高光贴图是黑的而漫反射贴图是有颜色的。所以黑色的时候都是浪费的,虚幻进一步优化把这两张图优化合成一张漫反射图了,通过金属度来使用那种。

作者的PBR模型需要4种参数:

  • Diffuse color RGB 漫反射(也叫漫反射反射率diffuse albedo or diffuse reflectance or directionnal-hemispherical reflectance)
  • Specular color RGB高光贴图 (named specular albedo or specular reflectance)
  • 法线和光泽贴图

创作这些贴图的时间并不相同。我会提供些建议和材质参考给美术,帮助他们创建这些材质。美术流程越好,出来的渲染效果也会越好。法线和光泽度是紧密联系的,所以一起处理他们两。

当我们讨论材质的时候,我们讨论的是sRGB/RGB颜色空间,线形/伽马空间等等。

所有这些理论在参考资料[2]里面很好的描述了,所以这里不会做更多解释。

在一头扎进更多细节前,让我们看看一些贴图工作流的建议:

  • 艺术家们必须校正他们的显示器。或者更好的做法,项目组里的每一台显示器都要用同样的方式校正。参见参考资料 [6].
  • 确认在PS里颜色管理被设为采用sRGB。参见参考资料 [5].
  • 艺术家倾向于相信他们的眼睛,但是眼睛会说谎。调整贴图灰度就是一个烦人的工作。参见参考资料[7]. 利用参考材质并且工作在一个中灰的背景里比较好。
  • 当工作在sRGB色彩空间的时候,因为大多数在Photoshop里创作的材质都是这个色彩空间,需要记住中灰不是128,128,128 而是 187,187,187. 参考 John Hable 的研究 [22] 比较了 128 和 187 中灰的不同。
  • 游戏引擎应该实现调试模式,用来显示贴图密度,mipmap分辨率,仅光照,仅高光,仅光泽度,仅法线等等。这对查找贴图创作问题非常有用。
  • 贴图应该在场景中比较统一。即使所有的贴图都很牛,仅仅一张比较差的贴图都可能吸引玩家的眼睛,就像屏幕中一个坏掉的像素。最终的视觉效果会比较差。在同样的场景里使用同一的密度和中等质量的贴图会看起来更好。

绝缘体和金属材质

真实世界有很多种物质。他们可以分为3类:绝缘体,半导体和导体。 
在游戏里,我们只关心两种物质: 绝缘体和导体(金属)。

艺术家们应该理解所有创建的材质的分类。其分类决定了给对应的材质怎样设置漫反射和高光的值。

我再前一篇文章里讲了这两种分类。Adopting a Physically based shading model.

绝缘体是最常见的材质。他们的光学属性在用可见光谱测试变化不多。比如水,玻璃,皮肤,木头,头发,羽毛,塑料,石头,混凝土,宝石,钻石等。

而金属,他们的光学属性在可见光谱测试下变化很大(译者注:反射有偏色,不同波长的光,反射率不同)。比如铁,铝,铜,金,

钴,银等。参见[8].

漫反射颜色

创作漫反射贴图很费时间。

在过去,需要经常将所有信息烘培进漫反射贴图。比如阴影,反射,高光等等。在新的引擎里,所有这些效果都可以模拟出来而不用烘培了。

在我们的引擎里,对漫反射颜色最好的定义是:当用一个100%亮度的白光照射的时候,一个表面看起来有多亮。参见[4]. 该定义与在严格的光照方程里光的单位定义有关 (参见 Adopting a physically based shading model).

光源的光照单位被定义为当一个白色的勃朗体被一个垂直照射的光源照射时的颜色。译者注:勃朗体是一种对光完全漫反射的理想物体,想象粗糙度为1并且specular为0的物体。

这意味着当你在编辑器里设置一个光源的亮度为1的,并且只想一个带贴图的四边形,四边形的颜色应该和你在Photoshop里看到的颜色一致(注意你可能需要考虑后处理Postprocess的影响)。

漫发射贴图应该是增加场景的可是效果的,(而不是相反)。场景应该在“仅光照”模式里看起来不错。然后通过漫反射贴图来增加细节。如果浪费太多的时间在“看起来好”的漫反射贴图并不会增加任何效果,可能更糟,掩盖了光照信息。

为了补偿我们的额PBR模型,漫反射贴图应该比较亮。艺术家通常会把贴图创作的太暗。平均颜色太暗会增加高光和漫反射的对比度,回使得高光看起来太亮。更糟的是,当打开GI( global illumination)的时候,反射光会由于偏暗的基础色变得太弱。这样布光师不得不调节光源的亮度。最后导致直射光被调得太亮。参考[4].

一致的漫反射贴图真的很重要。如果漫反射贴图没有正确的创作,布光师完全没有办法做正确的光照设定。

PBR的一大好处是我们可以基于真实世界来选择漫反射贴图的颜色。在我们的游戏里我们用了两种方法:

1. 拍摄真实世界的照片。参考 Henry Labounta 在他的 GDC 2011大会上的演讲  “Art Direction Tools for Photo Real Games” [24]

  • 在多云的天气拍照,减少直射光的干扰.
  • 拍照要用raw模式 (这样可以直接获得线性色彩空间的图片,而不是伽马空间的) 带上一个色板 X-rite passport Macbeth chart [30](译者注:咱刚申请买了一个,800多块呢).
  • 导入并用上面的设备和工具做校色 .
  • 经过校色后产生的sRGB可以用来做贴图了.

X-rite passport Macbeth 色卡是这样的

2.  采用物理反射率 [28]

注意 : 所有的值都是在线性空间,不是sRGB空间.

Charcoal(炭)       0.04

Fresh asphalt(崭新的沥青)  0.04

Worn asphalt(破损的沥青)   0.12

Bare soil(裸土)      0.17

Green grass(绿草)    0.25

Desert sand(沙漠)    0.40

New concrete(新混凝土)   0.55

Ocean Ice(海冰)      0.5–0.7

Fresh snow(刚下的雪)     0.80–0.90

地球上最暗的物质是炭,最亮的是刚下的雪.
这些物质漫反射的颜色应该比上面的值稍微小一点,因为要减去高光的贡献。
所以漫反射颜色在sRGB空间里的范围一般是 50-240.

不管用上面的哪种方法,在直方图里图形应该比较靠右。这样就可以得到偏亮的漫反射颜色。

为了增加些细节,在引擎没法提供AO的时候,我们可以烘培一点微遮挡(AO)到漫反射贴图里。AO要稍微混合一点贴图的颜色,而不是纯黑的。参考[29]

对于纯金属材质来说,漫反射颜色应该是黑得(全部是镜面反射)。(译者注:在diffuse, metallic, glossy这种模型下金属的金属色要设为黑的,在UE4里怎不同,UE4里当材质是金属的时候,漫反射颜色是镜面反射率)。

在这种情况,金属的颜色决定于高光的颜色。

对于生锈的金属,混合高光和漫反射能得到比较好的效果。

我们把漫反射存在一张中等分辨率的sRGB DXT1(半透明的话用DXT5)贴图里。

注:

当用真实世界的照片做参考的时候,这里有些方法可以去除直射光的影响。比如在[25]提到的. Crazybump在 [26]里也有些工具可以做到. Epic虚幻自己也有些不错的方法[27].

如果在漫反射和高光之间使用了能量守恒,那么金属材质会自动使用很弱的漫反射颜色。

当把贴图导入引擎测试的时候,一定要注意后处理是否开着(辉光,tone mapping等)。后处理影响挺大的,特别是tone mapper(译者注:做Hdr用的)。其实我们有时候测试也开着tone mapper, 但这不太好。

另一个好办法是用一个绕着物体旋转的光源和摄像机,这很复杂,不过效果不错。看 [3]或者 [31].

高光贴图。

高光贴图很简单,一点也不花时间。

在传统的光照模型里,高光贴图一般是一个高分辨率的RGB图,并且配一个高光级数常量。在高级的材质里,也可以用高光技术贴图。而在PBR模型里,艺术家必须换一种思维。高光贴图基本是个常量,光泽图泽是一张高分辨率单色图。而在某些高级材质里,也有用到高分辨率的高光贴图的。 [1].

PBR的一个很牛的优点就是我可以(也应该)用真实世界的材质折射率来计算高光贴图的值。折射率定义了材质的反射高光特征。其实就是在0°的菲涅尔反射率(视线垂直于物体的反射率)。记作F(0°)。也就是我们的高光贴图的值。[1]

注意啊,所有的值都是在线性颜色空间。

有一个公式可以根据折射率来算出高光贴图的值[8]:

比方说,我么知道水的折射率 (1.33) 那么带入公式:

可以算出0.02 就是水的高光色.

绝缘透明材质(水,玻璃,塑料,宝石)的折射率网上都有[2][21]. 但是很多材质比如混凝土,织物,石头,木头网上没找到折射率。并且测试这些物质的折射率也很难。

好的高光贴图的取值范围是:

  • 大于等于 0.02
  • 一般宝石可以取 0.05-0.17
  • 液体可以取0.02-0.04
  • 如果找不到折射率,就取 0.04 (跟塑料差不多 plastic)

除了宝石,大部分绝缘体辞职的高光我们取值在0.02-0.05 [1].

这里有些粒子:

Quartz (石英)   0.045593921

ice     (冰)  0.017908907

Water    (水) 0.020373188

Alcohol  (酒精) 0.01995505

Glass    (草)  0.04

Milk      (奶) 0.022181983

Ruby      (红宝石) 0.077271957

Crystal   (水晶) 0.111111111

Diamond   (钻石) 0.171968833

Skin      (皮肤) 0.028

这些值对艺术家来说不够直观。对于人物艺术家,可以看到皮肤的高光反射是白的(0.028)[10] (这里有人研究了皮肤的折射率 [32]).

金属材质的处理则不同。金属材质的折射率是个复数。 . 也可以带入那个算的公式:

其中是 的共轭复数.

金属的折射率随着可见光谱变化很大。所以仅仅是拿给定波长下的n和k值是不够的。

针对光波的分布需要计算并且转化为RGB值。[1]这片文章说!@$#%#%^(以下给程序看的)

The Fresnel equation needs to be evaluated for each available spectral sample of complex refractive index over the visible portion of the spectrum. This will result in a spectral reflectance with multiple samples. Each spectral reflectance sample then needs to be multiplied with the CIE X, Y and Z color-matching functions as well as the spectral power distribution of the appropriate illuminant (most likely D65). The resulting curves must be integrated and normalized (with normalization constants set such that the illuminant would have a Y value of 100).
Finally, a matrix transform should be used to convert the XYZ values into RGB values with the appropriate primaries (most likely the sRGB/Rec.709 primaries). Gamut mapping of some kind may be needed if any of the RGB values are out of gamut [9].

幸运的是,我在家写了个程序算这个。

You can get this program with source code  here SL-GetSpecularColor (WordPress doesn’t handle zip file, so right click then save target. Then rename extension to “.zip”. Code doesn’t handle error and program require VS2008 runtime).
Usage is really simple: “SL-GetSpecularColor.exe XXX.txt” and you will get a linear color between 0 and 1.
XXX.txt is a file with spectral distribution of complex refractive indices.
Only files downloaded from http://www.filmetrics.com/refractive-index-database are working for now. If you improve the program with other sources, tell me.

用上面那个程序我算出了下面物质的高光值:

R            G            B

Silver(银)      0.971519    0.959915    0.915324

Aluminium(铝)   0.913183    0.921494    0.924524

Gold (金)       1           0.765557    0.336057

Copper (铜)     0.955008    0.637427    0.538163

Chromium(铬)    0.549585    0.556114    0.554256

Nickel (镍)     0.659777    0.608679    0.525649

Titanium(钛)    0.541931    0.496791    0.449419

Cobalt (钴)     0.662124    0.654864    0.633732

Platinum(铂)    0.672411    0.637331    0.585456

你懂的,你不能把时间花在找所有的金属的折射率上。特别是这些值是这对纯的理想粗糙材质( laboratory material.)的。但是这些颜色可以作为参考。而且你会看到,金属的高光值和我们想像的金属的颜色差不多。一个底线是金属的高光颜色必须大于0.5。

我们把高光色保存在sRGB DXT1低分辩率图里。是用sRGB颜色空间的理由是(译者注,在UE4里咱么是用线性颜色空间里):

  • 避免艺术家处理sRGB/RGB 不匹配.
  • 在数值低的时候提供更多细节.
  • 美术可以做不完全黑的高光 (对绝缘体来说).

我们提供了一个参考高光色表给艺术家(sRGB空间的)

高光表可以在这个链接下载 Dontnod specular and glosiness chart.

:
译者注,下面是程序看的。

With normalized lighting model without Fresnel effect like you can choose specular color between and white, as suggested in [8].

You may notice that we don’t use any specular mask texture. Specular texture is no more a scale of specular response. In real world, everything is shiny [3] and this is roughness (low gloss) and low specular color which will allow to mimic “matte” material. However the specular response in fine cavities can be too strong with our lighting model because of Fresnel effect. [1] suggests two way to solve this:

  • Use an ambient occlusion texture to apply on specular term.
  • Modify the Schlick approximation in a similar way as Schüler in [20]: .

For the Schüler case, the assumption is that no real value of specular can be below 0.02. When a value below 0.02 is set in the specular texture, the maximum reached by Fresnel term is below 1.
The drawback of this method is to require a high-resolution specular texture.
In both cases the texture budget increases and we chose to go with these artifacts.

法线和光泽度

最最重要的贴图是法线和光泽度图。

法线和光泽度图需要艺术家花费最多的工作。他们可以添加难以置信的细节。

理想的情况下, 在lighting only模式下游戏应该看起来已经非常好了。

法线:
网上有很多很多怎么创建发现图的方法。由于发现和PBR无关,我们就不在这里讨论了。

:

有些规则适用于大多数发现贴图的创作。我们不需要遵守全部但是大部分要遵守:

  • (程序看的,编码解码法线省贴图)Encoding/Decoding normal. Like for compress/decompress data, the exact reverse of algorithm use to encode the normal should be used for decode it. I know of two engines doing this the right way:
    – Crytek with the help of polybump [12].
    – Naughty Dog with Uncharted 2. Naughty Dog wrote a plugin for XNormal[14] which allows to generate normal map with their encoding method [15]. Naughty Dog’s plugin is based on the awesome thesis of Morten Mikkelsen [13].
  • 大部分法线图都应该是通过高低模的方式来生成(很费时间) [16].
  • 用16位浮点法线管线 [17].
  • 法线修改后要归一化。
  • 在引擎的uv惯例下生成法线图.

光泽度图:

根据我的经验,最难做的图就是光泽度图了。

因为:

  • 网上没有教程 (特别是给pbr做的).
  • 从Gloss算出高光级数在各个引擎里不一样.
  • 值是数值,而不是向量.

光泽度图和法线图是紧密相关的。理想的情况下,光泽度图应该和发现图用同样的方式产生。应该通过雕刻软件比如MudBox或者zBrush。事实上,法线图的凹凸信息可以从光泽度图的高粗糙度得来(低光泽度意味着高粗糙度)。

但是,新的知识需要时间去精通。我们仍然用PS手工创作光泽度图。我们选择光泽度图编码和高光级数范围可以实现感性的线性分布。

这样通过光泽度图,甚至不用法线贴划痕毛孔凹槽的细节也可以做出来。

艺术家需要更频繁的在引擎里测试光照效果。为了方便,我们提供了一整图表(高泽度线性从0到255).

这个图表示高度引擎相关的。

我们法线和光泽度图保存在DXT5高分辨图:

  • 法线和光泽图应该是同样的分辨率.
  • 这样可以保证法线和光泽度图用同样的Mip级别。
  • 这样不用另外一张非线性编码。我们可以把光泽度图放在alpha通道里。(仅限于他们引擎)

Added note:

注:

法线和光泽度图的Mipmapping 仍然是个活跃的研究课题。主要的问题是把光泽度保存为非线性空间,导致mip出错的值。当为两个贴图生成mipmap时,法线的变化应该导致光泽度图的变化。 这样不论距离怎么变化,高光看起来都一致。(译者注,否则离远了物体会显得更光滑)。更多的细节可以参考 Stephen Hill [11] 和Marc Olano [18]. Dan Baker 在 GDC 2011 的会议上做了演讲[20] . Dimitar Lazarov 在 2011 做了一些ppt [31]并且讲了在他们的游戏里是怎么创作光泽度图的.

细节法线和细节光泽图是另外的需要注意的话题。创作者写贴图也不容易。

Reference

[1] Hoffman, “Crafting Physically Motivated Shading Models for Game Development” and “Background: Physically-Based Shading” http://renderwonk.com/publications/s2010-shading-course/
[2] http://www.robinwood.com/Catalog/Technical/Gen3DTuts/Gen3DPages/RefractionIndexList.html
[3] Hable, http://filmicgames.com/archives/547
[4] Epic game, “UDK documentation” http://udn.epicgames.com/Three/TexturingGuidelines.html
[5] “Photoshop CS3 Color Settings” http://www.computer-darkroom.com/ps10_colour/ps10_1.htm
[6] “LCD monitor test images” http://www.lagom.nl/lcd-test/
[7] Adelson, “Checker-shadow illusion”  http://www.michaelbach.de/ot/lum_adelsonCheckShadow/
[8] Akenine-Möller, Haines, Hoffman, “Real-Time Rendering 3rd Edition” http://www.realtimerendering.com
[9] Personal communication with Naty Hoffman
[10] d’Eon, Luebke, “Advanced Techniques for Realistic Real-Time Skin Rendering” http://http.developer.nvidia.com/GPUGems3/gpugems3_ch14.html
[11] Hill, “Specular Showdown in the Wild West” http://blog.selfshadow.com/2011/07/22/specular-showdown/
[12] Crytek, http://crytek.com/cryengine/cryengine2/overview
[13] S. Mikkelsen, “Simulation of Wrinkled Surfaces Revisited” http://image.diku.dk/projects/media/morten.mikkelsen.08.pdf
[14] XNormal, http://www.xnormal.net/1.aspx
[15] Diamant, Simantov, “Character Pipeline: An In-depth Look at the Creation of U2’s Characters” http://www.slideshare.net/naughty_dog/uncharted-2-character-pipeline
[16] Pangilinan, Ruppel, “Uncharted 2 art direction” http://www.slideshare.net/naughty_dog/gdc-final-sliced
[17] Kaplanyan, “CryENGINE 3: Reaching the Speed of Light” http://advances.realtimerendering.com/s2010/Kaplanyan-CryEngine3(SIGGRAPH%202010%20Advanced%20RealTime%20Rendering%20Course).pdf
[18] Olano, “Shiny and CLEAN” http://gaim.umbc.edu/2011/07/24/shiny-and-clean/
[19] Olano, “On Error” http://gaim.umbc.edu/2011/07/26/on-error/
[20] Baker, “Spectacular Specular -LEAN and CLEAN specular highlights” http://www.google.fr/url?sa=t&source=web&cd=2&ved=0CCIQFjAB&url=http%3A%2F%2Fwww.gdcvault.com%2Fplay%2F1014558%2FSpectacular-Specular-LEAN-and-CLEAN&ei=XpVETpDoJoPm-gbrqdyTBw&usg=AFQjCNGC26_xSlrstEqFYHIbLuEAhqU8vg
[21] http://www.luxpop.com/
[22] Hable, “Linear-Space Lighting (i.e. Gamma)” http://filmicgames.com/archives/299
[23] Schüler, “An efficient and Physically Plausible Real Time Shading Model” Shader X7 book
[24] Labounta, “Art Direction Tools for Photo Real Games” Unavailable on gdcvault, sum up here http://stachmo.wordpress.com/2011/03/12/the-epic-gdc11-adventure-day-5/
[25] “The Diffuse Texture and Seamless Textures” http://robertokoci.com/diffuse-texture/
[26] Crazybump http://www.crazybump.com/
[27] Epic game, “UDK documentation” http://udn.epicgames.com/Three/TakingBetterPhotosForTextures.html
[28] Wikipedia http://en.wikipedia.org/wiki/Albedo
[29] Ferguson, “Iterating Realistic Human Rendering: Boxers in FIGHT NIGHT” GDC 2011
[30] http://www.xrite.com/home.aspx
[31] Lazarov, “Physically Based Lighting in Call of Duty: Black Ops” http://advances.realtimerendering.com/s2011/Lazarov-Physically-Based-Lighting-in-Black-Ops%20(Siggraph%202011%20Advances%20in%20Real-Time%20Rendering%20Course).pptx
[32] Tsenova, Stoykova, “Refractive index measurement in human tissue samples” http://www.iomt.bas.bg/page_10/es/publications/References_C/Ref_C24.pdf

【翻译】Feeding a physically based shading model相关推荐

  1. Adopting a physically based shading model

    原文:https://seblagarde.wordpress.com/2011/08/17/hello-world/ With permission of my company : Dontnod ...

  2. Chapter 9 Physically Based Shading

    (个人笔记,由于刚开始学习再加上英语不太好,所以有的地理解的可能不太对,望指正) Chapter 9 Physically Based Shading Physics of Light 在光物理中,光 ...

  3. SIGGRAPH Course: Physically Based Shading in Theory and Practice(PBR渲染技术相关一些课程资源和文章)

    原文:https://blog.selfshadow.com/publications/s2015-shading-course/#course_content 相关资源请见以下列表 [2015] P ...

  4. 《Real-Time Rendering》第四版学习笔记——Chapter 9 Physically Based Shading(一)

    一.光的物理特性 光与物体的交互形成了基于物理着色的基础. 在物理层面上,光的模型为电磁横波.每个波都有一个单一的波长λ\lambdaλ.具有单一波长的光叫单色光(monochromatic ligh ...

  5. 《Real-Time Rendering》第四版学习笔记——Chapter 9 Physically Based Shading(二)

    上接文章:<Real-Time Rendering>第四版学习笔记--Chapter 9 Physically Based Shading(一) 六.微观几何 每个可见的表面点都包含了很多 ...

  6. 《Real-Time Rendering》第四版学习笔记——Chapter 9 Physically Based Shading(三)

    前文: <Real-Time Rendering>第四版学习笔记--Chapter 9 Physically Based Shading(一) <Real-Time Renderin ...

  7. AMD Cubemapgen for physically based rendering

    JUNE 10, 2012 57 COMMENTS Version : 1.67 – Living blog – First version was 4 September 2011 AMD Cube ...

  8. GraphicsLab Project之基于物理的着色系统(Physical based shading) - 基于图像的光照(Image Based Lighting)(Diffuse篇)

    作者:i_dovelemon 日期:2018-01-21 来源:CSDN 主题:PBR, Equrectangular Map, Cube Map, Irradiance Map, HDR Image ...

  9. 什么是Physically Based Rendring基于物理的渲染?

    什么是Physically Based Rendring基于物理的渲染? PBR不是一种技术,而是一种渲染方式 PBR的优点 什么是Physically Based Shader? 材质的光学特性 微 ...

最新文章

  1. [ADB]ADB(Android Debug Bridge)简介及基础(不包含命令)
  2. 信息表示和处理 from computer system chapter 2
  3. 【收藏】误删idea 的.iml文件后的处理方法
  4. boost::hana::is_convertible用法的测试程序
  5. requestURI的组成部分
  6. 模块 hashlib模块
  7. Bitmap添加文字水印
  8. Java SE、Java EE、Java ME三者的区别
  9. C++学习之路 | PTA(天梯赛)—— L2-013 红色警报 (25分)(带注释)(并查集)(精简)
  10. spark 序列化_spark shell 配置 Kryo 序列化
  11. typedef 浅析
  12. GitHub 60000+ Star 登顶,命令行的艺术!
  13. 单片机歌曲代码大全_对于 51 单片机的四大误区!
  14. Embedded ProC(嵌入式ProC)与Tuxedo中间件
  15. 关于苹果ID用哪些邮箱注册比较好安全?
  16. CTF比赛解析备课与教学:漏洞扫描
  17. 用电脑看epub电子书用什么阅读软件好?
  18. 【模型开发】评分卡应用
  19. 亚马逊广告CPC优化技巧 投放就有效
  20. GZOI2019GXOI2019 滚粗记

热门文章

  1. 深度学习-卷积神经网络(CNN)
  2. 地狱开局的2022,穿好你的安全铠甲
  3. ❤leetcode,python2❤最大子序和
  4. 配置虚拟机主机名并建立与本地主机的ip映射关系
  5. 【树莓派】了解wiringPi库、控制继电器
  6. java生成world文件_Java导出World文档(入门)
  7. winbox软路由安装和命令
  8. 重磅并购频现大风口下光伏企业待重新估值
  9. c#制作一个屏幕保护程序
  10. dllcache“转移”到别的盘