文章目录

  • 光是一种电磁波
  • 描述光的物理量
  • 光谱功率分布
  • 光度函数
  • 光度测量
  • 三色视觉理论
  • 色光混合与颜色空间
  • 用RGB色渲染
  • Gamma空间和线性空间
  • HDR

读书笔记,如有错漏,还望指正!

光是一种电磁波

光其实是一种电磁波,波长从10pm(1埃,十分之一nm)的伽马射线到上千公里的无线电。人眼可感知的光叫可见光,只是这一整段波长中的一小段特定波长的光,从400nm的紫色光到700nm的红色光。蓝色光往短波延申即紫外线,红色光往长波延申即红外线。

注意,上面这张图中的颜色并不是我们所能识别的所有颜色。上面的每种颜色都是单色,即单一波长的光所呈现在眼睛里的颜色,这种光是单色光,也叫光谱色,表示它出现在上述的光谱中。

描述光的物理量

以下有几个用以描述光的物理量

名称 符号 单位
radiant flux,辐射功率 Θ watt(W),瓦特
irradiance,辐照度 E W/m^2,瓦特-每平方米
Radiant intensity,辐射强度 I W/sr,瓦特-每球面度
radiance,辐射亮度 L W/(m^2sr),瓦特-每平方米球面度

这些物理量都是从能量角度去描述光的(瓦特的单位是焦耳-每平方米)。他们分别描述了光在单位时间内通过截面或者立体角的能量。

光谱功率分布

光谱功率分布(SPD,Spectral power distribution)是从能量去描述一束光。我们日常所见到的光往往都不是由单一波长组成的,这束光内包含的不同的波长的光能量不同。这束光在波长上的能量分布就是这束光的光谱功率分布,它是一束光的身份证或者唯一标识。下面是两种激光和D65标准光源的光谱功率分布。可以看到激光的光谱功率分布非常窄,接近严格意义上的单色光。

光度函数

光度函数(相对视见函数)。我们常说人眼对绿色最敏感,其实就是在陈述一个事实:人眼对不同波长的光的敏感度不同。这个敏感度是指:不同波长的光,相同的辐射功率,对人产生的视觉效果不同。由此可见,可见光就是视见率大于0的电磁波。明视下(photopic,指在明亮环境下的视觉)人眼对555.01nm波长的光(绿色)最敏感,并设敏感度为1,以此为标准去度量其他波长的光的敏感度可以得到一个 敏感度-波长 分布函数(下图黑色线),同理暗视下也可以得到一条分布函数(下图绿色线,峰值在498nm),这两者统一起来就是光度函数(相对视见函数)。光度函数描述了光在人眼上产生的实际效应,这种效应的差异是由人眼的结构所决定的。下图黑色部分有三条线,其实是明视色度函数的三种标准,其中实线部分是CIE(国际照明委员会)标准。

光度测量

现在我们有了一套物理上衡量光的方法,还有一个光度函数。我们以光度函数为不同波长下的光的权值,对上述提到的四种物理量进行加权,即用原单位乘以光度函数上对应波长的敏感度,得到一个新的物理量,这个物理量从真实物理的角度结合人眼感知的效果去描述一束光。下面是上述四种物理量在用光度函数加权后得到的新的物理量对应表:

辐射测量学单位 光度测量学单位
radiant flux: watt (W),辐射功率:瓦特 Luminous flux: lumen (lm) ,光通量:流明
Irradiance: W/m^2,辐照度:瓦特-每平方米 Illuminance: lux (lx),照明度:勒克斯
Radiant intensity: W/sr,辐射强度:瓦特-每球面度 Luminous intensity: candela (cd),发光强度:坎德拉
Radiance: W/m^2sr,辐射亮度:瓦特-每平方米球面度 Luminance: cd/m^2 = nit,亮度:尼特

三色视觉理论

