Anaconda下安装Talib库[转]

1、 如果你的系统是x64平台,直接使用命令pip install talib安装,会报错。 原因在于python pip源中TA-Lib是32位的,不能安装在X64平台上, 而从TA-Lib的官网 http://ta-lib.org 下载的安装包其实也是32位的,如果你的系统平台是64位的,一样无法正确安装。

正确的方法是下载64位的安装包,本地安装,64位安装包官网并没有提供,必须自行下载。

talib库有很多第三方库,安装的时候尽量找靠谱的源。

加州大学的python库:Archived: Python Extension Packages for Windows – Christoph Gohlke (uci.edu)

按ctrl+F键 页面搜索 Ta-lib 即可找到

2、 注意要下载自己python版本所对应的文件, 所以选择 TA_Lib-0.4.19-cp38-cp38-win_amd64.whl

否则后续安装又会报错 “ERROR: TA_Lib-0.4.19-cp39-cp39-win_amd64.whl is not a supported wheel on this platform.”</p>

把TA_Lib-0.4.19-cp38-cp38-win_amd64.whl 放在Anaconda工作文件夹下面, 然后直接敲命令 pip install TA_Lib-0.4.19-cp38-cp38-win_amd64.whl

你会发现成功安装~

Unity线性空间和伽马空间(转)

为什么我会想起来写这篇博客呢?缘起于项目中做PBR时,美术来问出贴图是要出线性空间贴图还是伽马空间贴图,经过一番纠结与查证后,项目终于切到了线性空间,而贴图则是能出线性空间优先出线性空间,出不了的出伽马空间也行。至于为什么也行,就是本篇博客所要讲述的内容。

首先要来解决第一个问题,什么是伽马空间,什么是线性空间?线性空间好理解,颜色按照线性渐变的空间即是线性空间,我在网上看到一个举例很有趣,想象一个纯黑墨水的池子,往里面滴一滴白色颜料,随着白色颜料不断的滴入,墨池会越来越白直至变成白色,而记录每次滴入颜料后墨池的颜色变化,即是一个从黑到白的颜色线性渐变过程。既然有线性渐变,那么肯定就有非线性渐变,而伽马空间正是这样一个颜色非线性渐变的空间。为什么会发生这样的事呢?

一个流传甚广的版本表示,这是由CRT显示器引起的。由于CRT显示器对于输入的电压和显示的亮度并不呈线性关系,而是一个类似幂律曲线的关系,一般来说,这个曲线的指数部分称作伽马值,为2.5。显示器有这样的特性后,一个正常颜色输入进去显示出来会变暗,我自己拉了个图来说明下

这是个

y=x^{2.5}

的幂律曲线,如果颜色输入值为0.5,那么输出值大概为0.176左右,更接近黑色。所以输入的颜色在输出时会变暗。为了解决这个问题,图片在被采集时会做一个逆向操作,如果颜色为0.5的话先逆向

0.5^{1/2.5} \approx 0.757

然后

0.757^{2.5}

就会回到0.5了。这里我们用到了两个伽马值,1/2.5和2.5,他们分别称为encoding gamma和display gamma,通过下图展示他们的用处。

encoding gamma通常在图片生成时(比如说拍照拍出来的照片,PS新建的图片等)就已经存在,而display gamma又是显示器自带的特性(当然现在的显示器不再是CRT,所以display gamma可能不是2.5,不过为了兼容性厂商还是会把以前的2.5伽马值加入),他俩相乘称作end-to-end gamma,如果是1的话那么真实场景被捕捉的亮度和显示的亮度是成比例的。然而,Real Time Rendering一书指出了乘积为1的问题。一是我们人眼看到的真实场景的亮度与显示器所能显示的亮度差了好几个数量级,说白了显示器所能显示的颜色精度根本达不到真实场景的精度;二是周围环境影响,我们的视野在看真实场景时是由真实场景所填充的,而在看显示器时视野除了被虚拟场景包围,还会被真实场景包围。这样两个差别导致了end-to-end gamma是1的话并不能保证显示的亮度和原始场景的亮度是一致的。书中推荐,电影院那种漆黑的环境为1.5,在明亮的室内为1.125。