三色视觉理论(Trichromacy)在19世纪末被提出。这个理论解释了人眼关于接收光的一系列机理,其中就包括上述人眼对光的敏感度现象的解释。这个学说简单描述就是:人眼视网膜上存在三种视锥细胞:感红视锥细胞,感绿视锥细胞和感蓝视锥细胞,这三种细胞分别对红色,绿色和蓝色光的刺激反应强烈,当受到光的刺激的时候,这三种细胞分别通过对应的三种神经纤维:感红神经纤维,感绿神经纤维,感蓝神经纤维向大脑传递不同信号,这三种信号在大脑中的最终效果就是我们所看到的彩色的画面。学名上这三种细胞叫L/M/S细胞,即分别对Long/Middle/Short三种波长敏感的细胞。

每种细胞对不同波长的敏感度不同,例如感红视锥细胞的敏感度在红光附近达到峰值。我们将三种视锥细胞对光的敏感度以波长为变量绘制成图,这个图就是人眼的三刺激值曲线图。

横轴是波长,三个不同颜色的曲线表示红绿蓝细胞对不同波长的灵敏度。注意,这里的灵敏度是相对灵敏度。因为三种细胞的峰值不应该是一样的,但这里统一做了归一化。峰值灵敏度定为1。从横轴任意一点向上画一条线分别与三个曲线相交可以得到三个交点,交点的三个Y轴值记为(rho, beta, gamma),它表示当前波长的光对应的三种视锥细胞的灵敏度。

色光混合与颜色空间

在18世纪的时候,艺术家们就知道通过少数的几种颜料相互混合就可以作出色彩丰富的画。尽管现在我们知道颜料混合和色光混合不是一回事,但是这也提示了科学家们去探讨通过少数单色光去混合其他色光的可能性。格拉斯曼定律就是这个领域的一个成果。注意,这个定律只是个经验定律,它的提出没有依托严谨的科学论证。但是不妨碍我们使用它,因为至少是经验正确的。格拉斯曼定律的完整表述如下:

  1. 两种颜色外观上看起来不同当且仅当他们的色调,明度和饱和度不同。推论:每一种色光存在他的补色光,使得他们混合之后能够相互抹平光谱功率分布上的凹凸,从而得到一种无色光(灰色或者白色)。

  2. 混合色光的外观会随着组成它的色光变化而变化。推论:两种非互补的色光的色调会随着组成它的色光的强度变化而变化,而饱和度会随着组成它的色光的色调差距变化而变化。

  3. 存在两种不同光谱功率分布的光,但它们看起来是一个色光。推论一:将这两种光同时添加到另一个色光得到的混合色看起来是一样的;推论二:从任意一种混色光中分别剔除这两种光,得到的新的色光看起来是一样的。

  4. 混合光的强度是各个组成部分强度的总和。

从格拉斯曼定律我们再整理一个结论,就是我们可以通过选取几种简单的色光,然后通过不同强度的混合,得到其他色光。上个世纪科学家们通过一个实验做了这样一个尝试:在左侧,每次选取一种光谱色。在右侧,总是选定相同的三种光谱色,即所谓的三原色,然后调整三原色的强度,使得他们混合的结果匹配左侧的色光。如下图:

然后将结果绘制成图。以波长为轴,然后将每种波长所需的三原色强度绘制成曲线,得到下图:

这就是色匹配函数图。从某个波长向上画一条垂线与三个函数相交,这三个点的Y值(r, g, b)就是混合成当前波长的色光所需的三原色强度。注意:红线有负值出现。这是因为不是所有的色光都能从三原色相加而得。在这种情况下,麦克斯韦尝试将红色光移到左边,对左侧的光进行逆向补偿,然后调整右侧的两个原色重新匹配。此时变成了 待匹配色光 + r = b + g,即待匹配色光 = b + g - r。所以这种情况下红光会出现负值。

注意,在光谱上选取的三原色不同,色匹配函数也不同。我们可以将第三种原色(上图中的Blue)的波长往长波调整,得到一个新的颜色匹配函数,如下图。是的,依然有负值,此时负值在蓝色线上。实际上,可以证明,对于使用真实色光作为三原色的颜色空间,它的颜色匹配函数中至少有一条线存在负数部分。