我们通常用的sRGB标准的encoding gamma大概为0.45(1/2.2),这是为了配合2.5的display gamma,因为0.45 * 2.5 = 1.125。当然,显示器的display gamma大部分值还是设为2.2(这里有个网站,可以看在不同的伽马值下图片所表现的不同准确的伽玛 2.2 及预设 5 种伽玛值设定),这样1/2.2*2.2 = 1。

当然冯乐乐前辈还提出了来自其他领域对于伽马的解释,以此来论证伽马值存在的必然,不管如何,伽马空间中的颜色并非线性渐变,而是呈一条曲线变化。

那么我们在做PBR时,为什么要纠结到底用伽马空间还是线性空间呢?PBR全称为Physically Based Rendering,既然是基于物理的渲染,那么我们做渲染时对于贴图采样出来的值必定要是和真实环境下相同的值才行,而采用了伽马空间的话贴图中颜色会被encoding gamma所改变,shader中采样出来的颜色值和真实环境下的值是不一样的,这样怎么能称为基于物理的渲染呢?

我们以人的皮肤渲染来举例子,皮肤贴图的r通道的值通常会高于其余两个通道的值,那么在伽马校正后(即对原始值做一个伽马次方的操作),这种差异会被进一步的放大,再做光照计算,你会发现r通道的值提升的异常的高。

上图左边是线性正确值,右边是渲染时带着伽马值,那么提升光的亮度会迅速的曝光。

而当这种差异被拉大后,你会发现在眼皮轮廓的地方会出现蓝黑色的痕迹,如下图


所以在做PBR渲染时,使用线性空间是非常有必要的。

而我们纠结的点在于,把Unity引擎切到线性空间的话,之前所有美术的资源都是在伽马空间下制作的,会不会有问题?实际上是有问题的。

当我们把Unity从伽马空间切换到线性空间时,引擎里面我们需要勾选一个东西,这样伽马空间的资源也能使用了。

勾选了图中的sRGB后,其实引擎为我们做了一个工作,在采样这张图片的时候会调用OpenGL ES3.0里的sRGB Sampler接口,将贴图中被encoding gamma所改变的值还原,这样我们在shader中做的任何计算就是基于物体在真实场景中的颜色了。算完以后当我们要把颜色输出到显示器时,显示器因为自带display gamma,我们无法抹去这个东西,所以引擎又为我们做了一件事,调用OpenGL ES3.0里的sRGB Frame Buffer接口,将计算得出的最终结果用encoding gamma算好,用以抵消display gamma的影响。

那么在线性空间底下使用伽马空间资源会有什么问题呢?透明混合会出问题。我们知道透明混合的时候dst color在frame buffer中,而颜色在线性空间下进入了frame buffer引擎会调用sRGB Frame Buffer接口做一个pow0.45的操作,而透明混合时明显需要线性空间的颜色,因为src color还没进frame buffer,没做过pow4.5的操作。所以这里在把dst color从frame buffer拿出来时,会做一个pow2.2的操作回到线性空间,然后做透明混合,得出结果后再做一遍pow0.45。

假设src color的某个分量为1,alpha为0.5;dst color某个分量为0,那么根据正常的计算为:

res = src * alpha + dst * (1-alpha) = 0.5

而有了sRGB Sampler和sRGB Frame Buffer后:

res = (src ^{2.2} * alpha + dst ^ {2.2} * (1-alpha)) ^ {0.45} = 0.5 ^ {0.45} \approx 0.732

差异在此产生,并且随着混合次数的增多,差异会越来越大。

理论上最好的解决方案是美术直接在线性空间下制作资源,如官方说的在PhotoShop设置中选择“用灰度系数混合RGB颜色”,参数设置为1。

或者参考网上的解决方案【Unity补完计划】Unity线性空间(Linear)下Alpha的混合问题Unity手机线性空间下的透明混合(上),但他们都有额外的消耗,对于性能不是那么富裕的项目就显得无能为力了。