色匹配函数上三个函数都在处于零的时候,表示当前波长的光无法被三原色表示。可惜的是,即使我们不断谨慎调整三原色的选取,总有一部分颜色我们无法用三原色混合出来。即三原色体系下能够混合的颜色色域是有限的。上面使用RGB三种特定波长所能够表示的所有颜色构成一个颜色空间,即RGB色彩空间。现在可以给出两种结论:一是如果我们将三原色选得太近,得到的可表示色域就非常小。二是如果我们使用的原色更多,不是三原色,而是四元,五元甚至更多,则我们可以表达更广色域下的光。我们甚至可以不用光谱色做原色。

为了处理色匹配函数中的负值,同时尽可能大地包含可描述的色域,CIE用数学方法构造了三种“不存在”的光,这三种光用以作三原色的色匹配函数有几个特点:不存在负值,所以在程序上很好处理;和三刺激值有很好的对应关系。CIE将这三种虚拟光分别命名为X,Y,Z,对应的由这三种虚拟光构成的色彩空间就是XYZ色彩空间。它与上面的RGB色彩空间存在一个线性映射的关系。

这个新的匹配函数和三刺激值能较好地对应上,这带来了XYZ不同的含义:XYZ不再代表颜色。回忆之前提到格拉斯曼定律的时候提到,虽然我们人眼通过感知RGB三个分量的光在大脑中综合出现实中的彩色世界,但是我们大脑并不能清楚地表述出当前颜色的RGB分量是多少。人类只能感知颜色的三种属性的变化:明度,色调和饱和度。其实XYZ色彩空间就是以明度,色调和饱和度为基底的色彩空间。在这里,Y就表示明度,XZ共同决定色调和饱和度,我们将色调和饱和度统称为色度(chromaticity)。例如从sRGB色彩空间到XYZ色彩空间转换的时候:
Y=0.2127∗R+0.7152∗G+0.0722∗BY = 0.2127*R + 0.7152*G + 0.0722*B Y=0.2127∗R+0.7152∗G+0.0722∗B
直观上解释,每种色光对总体明度都有贡献度,但是因为人眼对绿色光最敏感,所以G的权重会很大。

顺便一提,明度,色调和饱和度其实不是什么玄乎的主观名词。从SPD量化这些名词的话,SPD中的曲线越高,表示光的能量越高,明度也越高。SPD曲线中占主导地位的色光就是当前光的色调。SPD曲线中占主导地位的色光的比例越高,则光的饱和度越高。

但无论如何,XYZ都是只在数学上存在的概念,它不像RGB色彩空间那样有现实的物理对象的对应。所以它可能比较难以理解,但是它方便计算,就足够了(在我查阅的众多资料中,有篇论文提到,XYZ其实现实中可以被产生,但我们会看不见它,即它至少不是可见光)。

同样的,我们建立一个XYZ三维坐标系,然后将光谱中所有对应的点在坐标空间中标出来,得到如下图:

在得到的曲线上,任意选择两点,连一条线,线上的每一个点都表示我们人眼所能看到的某些颜色。所有这些点组成的集合会形成一个体积,即XYZ色彩空间。但是我目前找不到一张很合适的图。为了能够更加方便地使用XYZ色彩空间,科学家们选择将其进行降维。即投影到X+Y+Z=1的平面上,之后再将这个平面投影到原本的Z=0平面上,得到二维的XYZ色彩空间,这张图亦称作CIE 1931 色度图:

这个马蹄形弯曲的部分就是光谱色组成的线。这张图还有以下几个特性:

  1. 图中任意选择两点(两个颜色),它们连线上的所有点就是两种颜色所能混合出的所有颜色;

  2. 任意选择三点组成的三角形内部的所有点,就是以这三个点为三原色所能混合出的所有颜色。

上图中的三角形就是sRGB所表示的色彩空间,黑色的点表示sRGB色彩空间中定义的白点。除了这个色度图之外,书中还提到了另一种色度图,它对应的是与XYZ所不同的色彩空间,即CIE 1976 UCS色度图:

这个色度图是为了弥补XYZ色度图的一个缺点:色度图中人眼可感知的两对颜色可能距离相差20倍。这种缺点是明显的,比如左上的绿色区域有大片难以分辨的绿色,从中挑选两个能够分辨的最近的点对距离可能会相隔很远。相比之下,CIE 1976 UCS就均匀得多。而sRGB色域在这个色度图的范围如上图中红色三角形所示。除此之外,上图还列出了其他几种色域,不同色域能够表达的色彩空间可能是不一致的。不同的设备可能兼容不同的色域,在色域与色域之间转换就需要涉及到色域映射了。

除了上述提到的RGB和XYZ色彩空间,还有两个色彩空间也需要提及:CMY和HSV。

CMY相当于 1-RGB 的结果。在RGB中,各分量越大,越接近白色,被称为加色空间。所以CMY中就相反,(0,0,0)表示白色,称为减色空间。这种色彩空间往往应用于印刷领域,这是因为颜料的混合和色光的混合是相反的结果。红色色光和蓝色色光混合,那混合光中光谱能量分布的红色部分和蓝色部分都会增大。但是红色颜料之所以呈现红色,是因为它对红色以外的色光吸收较强,所以红色颜料和蓝色颜料混合的结果只能是红色色光被蓝色颜料部分吸收,蓝色色光被红色颜料部分吸收,从而整体往黑色演进。所以色光三原色混合的结果是白色,而颜料三原色的混合结果是黑色。

HSV色彩空间和XYZ很相似,三个分离分量也不对应显示物理中的色光。H(Hue)表示色调,S(Saturation)表示饱和度,V(Value of Brightness)表示亮度。这个色彩空间解决的问题是,在RGB色彩空间中,给定三个分量的值,我们依然很难描述出这个颜色,尤其对画家很不友好。

注:关于这一节的内容很难理清思路,因为它涉及到很多历史问题,很多标准以及讲不清的人体视觉机理。这里推荐一本北京理工大学出版社的《高等色度学》,当当订购第二天到。但,依然远远不够。

用RGB色渲染

这个标题其实是一个疑问句:用RGB三色去渲染真的没有问题么?

写过shader的同学一定很熟悉,当我们给想要渲染一个物体的时候,是这样计算它到达相机的颜色的:albedo * light_color。其中albedo即反照率,它从附着在物体上的纹理采样RGB。同时light_color也是一个RGB值。这是一个典型RGB渲染器的工作原理。它的意思是,按照色光混合定律,任意一种色光被拆解成了RGB三个分量,所以RGB表示光的颜色没有毛病。然后再乘以物体表面的RGB值,这里的RGB每个值都处于[0, 1]区间。物体表面的RGB值越高,表示它反射对应的色光越强烈。显然,如果一个物体RGB = (1,1,1) 的时候,物体在日光下应该呈现白色,因为它反射所有分量的光。当它接收只有R分量的色光照射的时候(0.8,0,0),两个向量各分量相乘,得到(0.8,0,0),所以物体白色物体被有色光着色将呈现有色光的颜色。这,很符合直觉。

然而,将物体表面的反射光谱功率分布描述成反射RGB分量的光还是太过简化了。书中举了个简单的例子,如下图:

上图是照射在物体表面的光的光谱功率分布,下图是两种物体表面的反射光谱功率分布。显然,这两种物体将呈现不同的颜色:第一个物体因为只反射三种窄波段的光谱,所以入射光光谱功率分布左侧的波峰被抹平,反射光将呈现更少的短波分量,出射光会比入射光看起来更“暖”;而第二种物体反射光谱功率分布较均匀,可以认为它的出射光和入射光色调是一致的。

上图中的两种反射光谱功率分布有现实背景。第二种反射SPD可能是我们见到的大多数物体,第一种可能是设计用于激光投影仪的屏幕材料。

RGB渲染器下的物体就是第一种物体,它只负责计算是否反射RGB三个分量。在极端的情况下,RGB渲染器会产生严重的错误。实际上,正如上面所说,想要得到正确的结果,应该对物体的反射光谱功率进行密集采样,然后计算每个波长被反射的情况。这种时候光也不能简单地用RGB三色混合表示了,因为我们说过:两种不同光谱功率分布的色光可能呈现的是相同的颜色。但,显然,这很消耗计算量。这种基于光谱功率分布进行渲染的技术叫光谱渲染/光谱成像。这种技术不仅会用于渲染,而且已经在影视和遥感领域有重要应用。

Gamma空间和线性空间

线性空间就是数学上的那个原本的意思。这个空间至少会满足以下加法定律和乘法定律:
f(a+b)=f(a)+f(b)f(ka)=kf(a)f(a+b) = f(a) + f(b)\\f(ka) = kf(a) f(a+b)=f(a)+f(b)f(ka)=kf(a)
假设f(x)表示能量为x的光产生的明度是f(x)f(x)f(x)。那么两个相同能量的光共同作用可以产生两倍的明度,即f(2x)=2f(x)f(2x) = 2f(x)f(2x)=2f(x)。自然界中的光就是如此。然而反应到人眼却不是这样的。在一个房间里点亮一根蜡烛,人眼感受的变化为ΔYΔYΔY,然后再放上一根同样的蜡烛,人眼感受到的第二次变化就小于ΔYΔYΔY。这说明:人眼对于明度的变化不是线性的,相同能量的变化不一定会产生人眼感受到的相同的明度变化。再举一个例子,打印出一张从黑色到白色均匀变化的渐变带,这里的均匀变化是指人眼看到的均匀变化,所以我们所感受到的中灰色应该是在这个渐变带的中间:

物理上的中灰色部分的反射率应该是白色部分的反射率的一半,所以渐变带中的中点的反射率应该是纯白部分反射率的一半。然而事实上并不是,物理角度的中灰在渐变带靠近黑色端的1/5处左右。这意味着:人眼所感受到的明度会比物理实际偏亮。

以物理上的明度增长为x轴,人眼所感受到的明度增长为y轴,可以得到一条曲线:

这条曲线大致是一个幂函数,记为 Output = Input ^ γ。这里的γ取值大约是1/2.2。

但这不要紧。我们正常地对从物理世界接收到的光强进行编码,然后正常地按照编码显示出来就是我们人眼所感受到的“非线性”的世界。但问题依然没有这么简单。假如我们从0-N进行编码,N表示显示器所能表达的最高亮度。我们将从物理世界中接收到连续的亮度映射到离散的编码中,并将它一一在0-N上进行编码,因为是物理光强-亮度是线性的,所以编码也是线性的。这意味着编码增大一倍,所表示的亮度也增大一倍——至少从物理角度上是这样的,如下图。

但是人眼不这么认为。因为人眼接收到的物理世界是非线性的,所以我们所感受到的编码的亮度是这样的:

在实际物理中你认为你有50%在对暗部进行编码,50%对亮部进行编码。而人眼因为看到世界会比实际更亮,它会认为你花了更多的编码在亮部上。

如果你有足够多的bit编码,这没有问题。但是如果编码bit很少的情况下,因为暗部的编码不足,会导致图像中暗部部分会出现色调分离。因此,我们需要对编码重新安排。我们需要对物理中的光强的暗部安排更多的编码,从而呈现到人眼的时候,看起来是编码均匀的。这一步就是图片存储的Gamma编码(γ=1/2.2)。它整体将图片的数值变大,表现上就是图片变得更亮了。做了这样一层映射之后,原本由0.5编码表示的中灰阶现在由一个大于0.5的编码表示,即用来表示暗部的编码变多了。