参考
Unite 2018 | 浅谈伽玛和线性颜色空间
聊聊Unity的Gamma校正以及线性工作流
【图形学】我理解的伽马校正(Gamma Correction)
Chapter 24. The Importance of Being Linear

原文链接:https://www.jianshu.com/p/964ffc5d3b9c

Unity安装Android SDK

在使用Unity打包apk时,有时会期望设置Android API level

Unity的默认设置是使用安装的最高版本,例如Unity2019安装的是Android 29

如果期望使用别的SDK打包会出现提示

Unity提示使用SDK Manager安装自己需要的版本

在External Tools中找到SDK安装的目录,在Unity的安装目录中找到”Editor\Data\PlaybackEngines\AndroidPlayer\SDK\tools\bin”文件夹,sdkmanager.bat就是我们要找的SDK Manager

在该目录运行命令行工具,例如sdkmanager –help

执行安装:

1sdkmanager platforms;android-28

 安装完成重启Unity就可以选择新的API打包

FunPlus特效专家张韶勇:如何利用跨平台工具快速制作像素动画?(转)

有些用于主机端的特效工具和插件可以和手游工具相结合,从而提高手游特效品质和制作效率。

FunPlus首席特效专家张韶勇对此感受颇深。他拥有16年特效工作经验,此前在海外做主机游戏的特效,回国后曾在网易阿里等公司负责手游的特效,目前加入了FunPlus,负责美术特效的工作。

在今年的北京国际游戏创新大会(BIGC)上,张韶勇分享了他对游戏特效技巧-像素动画制作的心得。不仅从美术角度思考如何在手游上呈现出更好的美术表现,还尝试引入主机端的开发技术,让冗杂的特效制作过程简化,到快速落地在手游中。

在他看来,艺术挑战技术,技术启发艺术。新的技术和工具的出现,为艺术创作的实现带来新的可能性和便捷。数字艺术的创作常常受限于游戏开发所使用的引擎和插件。但是如果美术多一点对数学的理解,就会发现很多工具是相通的。

一些在主机游戏中使用的技术可以消化,简化或局部地应用到手游开发中。比如 FluidNinjia 是在 Unreal engine 里使用的插件,但是它输出的序列帧流程图等资源可以在ASE中使用。这样我们就可以使用 Unreal Cascade,Niagara 粒子系统来设计特效需要的动态,通过 FluidNinjia 输出贴图资源。将其材质在ASE中简化重构。

这样把跨平台的工具融会贯通地使用,极大扩展了特效的创作和实现的空间。这需要特效师对工具后面的数学多一点理解。

以下是葡萄君整理的演讲实录:

今天和大家分享的内容是:「像素动画的原理和应用」。我很想把它讲到就算外行也能弄懂。同时也通过这个案例,和大家分享一下美术岗位怎么用形象思维来解释数学。

我做了16年的特效。之前在美国、加拿大做过《使命召唤》《暗黑血统》等主机游戏,回国之后先后在网易,阿里游戏,最后来到FunPlus,现在主要负责手游的项目。

从主机游戏到手游转变,我本能地考虑怎么把一些主机的游戏技术应用到手游上面。其中的一个典型例子就是像素动画在手游上的应用。

我是一名特效师,这个岗位也可以叫做特效动画师。动画师动的是角色的胳膊和腿,而特效师动的图片的像素,因为大多数时候,我们都是利用像素运动来模拟各种特效。

比如这个《星空》。现在大家看到的是运动的数字版,它就代表了像素动画要呈现的效果。

要实现这种效果并不难,最近有个叫Fluid Ninja的Unreal的插件,特效师可以应用Cascade,Niagara粒子系统,贴图,或者力场在其中模拟出我们想要的运动形式,产出流程图等贴图资源,然后再应用到Unity的ASE材质中。这个过程给了特效师设计像素动画的极大自由,而且十分便捷。

我们先讲一下像素动画的基本原理:

每一张图片其实都是由像素构成的。假如图片的分辨率是1024×1024,那么这1024个像素点都有其对应的坐标。

我们可以用一张“流程图”来操纵一张图片像素坐标的运动方向和强度,以得到我们想要的运动形式。

它涉及到两个最基本的概念:

其一是平面坐标系,这个就是上下左右4个方向。

其二,通道。我们的图片有百万种颜色都是由RGB三个不同的通道组合产生的。

那么我们可以试着将他们合在一起:把红绿通道分别对应坐标系的X值和Y值,这样就可以把图片的「灰度」和坐标系的数值对应起来。

坐标系大家都很清楚。下图在坐标系中左下角是(0,0),右上角可以设为(1,1),这就是一张相片最基本的的坐标系。当然,电脑里的坐标有些不太一样,它是左上角(0,0),右下(1,1)。

但是为了产生上下左右四个方向的运动,我们就得处理出正值和负值的区别。

我们让X和Y分别减去0.5,那么我的图片就能居中,中间点到了(0, 0)的位置;

原本(0, 1)的区间就变成(-0.5, 0.5)的区间,由此我们就能拥有正负两个方向的运动。

这张图是 Unreal 和 Unity 中的坐标节点图标:

你看到当中红绿的过度,其实就是两个通道灰度从黑到白的渐变过程,左边在红色通道里面,我们将黑色设置为0,白色设置为1,那么就有0到1的渐变;右边的绿色通道也同理,不过我们将它的位置设置为纵向,从黑色0到白色1。

这就是红绿通道的灰度值,对应坐标系的值。

知道了颜色的坐标运动,我们简单地描述成这样:

通常图片的灰度值是0到256,在流程图的红色通道里面,黑色产生向右的运动,白色向左运动;如果是绿色通道就是黑色向上,白色向下。128的中间灰为静止状态。换句话说,它不会产生任何的运动。

那么举一个实例,假如我们有这样一张图A:

怎样让他做左右运动成这样?

或者又怎样如此上下运动呢?

答案就是做出一张流程图。

这张流程图就是黑白两个条组成,红色通道、绿色通道是相同的黑白条(因为不用其他方向运动,所以我们把蓝色通道设置为黑色)。

我们现在回头看一下,这个左右运动就是红色通道起作用(绿色通道的灰度值是128的中间灰);而上下运动就是绿色通道起了作用(红色通道的灰度值是128的中间灰)。

这张图就可以解释背后的原理:当我们需要左右运动的时候,我们让红色通有黑白,让绿色通道是128灰度,不产生运动。

同样的图,我们将红色通道设置为128的灰度,绿色通道有黑白,那么他只有上下运动。

基于这个原理,我们找3张图来说明实操。平常工作当中,我们经常要做河流、烟雾、岩浆的运动,这几张静止的图片,几分钟之内就可以做成运动的图片。

我们只需要在Flowmap Painter软件里,像手指划过一样,顺着运动方向抹一下,它就会根据轨迹流动。

我们打开“涂抹”出来的流程图,原理就很显而易见了:因为除了我们需要运动的部分,其他部分都是128的灰度,运动着的部分就是比中间灰或亮或暗一些。

下面这个是像素动画用到的材质球,我用一张流程图扭曲了自己的照片。为了说明白一些,我将它分为ABC三个部分。

点击图片可放大查看原图

A部分看似复杂,其实只是加减乘除一样的算法,目的就是让图片的坐标移动:

One Minus——减1,其实就是首先把(0,0)放到左上角去,符合电脑的坐标规则;Append是将横纵两个方向坐标合在一起;Flow_Strength则是控制扭曲强度;

下面是B部分,Time,也是很重要的节点。打个比方,我们这里有个坐标,时间就是穿过0的过程,往下是过去,往上是未来,它是一条无限延伸的对角线。

而我们想获得重复的效果,就是让时间来回重复,就可以用Fract节点去掉整数。