但故事还没有完,上面这个事实只是说明为什么我们需要对图片进行Gamma编码,但是并没有说明γ需要取多少值合适。我们还需要提及另一个跟γ息息相关的东西:阴极射线管(CRT)。阴极射线管是最早被应用的显示技术,这种技术会在阴极发射电子,然后通过横向和纵向电压改变电子束的方向,从而将电子轰击在屏幕上的每一个像素。很可惜,阴极射线管的明度变化也不是线性的。意思是说,在阴极所施加的电压增大两倍,得到的明度并没有也增大两倍。以电压增长为x轴,实际明度为y轴得到一张图,就是阴极射线管的电压-明度特性曲线:

这条曲线就很有意思,因为它大致也是一条幂函数,更有趣的是,它的幂值与上面的人眼明度曲线的幂值的倒数非常接近。这意味着,如果我们图片Gamma编码时,取值γ=2.2,那在显示器上显示的时候,因为显示器的这个非线性缺陷刚好帮我们做了Gamma解码。

当然现在的显示器已经不是CRT了,显示上的光电特性可能尽管不是线性的,但是γ值可能不再是2.2。但是这不要紧,因为CRT在显示领域的重要地位,现在的显示器都会在硬件上兼容这一特性。

因为Gamma编码是sRGB的标准之一,所以采用sRGB的图片存储都是经过Gamma编码的。这也是为什么有些文章会说,关于sRGB需要记住这是一个非线性的空间。

但如果图片是用作渲染的,我们不能指望要到显示阶段再依靠显示器给我们解码,因为非线性编码是不能直接参与加法运算的。所以Gamma空间的纹理到渲染管道里一般都需要经过一次解码,所有的运算都是在线性空间中做,渲染好之后重新编码,最后显示器再解码输出。

HDR

HDR是高动态范围(Hight Dynamic Range)的缩写。动态范围在信号学中用来描述可变信号的最大值和最小值的比值。在这里表示设备能够显示的最大亮度和最小亮度的比值。因为显示器只有256bit来表示亮度范围,但是自然界动态范围高达10^8,我们无法在保证亮度精度的情况还要用这么少的位宽去存储这么高的亮度范围。

当摄影设备接收到这么大的动态范围的亮度的时候,如何将这些光信号转化成有限的短缺的编码资源是一个难题。如果只有少数几个点特别亮,为了能够容纳这些所有亮度而将接收到的亮度取对数平均然后分布在编码范围里,就会导致其他正常的点变得很暗(平均值倾向于往极值的方向偏移)。色调映射就是为了解决这样的难题。关于色调映射主要有两种算法:全局算法和局部算法。两种算法各在性能和效果有长短,但他们都致力于解决上述问题,并尽可能保留图像的细节和对比度。

在实时渲染领域,显示器的客观限制让显示器无法真实表达超出自身的亮度范围。但是HDR渲染有时会允许这种超亮的区域的亮度值大于1,渲染会对亮度大于1的部分做泛光处理来模拟超亮的部分。这种情况往往出现在强烈反光的地方,甚至模拟人从黑暗地方走向明亮地方的视觉适应过程。

【实时渲染】实时渲染中的光与颜色相关推荐

  1. KeyShot 实时光线追踪三维渲染软件

    一款很好的3D渲染软件可以给你惊人的视觉效果. KeyShot是一款为即时显示结果的实时3D渲染软件,减少了创建产品的时间.KeyShot因其速度,易用性,科学准确的材质,和先进的材质编辑能力而受到世 ...

  2. 3D渲染技术分享:实时3D水面渲染(反射、折射、水深与水岸柔边)

    一.开篇 自从上次写了**<用实时反射Shader增强画面颜值>** 后,不少开发者开始尝试用它来渲染水面,但效果都差强人意. 这是因为,水面除了反射,还有许多细节需要考虑. 在此之前,也 ...

  3. 实时体积云渲染(地平线):三.云体渲染

    实时体积云渲染(地平线):三.云体渲染 体渲染 最常见的体可视化方法就是Ray-marching法.该方法如下图: 在像云这样的部分透明的介质的情况下,采样点将沿着视线进一步增加到场景中,并增加固定的 ...

  4. 实时体积云渲染(地平线):一.云的生成

    实时体积云渲染(地平线):一.云的生成 体积云一直是想尝试的一个东西,最近终于有点自己的时间,花了些功夫实现了"地平线"里用到的体积云算法.实现效果图如下(未加大气散射有空一定补上 ...

  5. 实时体积云渲染(地平线):二.Perlin噪声和Worley噪声

    实时体积云渲染(地平线):二.Perlin噪声和Worley噪声 Perlin噪声 Perlin噪声同样是网格点噪声的一种,不同于之间在网格点生成随机值的白噪声,Perlin噪声在网格点生成一个随机的 ...

  6. Renderbus瑞云渲染正式支持UE云渲染!离线渲染+实时渲染=渲染起飞!

    2022年已经到了尾声,回顾今年CG圈里最具讨论性的话题,除了AI绘图,就是虚幻引擎了,这两者如同一股风潮,从概念创意到后期制作,一路以"席卷"之势影响到了视觉领域的各个行业. R ...

  7. 微信小程序渲染实时时间

    微信小程序渲染实时时间 1.看看在框架目录中是否有util文件夹,它用来存放工具栏的JavaScript函数 2.在要获取时间的.js文件中加载util.js文件 3.在onload方法中,调用uti ...

  8. 十分钟时间搞懂怎么用JS代码渲染实时时间

    给大家讲一下怎么用JS初级的内容来写一个页面实时渲染时间的方法 目录 先给大家看一下展示一下效果吧 一.在这个效果上用的Date对象的方法 二.这个效果的逻辑思路是什么呢? 1.我们应该先实例化一个D ...

  9. 基于对象的实时空间音频渲染丨Dev for Dev 专栏

    本文为「Dev for Dev 专栏」系列内容,作者为声网音频算法工程师 李嵩. 随着元宇宙概念的引入,空间音频这项技术慢慢映入大家的眼帘.关于空间音频的基础原理,我们做过一期科普视频 -- 「空间音 ...

最新文章

  1. linux shell输出数字小数点前少了0_南京课工场IT培训:SHELL 超详细基础知识,适合新手小白(一)
  2. 关于计算机的英语作文300,关于大学英语作文300字7篇
  3. mysql caching_sha2_password异常分析
  4. iOS:项目中用到的Cookie
  5. 统计mysql binlog日志总大小
  6. 《SpringBoot实战》笔记1
  7. 8、Python车牌数据集自动生成及其图片叠加
  8. 小灰的算法之旅python篇pdf_漫画算法 小灰的算法之旅 Python篇
  9. RubyOnRails 学习网站
  10. C++ Json解析库Jsoncpp下载+编译+使用
  11. 半导体封装测试英语词汇量的软件,半导体英语
  12. MATLAB绘制地形图和等高线图
  13. 用PyAV完成视频解码之后,如何完成视频分辨率的转换?
  14. Windows安装RabbitMQ的时候出现Plugin configuration unchanged
  15. uni-app 开发小程序,使用到u-charts.js时会出现弹框或下拉框部分与图标重叠的情况(还有在解决过程中出现 vasToTempFilePath: fail canvas is empty)
  16. 使用jekyll写博客
  17. 速来了解头条号的推荐机制,让你的自媒体内容收下更多数据量!
  18. 无线网络技术复习整理——第二章
  19. HCIP考试考哪三门你知道么?
  20. 一个小小的互联网创业狗的自白

热门文章

  1. 多层神经网络 ——小批量梯度下降法
  2. 03_使用scrapy框架爬取豆瓣电影TOP250
  3. Invalid default value for ‘updated_at‘
  4. mini2440中nand falsh的使用
  5. 【板栗糖GIS】CAD照片底色为黑色如何调整为白色
  6. 计算机桌面输入法没有了怎么办,电脑的输入法找不到图标了怎么办
  7. 面阵相机靶面详解and镜头选择andFA镜头视野计算
  8. 【TcaplusDB君】 行业新闻汇编(5月25日)
  9. 运筹学 —线性规划总结
  10. 知网 万方 论文免费下载方法