让时间这一条线,从0开始,0.1走到0.9,到1的时候再重复回到0。意味着时间永远不会有的整数,他只会在0.1 – 0.9之间往复。这就产生了循环。

B部分和A部分是一样的运动,只是慢了0.5秒。但是可以看到都有跳帧的现象。我们用淡入淡出的遮罩来过滤掉跳帧部分——也就是C部分的工作。

试着把它还原成更形象的坐标图,这是Time原始的样子:

我们第一步把它变成小数往复:

再减去0.5以获得负值:

再用Abs把负值翻正过来,让它连续:

最后再乘以2来增大波动幅度,形成连续的波浪线。

最终我们得到这样一个淡入淡出的遮罩图融合A和B两部分,形成无缝循环。

像素动画可以用到很多的地方。比如说这个星球的游戏界面里,巨型风暴原本是一张静止的图片。

银河的运动、太阳的火焰、木星的风暴,全部都是用这种材质球处理的,而且效率非常高

在这个特效里,一张很多小点的黑白图和一张螺旋形状的流程图,两者合在一起,便可以做出一个近似黑洞的旋转结果。

这是我们的一款三消游戏,里面云的动态、怪物的斗篷、水的运动,都用到了这种Flowmap效果。

这个将怪物吸进瓶子的效果,烟雾消散的效果也是用Flowmap处理的像素动画。

制作流程图有很多讨巧的方法:

拿这张图片来举例,先将原图导入Flowmap Painter里面,用涂抹工具顺着运动方向抹几下,于是就可以导出这样一张流程图,十分钟不到。

如果是像木星上这么复杂的风暴运动我肯定是没有时间顺着方向一点点抹的,太复杂了,不过这也有办法。

可以用PS将它的红色通道灰度调整,不动的部分刷成128灰度;然后把绿色通黑白反相,把不想运动的地方用128灰度的刷一刷,于是,几分钟不到的时间就得到了一张木星风暴的流程图。

再比如我只有这样一个灰度图,它的运动也是有很多细节:

可以用CrazyBump拿这张灰度图直接产生Normal Map,我把蓝色通道设置黑的,只用红绿通道,就变成了流程图:

不过最酷的还是用FluidNinja这个插件,如火球、烟雾、爆炸,流体等各种运动,我们都可以用3种方式百分百地控制生产它们的运动。

第一种就是粒子系统。无非是用运动的粒子产生不同的黑白间隔比例,配上算法,就有了种种流体模拟的效果。不光是单帧,也可以设置成序列帧。第二种是用黑白图片,第三种是用力场。它让像素动画特效设计增加了极大的空间。

我们做手游因为包体的大小会受到控制,特效贴图用512×512就会是常大的图了,尤其我们做序列帧的时候。比如说512×512,我们把它分割成4×4=16帧,每个单位都是256,低于这个值,手机上就会看得很模糊。

游戏是每秒30帧播放,16帧的序列图勉强可以在1s内让你觉得特效过得去。现在有了序列帧的流动图,我们就可以将它做到几倍的特效时长。

比如一个爆炸特效,左边这个爆炸是用8×8 64的序列帧,2秒的特效,很顺滑。但假如这是一个原子弹爆炸,让你做30s以上, 1秒就是30帧,30秒就得900帧,那得多大的序列帧贴图啊?右边这个就是用了序列帧流程图的效果,很长但没有卡顿。

材质球就会稍微复杂一些:

目的是用序列帧的流动图为序列帧增加中间帧:

基本道理就是将当前帧往外扭曲,然后下一帧往内扭曲,关键帧缩紧放大后,就出现了两个中间帧,帧数变多,画面自然变丝滑。

最后总结一下像素动画的优缺点:

优点是可以很快、精确地产生我们想要的运动。方法非常简单,制作流程图可以用Flowmap Painter、PS、CrazyBump,还有现在最酷的FluidNinja,借助它我们可以把Unreal、Unity结合起来使用。

序列帧流动图除了产生很细节的运动以外,可以大幅度降低我们的图片大小。

像素动画的的缺点就是动作是重复的。