whatwiilbhewiibe|be意思

&figure&&img src=&https://pic3.zhimg.com/v2-2a3d34dee07e12d85eda_b.jpg& data-rawwidth=&960& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic3.zhimg.com/v2-2a3d34dee07e12d85eda_r.jpg&&&/figure&&p&GTA5的渲染优化向来为人称道。这篇文章是基于&/p&&a href=&http://link.zhihu.com/?target=http%3A//www.adriancourreges.com/blog//gta-v-graphics-study/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic4.zhimg.com/v2-60e35f537abac2bccdeaf9ff_180x120.jpg& data-image-width=&420& data-image-height=&236& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GTA V - Graphics Study&/a&&p&所写的对渲染过程的图形学分析,并大量引用了里面的内容。之前也有前辈做了翻译,这里我介绍了更多的细节与优化。读者需要一定的图形学基础去理解其中的概念,而我也在其中加入了一些自己的理解,若有错误希望不吝指正。&/p&&h2&&b&剖析GTA5(侠盗猎车手5)中一帧的渲染流程&/b&&/h2&&p&开始之前首先要指出,GTA5里许多渲染所用的缓冲都是&b&HDR缓冲&/b&(每个channel大于8位,无法在显示器上正常显示),直到每帧结尾才转化为常见的RGB图像。原作者&i&Adrian Courrèges&/i&为了演示方便,已经将这些HDR缓冲都转化为8位的正常图像。所以下文你看到的图片都是经过HDR处理过的。文末附上了原作者使用的HDR处理方式的简介以供参考。&/p&&p&&br&&/p&&p&好了,下面进入正题,开始详细的渲染流程介绍!&/p&&hr&&h2&&b&Step 1. 生成环境贴图&/b&&/h2&&p&每一帧开始时,GTA5首先渲染出一张&b&环境立方体贴图&/b&(Cubemap)。这张Cubemap用于后面计算池塘,河流等物体的反射,并不需要很高的精度, 只有地形,天空,摩天大楼等大型景致的低精度模型被渲染到Cubemap中,并且每一面的贴图大小只有128*128,只要约30个&b&draw call&/b&(绘图指令)即可完成。由下图可以发现,只有那些大型模型在水面里有倒影,无论行人、载具还是装饰的静态物体都是没有倒影的,这就是提高渲染效率的代价。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b1bf5a8ec434e3c6585f57fdaf523a50_b.jpg& data-size=&normal& data-rawwidth=&482& data-rawheight=&339& class=&origin_image zh-lightbox-thumb& width=&482& data-original=&https://pic1.zhimg.com/v2-b1bf5a8ec434e3c6585f57fdaf523a50_r.jpg&&&figcaption&人物,围栏,树木都是没有倒影的&/figcaption&&/figure&&p&&b&环境立方体贴图(Cubemap)&/b&:一个由6张纹理组成各个面的立方体,渲染方式为将摄像机置于你所在的位置,朝着6个方向各进行一次渲染(每次将摄像头角度旋转90°)。Cubemap也可以用于实现简单的天空盒,使远景一直与人物保持相对静止,实现天空的效果。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-89dc271d7ceeabe1a21f_b.jpg& data-size=&normal& data-rawwidth=&205& data-rawheight=&205& class=&content_image& width=&205&&&figcaption&环境立方体贴图(引用自Adrian)&/figcaption&&/figure&&p&然而GTA5在这里还加上了一个优化:将立方体贴图(Cubemap,6个面,128*128)转化为双抛物面贴图(Dual-Paraboloid Map,2个面,128*128),转化后的结果如下所示:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-4d7a0b1bd6d5f3d9eafd_b.jpg& data-size=&normal& data-rawwidth=&256& data-rawheight=&128& class=&content_image& width=&256&&&figcaption&GTA5使用的Dual-Paraboloid Map(引用自Adrian)&/figcaption&&/figure&&p&这两张图可以看成把原来的立方体贴图压缩成球体,然后映射到上半球和下半球上。这样做有什么好处呢?首先,它降低了显存开销(从6张到2张);其次,Cubemap是用于后续的反射计算的,考虑到多数情况中反射体正面朝上(水池,车窗等),只有那些高处的景物会被反射进我们眼中,所以大部分都是对上半球的贴图(上图右边部分)进行采样;再次,使用立方体贴图的话,我们在使用mipmap技术采样贴图时很容易在不同的面之间产生seams,而使用双抛物面贴图则会减轻这个问题的影响。&/p&&p&至此,用于后面计算反射的贴图已经生成好了。&/p&&hr&&h2&&b&Step 2. 背面剔除和LOD技术&/b&&/h2&&p&这一步的操作都由计算着色器(Compute Shader,CS)完成。原文没有提及很多细节,我稍作一些补充。&/p&&p&剔除(Culling)是一种很常见的优化技术,旨在提前去掉不需要渲染的面,比如背面消隐,视锥体剔除等。何为&b&&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Back-face_culling& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&背面消隐&/a&&/b&?比如将镜头对准一张纸板,只有纸板的正面需要渲染,背面则不需要(因为你也看不到背面的内容),这样可以减轻渲染的压力。一般都是通过传入的网格面片的顶点顺序来定义哪一面是正面。何为&b&&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Viewing_frustum& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&视锥体裁剪&/a&&/b&?摄像头同我们眼睛一样,能看到的通常都在一个平截头体中(太近、太远或太偏的物体都看不到),所以我们只要渲染在平截头体内的物体。&/p&&p&LOD技术(Level of Detail)则是为了处理模型的精度问题,精度越高的话,模型的表现越精细。但对于离摄像机很远的物体,用高精度模型渲染没有明显的画质提升,反而会消耗大量的显存(因为远处往往包含更多的物体,使用高精度模型的话,需要的模型面片数量将十分巨大)。常用的解决方案是 对同一个物体预先生成不同精度的网格,当物体离摄像机近时就用高精度的网格,离的远就用低精度的网格(后面介绍的Cascaded Shadow Map技术也是基于类似的原理,来保证近处的阴影质量更高),这样能尽量保证玩家感受高质量的模型。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e8c6ae79e48d79f6eb7d1c3a_b.jpg& data-size=&normal& data-rawwidth=&437& data-rawheight=&256& class=&origin_image zh-lightbox-thumb& width=&437& data-original=&https://pic4.zhimg.com/v2-e8c6ae79e48d79f6eb7d1c3a_r.jpg&&&figcaption&LOD:根据距离选择不同的模型精度&/figcaption&&/figure&&p&可以观察GTA5对于植被运用的LOD技术处理,当植被与摄像机超过一定距离后不再渲染就不再渲染,即模型精度为0。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-0bdbfc3458edd0f081234_b.jpg& data-size=&normal& data-rawwidth=&741& data-rawheight=&252& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic1.zhimg.com/v2-0bdbfc3458edd0f081234_r.jpg&&&figcaption&用人物手机拍照,拉近镜头时更多植被被渲染&/figcaption&&/figure&&p&GTA5对LOD技术的运用十分高超。我们知道GTA5的场景庞大而复杂,每一帧都需要对大模型进行处理,但它却能在显存只有256MB的PS3上渲染很多大型场景,并且将细节表现得十分逼真,足见它在LOD上下了很大的功夫。&/p&&hr&&h2&&b&Step 3. G-Buffer Generation&/b&&/h2&&p&主要的渲染过程就是在这一步进行,因此该步骤将做重点介绍。GTA5运用了&b&延迟渲染&/b&技术(与之相对的是:之前绘制cubemap时运用的是&b&前向渲染&/b&),利用MRT技术将同时渲染到5张渲染对象(贴图)。这里首先对名词稍作解释。&/p&&p&&b&前向渲染(Forward Rendering):&/b&在每一帧中轮流渲染各个物体,渲染每个物体时调用它的顶点着色器(VS)和像素着色器(PS),在PS中结合光源信息利用光照模型进行计算,将物体最终绘制在纹理上。该渲染方式存在一些不足:&b&首先&/b&,如果很多物体在摄像机方向前后重叠,则很可能同一个像素有多个物体调用各自的PS进行光照计算(最终只保留一个),这就造成PS运算的浪费,即over-drawing问题(采用由近及远的渲染方式可以减轻这个问题);&b&其次&/b&,当场景中具有大量光源时(如下图所示),每个物体需要向PS传入所有临近光源的信息并一一计算光照,考虑到庞大的物体数目和光源数量,这将严重影响PS的效率,形成GPU Bound。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-b5e0d9a39d4b8b9462f36e_b.jpg& data-size=&normal& data-rawwidth=&960& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic3.zhimg.com/v2-b5e0d9a39d4b8b9462f36e_r.jpg&&&figcaption&GTA5夜间场景存在数以百计的光源和大量的物体&/figcaption&&/figure&&p&综合前面所说,前向渲染存在重要的运算浪费:一个像素可能被渲染了数百次(每次都会进行光照运算)但最终只有深度最低的那次运算结果得以保留,其他光照计算都被浪费掉了。&/p&&p&&b&延迟渲染(Deferred Rendering):&/b&针对前向渲染的缺点,延迟渲染换了一种思路。它利用MRT(multiple rendering target)技术将每个物体的漫反射、法线、镜面反射等信息分开绘制到4~5张主要的纹理(也就是G-Buffer)上,暂不进行光照运算。当所有物体的信息绘制完成,光源 再利用G-Buffers中的数据进行运算(”延迟“的由来)。 由此可见,场景的复杂度对光照计算量的影响大大降低(因为无论一个像素点被物体覆盖多少次,光源只对该点渲染了一次),大量光源的渲染得以实现。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-80e4fa9a50a77e9c267b8bed773b7491_b.jpg& data-size=&normal& data-rawwidth=&795& data-rawheight=&257& class=&origin_image zh-lightbox-thumb& width=&795& data-original=&https://pic2.zhimg.com/v2-80e4fa9a50a77e9c267b8bed773b7491_r.jpg&&&figcaption&GTA5延迟渲染示意图&/figcaption&&/figure&&p&下面将主要介绍一下G-Buffer里面几张贴图的具体内容(需要另外指出,这里所用的缓冲都是LDR而非HDR)。一张贴图有RGBA这四个8位通道,而像深度等信息只占一个通道,颜色也只占三个通道,如果只存一种信息必然会浪费空间,因此GTA5会将不同的信息合同到同一个贴图内以充分利用所有通道)。&/p&&ol&&li&&b&Diffuse Map&/b&:漫反射贴图,保存物体的原本的颜色。但与其他游戏不同在于,GTA5在这里顺便加入了阳光对物体的光照计算。考虑太阳的平行光特性,所有物体都会被照射到,这点代价(相较于在结合G-Buffer时进行阳光计算)还是可以接受的。下图中可以看出引擎盖上的对于阳光的光照计算。&/li&&/ol&&figure&&img src=&https://pic3.zhimg.com/v2-ed2a006e75adb91c286ab2_b.jpg& data-size=&normal& data-rawwidth=&431& data-rawheight=&244& class=&origin_image zh-lightbox-thumb& width=&431& data-original=&https://pic3.zhimg.com/v2-ed2a006e75adb91c286ab2_r.jpg&&&figcaption&引擎盖上的阳光光照计算(引用自Adrian)&/figcaption&&/figure&&p&剩下的alpha通道用于保存”Blending“(混合)信息,标志出需要抖动平滑处理的像素点。我们将在介绍Dither Smoothing的时候介绍它是如何使用的。&/p&&p&&b&2. Normal Map&/b&:&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Normal_mapping& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&法线贴图&/a&,用于存储每个像素点的法线,可以在光照计算时模拟表面的变化,从而提高真实度。&/p&&p&这里做一个比较:&b&延迟渲染&/b&中法线贴图存储的是每一点的法线在世界空间(World Space)的向量坐标,而&b&前向渲染&/b&为了方便在PS中计算光照,一般存储的是每一点法线在自己的切线空间(Tangent Space)的向量坐标。这就解释了前向渲染的法线贴图为何偏蓝色:贴图中每个通道只能存储正数,因此需要将法线向量的每一位从 &img src=&http://www.zhihu.com/equation?tex=%28-1%2C+1%29& alt=&(-1, 1)& eeimg=&1&& 线性映射到 &img src=&http://www.zhihu.com/equation?tex=%280%2C+1%29& alt=&(0, 1)& eeimg=&1&& 中,切线空间中常见法线向量 &img src=&http://www.zhihu.com/equation?tex=%280%2C+0%2C+1%29& alt=&(0, 0, 1)& eeimg=&1&& 将会被映射到 &img src=&http://www.zhihu.com/equation?tex=%280.5%2C+0.5%2C+1%29& alt=&(0.5, 0.5, 1)& eeimg=&1&& ,正好对应蓝色。&/p&&p&GTA5中使用延迟渲染,因此normal map需要存储法线的世界空间坐标,可以看出其色调与前向渲染的法线贴图不太一样。但主要色调仍为蓝色,因为大部分物体都是表面朝上(如地面),法向量的世界空间坐标仍会从&img src=&http://www.zhihu.com/equation?tex=%280%2C+0%2C+1%29& alt=&(0, 0, 1)& eeimg=&1&& 映射到 &img src=&http://www.zhihu.com/equation?tex=%280.5%2C+0.5%2C+1%29& alt=&(0.5, 0.5, 1)& eeimg=&1&&。&/p&&p&注意:这里要注意两张贴图的来源区别:延迟渲染的法线贴图是G-Buffer的中间产物;
而前向渲染中的法线贴图则是预先提供的美术素材。这里比较是为了更清晰地展示两张贴图的取值空间的不同。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-966189cfdf8a4cadbe5ce_b.jpg& data-size=&normal& data-rawwidth=&720& data-rawheight=&243& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic3.zhimg.com/v2-966189cfdf8a4cadbe5ce_r.jpg&&&figcaption&GTA5(延迟渲染)的法线贴图 切线空间下的法线贴图&/figcaption&&/figure&&p&法线贴图的alpha可能是用于判断植被与摄像机的距离(决定是否渲染),原文不甚详细。&/p&&p&&b&3. Specular Map&/b&:&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Specularity& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&高光贴图&/a&,但这里并不直接存储每个像素的镜面反射光颜色,而是存储每个像素点最上面的物体的材质信息以供后续计算,原因在于:GTA5采用的延迟渲染,所以得在G buffer渲染结束后才会进行光照计算(否则光源很多时,你需要对一个物体进行上百次镜面光计算)。这里各个通道存储的信息为:&/p&&p&Red:高光强度(specular intensity)&/p&&p&Green:光泽度(glossiness)&/p&&p&Blue:菲涅尔系数(Fresnel Intensity,同一材质所渲染的像素点都采用相同的菲涅尔系数)&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a76addc83bea_b.jpg& data-size=&normal& data-rawwidth=&431& data-rawheight=&242& class=&origin_image zh-lightbox-thumb& width=&431& data-original=&https://pic3.zhimg.com/v2-a76addc83bea_r.jpg&&&figcaption&高光贴图并非直接存储高光颜色(引用自Adrian)&/figcaption&&/figure&&p&&b&4. Irradiance Map&/b&:辐照贴图(这个我不是很了解),主要用于保存每个点的辐照度。各个通道存储的信息为:&/p&&p&Red:每个像素点接收到的来自太阳的辐照度(基于该像素的位置,法线与阳光角度进行计算)。&/p&&p&Green:原作者猜测该通道记录了来自另一个光源的辐照度&/p&&p&Blue:记录物体的自发光属性(emissive),对于霓虹灯等物体占据的像素,该通道值非0。&/p&&p&Alpha:该通道主要用于标记皮肤、植被等需要特殊处理的像素点(后续将介绍如何处理)。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-3c618f95a6fe65bee0ca_b.jpg& data-size=&normal& data-rawwidth=&450& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&https://pic3.zhimg.com/v2-3c618f95a6fe65bee0ca_r.jpg&&&figcaption&辐照贴图(引用自Adrian)&/figcaption&&/figure&&p&由上面容易看出,在白天时,Red通道基本都被填充,Blue和Alpha通道大部分为0。所以该贴图明显偏红。城市部分对应的绿色可能是做了特殊处理(我猜测是考虑了热岛效应?)&/p&&p&&b&5. Depth & Stencil Map&/b&:&a href=&http://link.zhihu.com/?target=https%3A//open.gl/depthstencils& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深度贴图和模板贴图&/a&,用于存储每个像素点的深度和模板值。存储深度时GTA5做了一个优化:存储对数深度缓冲。公式为: &img src=&http://www.zhihu.com/equation?tex=d%3D%5Cfrac%7Blog%28C%2Aw%2B1%29%7D%7Blog%28C%2Afar%2B1%29%7D%2Aw& alt=&d=\frac{log(C*w+1)}{log(C*far+1)}*w& eeimg=&1&& , &img src=&http://www.zhihu.com/equation?tex=C& alt=&C& eeimg=&1&& 通常取小于1的常数, &img src=&http://www.zhihu.com/equation?tex=w& alt=&w& eeimg=&1&& 是观察空间下的深度, &img src=&http://www.zhihu.com/equation?tex=d& alt=&d& eeimg=&1&& 是实际被写入缓冲的深度。&/p&&p&&b&为什么要做这个优化?&/b&正常情况下写入的深度与实际深度的关系为 &img src=&http://www.zhihu.com/equation?tex=d%3Da%5Cfrac%7B1%7D%7Bz%7D%2Bb& alt=&d=a\frac{1}{z}+b& eeimg=&1&& ,可以看出在近平面时 &img src=&http://www.zhihu.com/equation?tex=d& alt=&d& eeimg=&1&&
的精度可以对应大部分深度;而当 &img src=&http://www.zhihu.com/equation?tex=z& alt=&z& eeimg=&1&& 很远时,需要距离较大改变,才能被 &img src=&http://www.zhihu.com/equation?tex=d& alt=&d& eeimg=&1&& 感受到(因为 &img src=&http://www.zhihu.com/equation?tex=d& alt=&d& eeimg=&1&& 的精度是有限的),因此在远处相近的两个物体深度会重叠,这就是Z Fighting现象。GTA5由于地图庞大,经常出现far plane很远的情况,因此必须要解决这一问题。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-9ce450ecdc_b.jpg& data-size=&small& data-rawwidth=&830& data-rawheight=&430& class=&origin_image zh-lightbox-thumb& width=&830& data-original=&https://pic1.zhimg.com/v2-9ce450ecdc_r.jpg&&&figcaption&1/z中远平面的变化无法准确反馈给d(图片来自NVIDIA)&/figcaption&&/figure&&p&我们可以在存储d时使用一个&a href=&http://link.zhihu.com/?target=https%3A//developer.nvidia.com/content/depth-precision-visualized& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&拟对数分布&/a&来保证far部分能对应到大量的d值,near部分也能获得足够的精度,实际上正好可以用对数去模拟这样的分布,这就是公式的由来。我利用Mathematics简单绘制了对数缓冲公式的图像,并举例进行计算:下图右边可见,当far plane为 &img src=&http://www.zhihu.com/equation?tex=10%5E%7B7%7Dm& alt=&10^{7}m& eeimg=&1&& 时,假设物体从 &img src=&http://www.zhihu.com/equation?tex=10%5E%7B5%7Dm& alt=&10^{5}m& eeimg=&1&& 移动到 &img src=&http://www.zhihu.com/equation?tex=10%5E%7B5%7D%2B10m& alt=&10^{5}+10m& eeimg=&1&& ,对数缓冲的变化仍在精度范围内,而倒数函数的变化十分小,已经无法在24位精度下被计算机准确反应了。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-278a4b2dd3a589f55bfa4_b.jpg& data-size=&normal& data-rawwidth=&761& data-rawheight=&302& class=&origin_image zh-lightbox-thumb& width=&761& data-original=&https://pic1.zhimg.com/v2-278a4b2dd3a589f55bfa4_r.jpg&&&figcaption&对数缓冲函数能更精确地记录远处物体的深度数据&/figcaption&&/figure&&p&模板值被用来标志每个像素点渲染的网格类型,同一种网格所渲染的像素都用同一个值进行标志。之所以需要标志出来,是因为GTA5将对一些网格做后续处理(如皮肤,载具等),读取模板值可以决定应该用哪种方式进行处理。一些典型的模板值如下:&/p&&ul&&li&0x89:玩家所控制的人物&/li&&li&0x82:玩家驾驶的载具&/li&&li&0x01:游戏中的NPC&/li&&li&0x07:天空&/li&&/ul&&p&&br&&/p&&p&至此,G buffer中所有的buffer都被介绍完了,这些buffer一共调用了约1900个draw call。但是注意该part还没有结束,下面将列出一些渲染G-Buffer的其他细节;在这些操作完成之后,才能进行G-Buffer的合并计算。&/p&&p&&b&I. &/b&场景中物体都是”从前往后“渲染的,这样做的好处在于:像素被近处的物体先渲染了,后面的物体渲染这些像素时就无法通过深度测试,在调用PS渲染之前就被GPU丢弃了,从而提高了渲染效率。“从前往后”渲染能节省大量不必要的PS运算开销。从下图可以看出,人和车会占据屏幕的一大部分,而后面的物体则省去了渲染的开销。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a679b25a3f69fd66bb4a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&960& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic3.zhimg.com/v2-a679b25a3f69fd66bb4a_r.jpg&&&/figure&&p&&b&II. &/b&前面介绍diffuse map时提到diffuse map的alpha通道,被用来标志出需要抖动平滑处理的像素点。如果你将diffuse map放大查看,会发现远处的树占据的像素只有一半被渲染,就像国际象棋的棋盘一样。GTA5这样做并非因为渲染效率的限制,而是有意为之(在像素着色器中读取屏幕坐标判断是否渲染)。&/p&&p&这种抖动的渲染方式可以使得物体在不同的LOD之间的转化更为自然。在原文后面的Dither Smoothing介绍了后续操作:利用一个后处理像素着色器,读取alpha通道来确定被抖动处理的像素(远处的树木),然后对周围进行采样混合,计算出该像素点平滑处理后的颜色值。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-81b6bf39129eecd1f5a31_b.jpg& data-size=&normal& data-rawwidth=&899& data-rawheight=&243& class=&origin_image zh-lightbox-thumb& width=&899& data-original=&https://pic2.zhimg.com/v2-81b6bf39129eecd1f5a31_r.jpg&&&figcaption&处理前后图像对比(图像经过放大,引用自Adrian)&/figcaption&&/figure&&p&这里有一篇关于该技术(Alpha Stippling)的&a href=&http://link.zhihu.com/?target=https%3A//gamedev.stackexchange.com/questions/47844/why-are-some-games-using-some-dithering-pattern-instead-of-traditional-alpha-for& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&问答&/a&。GTA4也使用了该技术。&/p&&p&&b&III. &/b&阴影技术:GTA5采用了级联式阴影贴图(CSM,Cascaded Shadow Map),这也是大型游戏中常用的技术。对于普通的shadow map,很容易出现摄像机近处多个点对应到同一深度的情况,为了解决这一问题,通常会根据距离生成不同精度的shadow map,来保证近处的阴影的准确性。可以看到左图中大块区域会在shadow map中对应到同一深度,而右图中则可以保证近处的深度划分更加细致。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a4efff902cdca3d2bb0a34997daa753e_b.jpg& data-size=&normal& data-rawwidth=&742& data-rawheight=&313& class=&origin_image zh-lightbox-thumb& width=&742& data-original=&https://pic3.zhimg.com/v2-a4efff902cdca3d2bb0a34997daa753e_r.jpg&&&figcaption&基本的阴影贴图和级联式阴影贴图&/figcaption&&/figure&&p&GTA5将4张阴影贴图合成了一张的贴图,每个阴影贴图都对应了不同的视锥体(从光源出发)。注意到阴影贴图是从太阳发射的平行光的角度进行渲染的,结合下图和Diffuse Map可以看出,从左到右视锥体覆盖的范围越来越大,并且离摄像机越来越远(即不同距离生成不同精度的贴图)。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-27daa7a4fa33e31787a0cdd_b.jpg& data-size=&normal& data-rawwidth=&923& data-rawheight=&232& class=&origin_image zh-lightbox-thumb& width=&923& data-original=&https://pic2.zhimg.com/v2-27daa7a4fa33e31787a0cdd_r.jpg&&&figcaption&GTA5中的阴影贴图(引用自Adrian)&/figcaption&&/figure&&p&渲染这几张贴图可能会带来很大的开销,因此同一场景被渲染了四次。但值得庆幸的是渲染每张贴图时都可以用视锥裁剪裁去大部分不需要的物体,因此CSM只需要约1000个draw call就可以生成。最后太阳光和云投射的阴影经过平滑处理后进行模糊混合,存储到Specular Map的alpha通道内。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-d2aaf7eaef8_b.jpg& data-size=&small& data-rawwidth=&903& data-rawheight=&508& class=&origin_image zh-lightbox-thumb& width=&903& data-original=&https://pic1.zhimg.com/v2-d2aaf7eaef8_r.jpg&&&figcaption&混合后的阴影贴图(引用自Adrian)&/figcaption&&/figure&&p&由于模糊操作需要从多个纹理中采样进行计算,代价十分高昂。GTA5在模糊混合之前还进行了一个优化:它首先生成原贴图1/8大小的贴图并进行低质量的近似模糊处理,通过结果估计出哪些像素点将会被完全点亮;然后对原大小的贴图进行高质量模糊处理时,如果该点被估计为完全点亮,则跳过模糊计算直接输出1(完全点亮的情况)。由上图可以看出,白天场景中大部分像素都会被完全点亮,因此这个优化可以节省大量昂贵的模糊计算。&/p&&p&&b&IV.&/b& SSAO(Screen Space Ambient Occlusion,屏幕空间环境光遮蔽):在渲染场景时,墙角等地方往往会由于周围建筑的遮挡而显得比较暗。这是因为光线在角落里有更小的概率反射出去,因此墙角的光更难射入人眼中。用Path Tracing可以较好地去感受光线的传播路径,这里放一张我写的路径追踪的渲染结果(噪点太多,请忽视。。):&/p&&figure&&img src=&https://pic3.zhimg.com/v2-bdb7bbe9ea3a93b309692a_b.jpg& data-size=&normal& data-rawwidth=&454& data-rawheight=&271& class=&origin_image zh-lightbox-thumb& width=&454& data-original=&https://pic3.zhimg.com/v2-bdb7bbe9ea3a93b309692a_r.jpg&&&figcaption&Path Tracing的生成结果&/figcaption&&/figure&&p&可以明显看出墙角和墙沿的光线更加昏暗。而只计算太阳光是无法模拟出这样的效果的,因此提出了SSAO技术。考虑到G-Buffer中已经存有Normal Map, Depth Map等信息,我们可以在每个像素点对其法线方向的上半球进行采样,然后根据深度贴图确定周围有多少部分是高于当前深度,即确定有多少光会被遮蔽。计算结果会生成一张SSAO贴图,然而这个贴图一般噪音很强,因此还需要两个pass去做水平和竖直方向的平滑,更新SSAO贴图。&/p&&p&另外需要注意:为了提高效率,SSAO Map都是以原图一半的分辨率去实现的。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-b8fe6e8fe1a06_b.jpg& data-size=&normal& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic3.zhimg.com/v2-b8fe6e8fe1a06_r.jpg&&&figcaption&未平滑的SSAO Map噪音十分严重(引用自Adrian)&/figcaption&&/figure&&p&&br&&/p&&p&细节介绍完了,终于是时候把这些G-Buffer的信息合并计算了!&/p&&p&一个像素着色器将从这些缓冲收集信息并最终计算出HDR下的渲染结果。对于夜间场景则会在这里额外渲染那些灯光,不做赘述。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-bd4d5396bcc07ffa1f097b5f53a2e5bd_b.jpg& data-size=&normal& data-rawwidth=&941& data-rawheight=&287& class=&origin_image zh-lightbox-thumb& width=&941& data-original=&https://pic2.zhimg.com/v2-bd4d5396bcc07ffa1f097b5f53a2e5bd_r.jpg&&&figcaption&G-Buffer集合(引用自Adrian)&/figcaption&&/figure&&p&这是合并后的结果:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-bb240f1daaa038_b.jpg& data-size=&normal& data-rawwidth=&922& data-rawheight=&518& class=&origin_image zh-lightbox-thumb& width=&922& data-original=&https://pic1.zhimg.com/v2-bb240f1daaa038_r.jpg&&&figcaption&G-Buffer Combination(引用自Adrian)&/figcaption&&/figure&&p&至此,渲染结果已经大致成型!&/p&&p&&br&&/p&&p&这篇文章大概介绍了原文四分之一的内容,由于中间加入了很多自己的理解,因此篇幅增长了不少,工作量也比较重。当然如果大家很感兴趣的话,我会继续翻译原文后面的内容。&/p&&p&&br&&/p&&p&&br&&/p&&p&此处附上HDR处理简介,感兴趣的读者可以了解一二:&/p&&p&这里简单介绍一下Adrian使用的HDR处理方式(详情参考Reinhard&i&的&/i&论文&i&Photographic Tone Reproduction for Digital Images&/i&):&/p&&ol&&li&对于每个像素点都根据RGB值计算出其亮度(符号为L,L=0.27R+0.67G+0.06B),然后利用以下方程更新该点的 &img src=&http://www.zhihu.com/equation?tex=L& alt=&L& eeimg=&1&& :&img src=&http://www.zhihu.com/equation?tex=L_%7Bd%7D%28x%2C+y%29%3D%5Cfrac%7BL%28x%2Cy%29%281%2B%5Cfrac%7BL%28x%2C+y%29%7D%7BL_%7Bwhite%7D%5E%7B2%7D%7D%29%7D%7B1%2BL%28x%2C+y%29%7D& alt=&L_{d}(x, y)=\frac{L(x,y)(1+\frac{L(x, y)}{L_{white}^{2}})}{1+L(x, y)}& eeimg=&1&&&/li&&/ol&&p&&img src=&http://www.zhihu.com/equation?tex=L_%7Bwhite%7D& alt=&L_{white}& eeimg=&1&& 代表能映射到纯白色的最小亮度。这一步可以将 &img src=&http://www.zhihu.com/equation?tex=L& alt=&L& eeimg=&1&& 全部映射到 &img src=&http://www.zhihu.com/equation?tex=%5B0%2C+1%5D& alt=&[0, 1]& eeimg=&1&& 区间内,但对于色彩范围极大的图片效果仍然不好,因此需要进一步处理。&/p&&p&2. 对于图片中的每个像素,找出适当的尺寸 &img src=&http://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&& 使得:以该点为中心, &img src=&http://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&& 为半径的区域与周围对比足够强(利用他定义的公式计算对比)。然后结合 &img src=&http://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&& 利用公式&/p&&p&&img src=&http://www.zhihu.com/equation?tex=L_%7Bd%7D%28x%2C+y%29%3D%5Cfrac%7BL%28x%2C+y%29%7D%7B1%2BV_%7B1%7D%28x%2C+y%2C+s_%7Bm%7D%28x%2C+y%29%29%7D& alt=&L_{d}(x, y)=\frac{L(x, y)}{1+V_{1}(x, y, s_{m}(x, y))}& eeimg=&1&&&/p&&p&重新计算 &img src=&http://www.zhihu.com/equation?tex=L& alt=&L& eeimg=&1&& 。 这里&img src=&http://www.zhihu.com/equation?tex=V_%7B1%7D& alt=&V_{1}& eeimg=&1&& 是基于每个像素的 &img src=&http://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&& 利用卷积计算出平均亮度。&/p&&p&然后按照色彩空间中的定义进行 &img src=&http://www.zhihu.com/equation?tex=L& alt=&L& eeimg=&1&& 与 &img src=&http://www.zhihu.com/equation?tex=RGB& alt=&RGB& eeimg=&1&& 的转化(这一块不太了解),即可得到处理后的图片,此时每个通道都可以用8位存储。处理结束。&/p&
GTA5的渲染优化向来为人称道。这篇文章是基于所写的对渲染过程的图形学分析,并大量引用了里面的内容。之前也有前辈做了翻译,这里我介绍了更多的细节与优化。读者需要一定的图形学基础去理解其中的概念,而我也在其中加入了一些自己…
&p&&b&来来来,我推荐一个,最好用的字幕制作软件绝对是&a href=&//link.zhihu.com/?target=http%3A//www.arctime.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ArcTime&/a&!分分钟让你体验什么叫一个人的字幕组,就是这么6!&/b&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.arctime.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ArcTime&/a& 是我用过的最好用的中英文字幕软件,没有之一。(利益相关:无,一个自来水)&/p&&p&当我还是一个学生的时候,经常要做一些视频来交作业。window系统上的三大非编软件Vegas、Premiere、Edius都用过,&b&不得不说的是,在对白字幕上,几大非编剪辑软件绝对是弱智一般的存在。&/b&&/p&&p&在剪辑软件上一句话一句话地打字幕实在是太苦逼了,于是我开始在网上找一些稍微智能一点的工具。老师推荐给我们的是雷特字幕,但是这个软件兼容性实在太差,字幕制作效率也并没有高出多少。付费版的、破解版的插件也都用过,但是没有一个顺手的,不是操作太复杂太技术流就是跟非编软件无法兼容。&/p&&p&后来查了一些字幕组的知识,我开始用人人影视的时间机器+小丸工具箱来制作外挂字幕,效率果然提高了不少,只不过外挂字幕这一套流程走下来,其实也是有点麻烦的,除了视频要用好几个软件来回倒之外,最大的缺点就是不懂ASS代码的无法做出简单的字幕特效比如边框、阴影什么的出来(复杂的文字特效最好用特效软件)。&/p&&p&&b&正当我准备再学习一套ASS代码进阶的时候,我发现了&a href=&//link.zhihu.com/?target=http%3A//www.arctime.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ArcTime&/a& 这个逆天的软件。&/b&&/p&&br&&p&&b&不仅和时间机器一样支持直接导入TXT字幕文本,导入双语字幕,还能把双语字幕一键转换成两个轨道。&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-72b517b0b5f584a1a38eb551ddca1c73_b.jpg& data-rawwidth=&614& data-rawheight=&532& class=&origin_image zh-lightbox-thumb& width=&614& data-original=&https://pic3.zhimg.com/50/v2-72b517b0b5f584a1a38eb551ddca1c73_r.jpg&&&/figure&&br&&p&&b&而且还可以在这个软件上直接更改ass字幕样式,实时看到效果预览!&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-207fce14bac8b8fb7bd8d6057adee66a_b.jpg& data-rawwidth=&636& data-rawheight=&573& class=&origin_image zh-lightbox-thumb& width=&636& data-original=&https://pic3.zhimg.com/50/v2-207fce14bac8b8fb7bd8d6057adee66a_r.jpg&&&/figure&&br&&p&这是打开之后的界面:&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-bb00b2aad10f9e69ae44ff1_b.jpg& data-rawwidth=&1024& data-rawheight=&608& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic1.zhimg.com/50/v2-bb00b2aad10f9e69ae44ff1_r.jpg&&&/figure&&br&&p&我最喜欢的是它的快速拖拽功能(当然你也可以用传统的快捷键拍打功能),&b&配合音频轨道的声音波形,可以在字幕轨道上用鼠标点击拖拽生成字幕,一次一句话,一个三十分钟的视频,基本播放一遍就能把所有的时间轴对上。&/b&&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-fedc3ca705da069c9948fd1_b.jpg& data-rawwidth=&916& data-rawheight=&576& class=&origin_image zh-lightbox-thumb& width=&916& data-original=&https://pic4.zhimg.com/50/v2-fedc3ca705da069c9948fd1_r.jpg&&&/figure&&p&&b&而且这个软件还能直接压制并输出视频,可以自己选择压制质量和速度,这样一来,我所有的工作就只剩下了听写字幕文字并保存成TXT格式。&/b&&/p&&p&果然懒才是人类进步的阶梯啊,这才是正宗的极客范儿有木有。&/p&&p&打开官网,看见作者对软件名字的由来是这么解释的:Arctime英文原意指高压放电时的燃弧时间,寓意软件能像电弧一样,璀璨炫目,有着极高的效率,在最短的时间内造福更多的字幕爱好者和影视工作者们。&b&并且我曾经研究高压电路多年,对于高压放电有着近乎痴迷的喜爱,故取此名。&/b&(咦,画风哪里不对?杨永信懵逼脸)&/p&&p&目前该软件已经出到了1.0final版,支持英文字幕的在线翻译功能,据说作者还在开发语音识别生成字幕的逆天功能,如果把语音识别加进来的话,这个字幕制作软件绝对是无敌一般的存在。&/p&&p&--------------------------------------------
2017年五月更新&/p&&p&刚才去arctime字幕软件官方公众号看了一眼,这个软件现在更新到了1.2版,新增加了以下功能:&/p&&p&&b&1.界面可显示中英日韩法俄、泰语、阿拉伯语、印地语、希腊语等235种语言,制作小语种字幕再也不用发愁。 &/b&&/p&&p&&b&2.字幕块支持框选、多选。对于需要批量修改的多个字幕块,再也不用一个一个单独调整啦,框选多个后,用快捷键操作简直太方便。&/b&&/p&&p&字幕框选多选这个功能是我一直呼吁要增加的,非常实用,这次总算是有了,感谢开发者。&/p&&p&虽然我个人看来,哪怕对于专业的视频从业工作者来说,arctime标准版也已经完全够用,但是仍然会有一些对产品需求比较挑剔的特殊用户,当然了,付费也意味着更省时省力,于是开发者给这部分用户提供了更牛逼的Arctime pro2.0版,这个版本比标准版多了些定制的功能比如:&/p&&p&&b&1.一键切分时间轴 &/b&
只要你的音频够干净、不带有背景音乐,点击后,软件会自动根据音频,在时间轴中生成一系列空白字幕块。&/p&&p&&b&2.批量语音识别 &/b&
简单设定识别范围,就看声音一句句变成文字啦!
关于定价,目前的计费方式为:每小时有效语音1600积分(等于人民币16元),识别失败的句子不计费,但同一段话重复识别会重复扣费。 &/p&&p&&b&3.输出软字幕到剪辑软件 &/b&
可以导出适用于Final Cut Pro 7(如空心字、TextUp2)、Premiere Pro(XML+PRTL)、Edius(XML+ETL)、AVID(Ds Caption)的软字幕格式,以便在非编中直接编辑字幕内容。&/p&&p&&b&4.专业视频格式压制输出&/b&
可输出ProRes、DNxHD、DNxHR等专业格式的视频,满足更高画质的要求。可选使用MP4、MOV、TS、FLV、MKV等封装格式。还可导出内嵌可关闭字幕流的MP4视频。&/p&&p&
在高级压制中,可以选择更丰富的参数,更方便的是可以无损转换封装。做后期的朋友经常为了MKV格式无法导入剪辑软件而烦恼,通过无损转换为MP4或MOV格式(勾选视频和音频编码的直通选项),就可以顺利导入剪辑软件了。&/p&&p&&b&5.常用字体管理器&/b&
以往在调节样式的时候,每次展开字体选择器,都要面对上百个字体,要在里面找到自己常用的几个字体十分不方便。
有了常用字体管理器,就可以预先挑选一部分字体出来作为常用字体。&/p&&p&所以大家根据需求去下载吧。&/p&
来来来,我推荐一个,最好用的字幕制作软件绝对是!分分钟让你体验什么叫一个人的字幕组,就是这么6! 是我用过的最好用的中英文字幕软件,没有之一。(利益相关:无,一个自来水)当我还是一个学生的时候,经常要做一些视频来交作业。window…
&p&(本文根据我博客上的文章&a href=&https://link.zhihu.com/?target=http%3A//www.klayge.org/%3Fp%3D3560& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&跨平台shader编译的过去、现在和未来&/a&改写。知乎编辑器不支持多个级别的标题,以至于我只能用加粗不加粗来区分了。。。)&br&&/p&&p&很多跨平台游戏引擎都有统一shader的需求。比如KlayGE从建立伊始,就强调一份代码跨多个平台,shader代码也不例外。如果需要对不同平台都分别写一遍shader,那样的工作量和可维护性都很糟糕。&/p&&p&既然有这样的需求,就必然会在技术上遇到一个问题,如何把一份代码编译成不同API上的shader。从目前的API上,我们至少需要应对HLSL/GLSL/ESSL,以后还有Vulkan加入战团。这里就打算探讨一下跨平台shader编译的情况,希望对大家有启发意义。&/p&&h2&&b&过去&/b&&/h2&&p&刚有shader高级语言的时候,Cg是几乎唯一的shader语言。后来才在D3D9时代衍生出了HLSL,再往后有了GLSL和ESSL。所以自然而然一开始都会从Cg入手。在KlayGE发展的过程中,这还分为两个阶段。&/p&&h3&运行中使用Cg&/h3&&p&因为早期的Cg和HLSL几乎一样,我的做法是用HLSL写shader,在D3D上用HLSL编译器编译,OpenGL上用Cg编译器编译。遇到Cg不支持的个别语法,就用#ifdef隔开。一开始这个做法工作得还不错,得益于Cg的跨平台,Windows和Linux都能用全套Cg
runtime来跑。不管是编译还是设置状态还是渲染,都通过Cg来实现。这样的系统工作流如下。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-f8dc3dd64d9a2d63a62b99_b.jpg& data-rawwidth=&694& data-rawheight=&639& class=&origin_image zh-lightbox-thumb& width=&694& data-original=&https://pic4.zhimg.com/v2-f8dc3dd64d9a2d63a62b99_r.jpg&&&/figure& 图中模糊边缘的组件表示比较不可靠的组件。比如有性能问题,或缺乏社区支持,或已经停止开发。后同。&/p&&p&这个做法的缺点也很明显。&/p&&ul&&li&&b&问题1&/b&,不支持AMD和Intel的显卡。当时Cg对OpenGL的支持是通过把Cg编译成GL的asm来实现的。而这个过程直接用到了NV的扩展,在其他厂商的卡上跑不了。&/li&&li&&b&问题2&/b&,CPU端的性能损失。即便在NV的卡上,用Cg runtime也会带来一定得性能损失。虽然随着Cg的升级,这个损失在一点点减少。但比起直接用API的,总是慢一截。&/li&&li&&b&问题3&/b&,发展速度。到了D3D10时代,HLSL和GLSL都支持GS,但Cg对其的支持慢了一步,而且仍然严重依赖于NV扩展。再往后的D3D11时代,干脆Cg就进入了龟速发展阶段。&/li&&/ul&&h3&离线使用Cg&/h3&&p&既然用全套Cg
runtime有诸多问题,那么能不能把Cg编译器离线使用呢?在某个版本的Cg里,加了glslv这样的profile,可以把Cg代码编译成GLSL。那么就可以在载入Cg代码后,立刻编译成GLSL保存下来。之后运行过程中完全不需要跟Cg打交道了。这么做解决了之前的问题1和2。因为用的都是GLSL和OpenGL,其他厂商的卡也能跑,因为Cg
runtime造成的性能损失也不存在了。改进后的系统工作流如下。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-df7aad4c025cdb4dca02_b.jpg& data-rawwidth=&712& data-rawheight=&520& class=&origin_image zh-lightbox-thumb& width=&712& data-original=&https://pic3.zhimg.com/v2-df7aad4c025cdb4dca02_r.jpg&&&/figure&&p&但是,问题3仍然存在。即便是编译成GLSL,还是需要受到Cg编译器能力的制约。没法跟上API的发展速度,结果只能用很保守的shader,再用#ifdef等方法仔细隔开。这也是之前很长一段时间,KlayGE里的OpenGL插件在功能上比D3D插件有所欠缺的原因。&/p&&p&另外又多了一个新问题:&/p&&ul&&li&&b&问题4&/b&,兼容性。Cg编译出来的GLSL,虽然说是“按照标准”,但在OpenGL世界,你还得多问一句“按照哪家的标准”。当然,既然Cg是NV的,就肯定是遵照NV的标准。那样的GLSL,还得自己做一遍解析,改掉一些地方才能用于AMD和Intel的卡。甚至有些内置的attribute,生成的时候多了个下划线前缀,也得自己修。&/li&&/ul&&p&正因为有这些问题,大概在2011年的时候,我才会有放弃Cg,自己搞一套编译或转换系统的想法,从HLSL连到GLSL/ESSL。&/p&&h2&&b&现在&/b&&/h2&&p&碰巧在打算放弃Cg的时候,看到了mesa的一个神奇commit,&a href=&https://link.zhihu.com/?target=https%3A//cgit.freedesktop.org/mesa/mesa/commit/%3Fid%3D92617aeaccbb& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&d3d1x for linux&/a&。这个commit是再给mesa增加D3D10/11的原生支持。虽然这个项目最后挂了,但给人们留下了一个叫d3d1xshader的库。这是第一个非官方的完整DX
shader字节码(DXBC)解析的库。用它可以很容易做出来一个反汇编工具。以这个为基础,我们可以实现我设想的转换系统。&/p&&h3&DXBC2GLSL&/h3&&p&经过KlayGE团队成员林胜华(我不知道在不在知乎)的努力,一个称为DXBC2GLSL的库出现了。它可以解析DXBC,生成对应的GLSL和ESSL。但需要特别注意的是,因为官方的D3D
shader编译器是个dll,只能在Windows上跑。在Mac和Linux上需要wine的帮助。这一部分是由&a href=&https://www.zhihu.com/people/96ebf60da4f1295abab79cce388e85c0& data-hash=&96ebf60da4f1295abab79cce388e85c0& class=&member_mention& data-hovercard=&p$b$96ebf60da4f1295abab79cce388e85c0& data-editable=&true& data-title=&@钱康来&&@钱康来&/a& 完成的,用winegcc编译一个dll的wrapper
exe,之后再通过wine调用那个exe,达到调用dll里的函数的能力。 这个把它当做一个新问题吧。&/p&&ul&&li&&b&问题5&/b&,在非Windows平台需要通过wine来执行HLSL编译。&/li&&/ul&&p&有了这么个系统,跨平台shader编译工作流就变成了这样。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8b56fa94f0f4ed6a798e8e_b.jpg& data-rawwidth=&850& data-rawheight=&702& class=&origin_image zh-lightbox-thumb& width=&850& data-original=&https://pic1.zhimg.com/v2-8b56fa94f0f4ed6a798e8e_r.jpg&&&/figure&&p&在DXBC2GLSL的基础上,我又增加了Hull shader和Domain shader的支持,所以OpenGL/OpenGLES插件在功能上已经基本赶上了D3D11的。虽说前面的4个问题都解决了。但还是引入了一个新的性能问题。&/p&&ul&&li&&b&问题6&/b&,生成质量/GPU端的性能损失。可以认为这里的GLSL是通过DXBC反编译得到的,质量并不是特别高。所以GPU端的运行效率也会下降。虽然说常规解决方案是用&a class=& wrap external& href=&https://link.zhihu.com/?target=https%3A//github.com/aras-p/glsl-optimizer& target=&_blank& rel=&nofollow noreferrer&&glsl-optimizer&/a&对生成的GLSL做进一步优化,但这个任务因为时间关系目前还没去做。&/li&&/ul&&p&同时期还有个功能相同的库,叫HLSLcc。也是从d3d1xshader发展而来。&/p&&h2&&b&未来&/b&&/h2&&p&说到底,造成这些问题的原因在于没有一个通用并开放的中间格式。否则用HLSL的前端,接到不同的后端生成不同的目标代码就解决了。UE4的做法是自己写了一个HLSL解析。这么做可以避免问题5,但因为HLSL经常会变,作为个人项目的KlayGE如果这么做会花很多时间在兼容性上。&/p&&p&这时候,Vulkan来了。不但有新API,还带来了一个新的shader中间格式,SPIR-V。而我认为这正是通往统一的跨平台shader编译路上最更要的一级台阶。&/p&&h3&SPIR-V&/h3&&p&SPIR-V和DXBC类似,都是一个shader的二进制中间语言。但比起DXBC,SPIR-V的标准是开放的,有相应的生态系统,解析起来容易得多。根据之前的工作流,我们可以设想一下用到了SPIR-V的话,未来的新工作流会是什么样子。&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-ffbe264be65a42b3fe054b_b.jpg& data-rawwidth=&780& data-rawheight=&684& class=&origin_image zh-lightbox-thumb& width=&780& data-original=&https://pic1.zhimg.com/v2-ffbe264be65a42b3fe054b_r.jpg&&&/figure& 看起来在结构上,比以前几个版本都要简练高效得多,所有不可靠的组件都已经去掉。问题5直接消失了。又因为很多新的OpenGL驱动实际上可以直接输入SPIR-V,老驱动上可以用官方的GLSL/ESSL生成器,所以问题6也消失了。&/p&&p&这个图景就好象一个巨大的拼图,但目前为止,我们还缺了几块没介绍。需要把它们凑齐。&/p&&h4&HLSL-&SPIR-V编译器&/h4&&p&这件事情,已经有Khronos的人在做了&a class=& wrap external& href=&https://link.zhihu.com/?target=https%3A//github.com/KhronosGroup/glslang/issues/362& target=&_blank& rel=&nofollow noreferrer&&Complete HLSL -& SPIR-V translator · Issue #362 · KhronosGroup/glslang&/a&,但终归不是最好的方法,进度和发展速度都缺乏管理。而因为现在微软开源的HLSL编译器&a href=&https://link.zhihu.com/?target=https%3A//github.com/Microsoft/DirectXShaderCompiler& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Microsoft/DirectXShaderCompiler&/a&已经发布,我们可以在那基础上做一个SPIR-V的后端,解决HLSL编译的问题。&/p&&h4&SPIR-V-&GLSL/ESSL&/h4&&p&这有&a class=& wrap external& href=&https://link.zhihu.com/?target=https%3A//github.com/KhronosGroup/SPIRV-Cross& target=&_blank& rel=&nofollow noreferrer&&KhronosGroup/SPIRV-Cross&/a&,是一个已经解决的问题。&/p&&h3&&b&还有什么可能&/b&&/h3&&p&除了前面提到的工作流,我们其实还有一些可能的选项。&/p&&h4&DXBC-&SPIR-V&/h4&&p&除了前面提到的从HLSL直接编译成SPIR-V,其实还可以从DXBC生成SPIR-V。这个难度比直接搞编译器小得多,但很可能做完之后发现HLSL-&SPIR-V已经完善了。&/p&&h4&SPIR-V-&DXBC/DXIL&/h4&&p&这个就更彻底了,连D3D上都用HLSL-&SPIR-V,然后从SPIR-V转成D3D的DXBC或未来的DXIL。但这么做好处实在有限,并且损失了DXBC/DXIL的高效。换句话说,并没有什么原先不能解决的通过这样解决了,也没有什么原先能解决的通过这样解决得更好。&/p&&h4&用GLSL/ESSL&/h4&&p&这样就能都编译到SPIR-V,然后转成DXBC/DXIL。但问题和前面的一样,好处有限。&/p&&h4&Vulkan取代OpenGL/OpenGLES&/h4&&p&在未来某个时候,Vulkan一定会取代OpenGL和OpenGLES。到那时候,跨平台shader编译变得更简单了。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-65b5fb52cf_b.jpg& data-rawwidth=&396& data-rawheight=&504& class=&content_image& width=&396&&&/figure&&h2&&b&总结&/b&&/h2&&p&本文整理了一下一个典型的跨平台shader编译需要需要走过的路程。到现在为止,我们其实离最终目标非常近了。在以后的KlayGE中,我希望能一步步补全这个拼图,让现有的shader编译系统更完善更高效。&/p&
(本文根据我博客上的文章改写。知乎编辑器不支持多个级别的标题,以至于我只能用加粗不加粗来区分了。。。) 很多跨平台游戏引擎都有统一shader的需求。比如KlayGE从建立伊始,就强调一份代码跨多个平台,shader代码也…
既然是web app就应该是单页应用而不是一些大型网站,这里分享一些用写的比较酷的web APP&br&&a href=&//link.zhihu.com/?target=https%3A//v3.polarr.co/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&polarr &/a&在线图片滤镜处理 &a href=&//link.zhihu.com/?target=https%3A//v3.polarr.co/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Polarr Photo Editor&/a& ,应该是用webGL写的性能和体验都非常好&br&&figure&&img src=&https://pic1.zhimg.com/50/7ee8b1c3c5f4cc4e394e7cc_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic1.zhimg.com/50/7ee8b1c3c5f4cc4e394e7cc_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=https%3A//www.verold.com/features& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&verold&/a& 性能很好的3d编辑器 &a href=&//link.zhihu.com/?target=https%3A//www.verold.com/features& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Features :: Verold&/a&&br&&figure&&img src=&https://pic3.zhimg.com/50/d26dab448e97ef460e8dcbd76c4af7b7_b.jpg& data-rawwidth=&1354& data-rawheight=&892& class=&origin_image zh-lightbox-thumb& width=&1354& data-original=&https://pic3.zhimg.com/50/d26dab448e97ef460e8dcbd76c4af7b7_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=http%3A//Clara.io& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&Clara.io&/span&&span class=&invisible&&&/span&&/a&非常强大的在线3d建模+ 渲染 &a href=&//link.zhihu.com/?target=https%3A//clara.io/editor/daef8d49-f1ad--ea& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Clara.io&/a&,居然能整合V-ray&br&&figure&&img src=&https://pic4.zhimg.com/50/0a074cf2d5f_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic4.zhimg.com/50/0a074cf2d5f_r.jpg&&&/figure&&br&&a href=&//link.zhihu.com/?target=https%3A//editor.animatron.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Animatron&/a& SVG动画编辑器,制作出来的动画效果非常赞&br&&figure&&img src=&https://pic3.zhimg.com/50/3bc70abe8cc8d9c8ebaa0_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic3.zhimg.com/50/3bc70abe8cc8d9c8ebaa0_r.jpg&&&/figure&开源,在线版PS &a href=&//link.zhihu.com/?target=http%3A//www.photopea.com/%3Fp%3D%257B%2522files%5B%2522http%3A//www.photopea.com/api/test/images/many_layers.psd%C%2522server%7B%2522url%22http%3A//www.photopea.com/api/test/saveImage.php%22formats%5B%2522psd%7D%257D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Photopea photo editor&/a&&br&&figure&&img src=&https://pic1.zhimg.com/50/7f371eeecddc912_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic1.zhimg.com/50/7f371eeecddc912_r.jpg&&&/figure&开源webgl编辑器 &a href=&//link.zhihu.com/?target=http%3A//webglstudio.org/demo/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WebGLStudio&/a&&br&&figure&&img src=&https://pic3.zhimg.com/50/cabe_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic3.zhimg.com/50/cabe_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=http%3A//www.3dtin.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&3dtin.com/&/span&&span class=&invisible&&&/span&&/a&&figure&&img src=&https://pic2.zhimg.com/50/1d827c10fe9eb74c1a985_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic2.zhimg.com/50/1d827c10fe9eb74c1a985_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=http%3A//tridiv.com/app/index.html%3Fdmlldz1lZGl0b3ImZG9jPXsic2V0dGluZ3MiOnsibGlnaHQiOiJzdGF0aWMiLCJib3JkZXIiOiIxIiwiYmciOiIjMDgxODJmIiwic2hhZGUiOiIuNCIsInRpbnQiOiIwLjE4Iiwiem9vbSI6IjEwMCIsIm1hdGNoIjoiMC41Iiwic25hcCI6Im9uIiwibmFtZSI6Ilgtd2luZyJ9LCJzaGFwZXMiOlt7InR5cGUiOiJjdWJvaWQiLCJ5IjoiMC42MjUiLCJ6IjoxLjc1LCJ3IjozLjUsImgiOiIzLjI1IiwiZCI6Ny41LCJjQWxsIjoiI2JmYzljNSIsIm5hbWUiOiJjdWItMSJ9LHsidHlwZSI6InByaXNtIiwieSI6LTEuNSwieiI6My4yNSwidyI6My41LCJoIjoiLjkiLCJkIjoiNC40IiwibyI6Ii41IiwiY0FsbCI6IiMzMjg0Y2UiLCJjQmsiOiIjMDIxMDFmIiwiY0JtIjoiIzEyM2E1ZiIsIm5hbWUiOiJwcmktMSJ9LHsidHlwZSI6ImN1Ym9pZCIsInkiOi0xLjUsInoiOi0wLjUsInciOjMuNSwiaCI6MSwiY0FsbCI6IiNiZmM5YzUiLCJuYW1lIjoiY3ViLTIifSx7InR5cGUiOiJwcmlzbSIsInkiOiItMC42MjUiLCJ6IjoxMC41LCJ3IjoyLCJoIjoiLjc1IiwiZCI6MTAsImNBbGwiOiIjYmZjOWM1IiwibmFtZSI6InByaS0yIn0seyJ0eXBlIjoicHJpc20iLCJ4IjoxLjI1LCJ5IjowLjUsInoiOjEwLjUsInciOjEuNSwiaCI6MSwiZCI6MTAsInJ6IjoiOTAiLCJjRnQiOiIjOGIyNjI2IiwiY0x0IjoiI2JmYzljNSIsImNSdCI6IiNiZmM5YzUiLCJuYW1lIjoicHJpLTMifSx7InR5cGUiOiJwcmlzbSIsIngiOi0xLjI1LCJ5IjowLjUsInoiOjEwLjUsInciOjEuNSwiaCI6MSwiZCI6MTAsInJ6IjoyNzAsImNBbGwiOiIjYmZjOWM1IiwiY0Z0IjoiIzhiMjYyNiIsIm5hbWUiOiJwcmktNCJ9LHsidHlwZSI6InByaXNtIiwieSI6LTAuMjUsInoiOjE3LCJ3IjoiMiIsImgiOiIxIiwiY0FsbCI6IiNiMWJiYjciLCJuYW1lIjoicHJpLTUifSx7InR5cGUiOiJjdWJvaWQiLCJ5IjowLjc1LCJ6IjoxNywidyI6MiwiaCI6IjEiLCJjQWxsIjoiI2IxYmJiNyIsIm5hbWUiOiJjdWItMyJ9LHsidHlwZSI6ImN1Ym9pZCIsIngiOi03Ljc1LCJ5IjotMS43NSwieiI6LTUuNSwidyI6IjExIiwiaCI6Ii41IiwiZCI6IjQiLCJyeiI6IjE2IiwiY0FsbCI6IiNiZmM5YzUiLCJuYW1lIjoiY3ViLTQifSx7InR5cGUiOiJwcmlzbSIsIngiOjIuMjUsInkiOi0wLjc1LCJ6IjotNi4yNSwidyI6OC41LCJoIjoiMi41IiwiZCI6MSwicnkiOiI5MCIsImNBbGwiOiIjYmZjOWM1IiwiY0x0IjoiIzY3NmY3MiIsIm5hbWUiOiJwcmktNiJ9LHsidHlwZSI6InByaXNtIiwieCI6LTIuMjUsInkiOi0wLjc1LCJ6IjotNi4yNSwidyI6OC41LCJoIjoiMi41IiwiZCI6MSwicnkiOiIyNzAiLCJyeiI6IjAiLCJjQWxsIjoiI2JmYzljNSIsImNSdCI6IiM2NzZmNzIiLCJuYW1lIjoicHJpLTcifSx7InR5cGUiOiJwcmlzbSIsIngiOi0yLjI1LCJ5IjoxLjc1LCJ6IjotNi4yNSwidyI6OC41LCJoIjoiMi41IiwiZCI6MSwicngiOiIxODAiLCJyeSI6MjcwLCJjQWxsIjoiI2JmYzljNSIsImNMdCI6IiM2NzZmNzIiLCJuYW1lIjoicHJpLTgifSx7InR5cGUiOiJwcmlzbSIsIngiOjIuMjUsInkiOjEuNzUsInoiOi02LjI1LCJ3Ijo4LjUsImgiOiIyLjUiLCJkIjoxLCJyeCI6IjE4MCIsInJ5IjoiOTAiLCJjQWxsIjoiI2JmYzljNSIsImNSdCI6IiM2NzZmNzIiLCJuYW1lIjoicHJpLTkifSx7InR5cGUiOiJjeWxpbmRlciIsIngiOi0zLjUsInkiOi0yLCJ6IjotNSwiZGlhbWV0ZXIiOiIyLjUiLCJyeCI6Ii05MCIsInNpZGVzIjoiOCIsImNBbGwiOiIjYTZhZmFjIiwiY1RwIjoiIzJkMzEzMyIsIm5hbWUiOiJjeWwtMSJ9LHsidHlwZSI6ImN5bGluZGVyIiwieCI6LTMuNSwieSI6LTIsInoiOi0xMCwiZGlhbWV0ZXIiOiIxLjUiLCJyeCI6Ii05MCIsInNpZGVzIjoiNiIsImNBbGwiOiIjN2E3MTZiIiwibmFtZSI6ImN5bC0yIn0seyJ0eXBlIjoicHJpc20iLCJ4IjotOC43NSwieSI6LTIsInoiOi04LjUsInciOjAuNSwiaCI6IjkiLCJkIjoyLCJyeSI6MTgwLCJyeiI6Ijc0IiwiY0FsbCI6IiNiZmM5YzUiLCJuYW1lIjoicHJpLTEwIn0seyJ0eXBlIjoiY3lsaW5kZXIiLCJ4IjotMTIuMjUsInkiOi00LCJ6IjotNS41LCJkaWFtZXRlciI6IjEuNSIsImgiOiI2IiwicngiOiItOTAiLCJyeSI6IjEiLCJzaWRlcyI6IjYiLCJjQWxsIjoiIzhiOTU5YSIsImNUcCI6IiM0ZjRmNGYiLCJuYW1lIjoiY3lsLTMifSx7InR5cGUiOiJjdWJvaWQiLCJ4IjotMTIuMjUsInkiOi00LCJ6IjoyLCJ3IjoiMC40IiwiaCI6IjAuNCIsImQiOiI5IiwiY0FsbCI6IiNiMWJiYjciLCJuYW1lIjoiY3ViLTUifSx7InR5cGUiOiJjdWJvaWQiLCJ4Ijo3Ljc1LCJ5IjotMS43NSwieiI6LTUuNSwidyI6IjExIiwiaCI6Ii41IiwiZCI6IjQiLCJyeCI6Ii0xODAiLCJyeiI6IjE2IiwiY0FsbCI6IiNiZmM5YzUiLCJuYW1lIjoiY3ViLTYifSx7InR5cGUiOiJjeWxpbmRlciIsIngiOjMuNSwieSI6LTIsInoiOi01LCJkaWFtZXRlciI6IjIuNSIsInJ4IjoiLTkwIiwic2lkZXMiOiI4IiwiY0FsbCI6IiNhNmFmYWMiLCJjVHAiOiIjMmQzMTMzIiwibmFtZSI6ImN5bC00In0seyJ0eXBlIjoiY3lsaW5kZXIiLCJ4IjozLjUsInkiOi0yLCJ6IjotMTAsImRpYW1ldGVyIjoiMS41IiwicngiOiItOTAiLCJzaWRlcyI6IjYiLCJjQWxsIjoiIzdhNzE2YiIsIm5hbWUiOiJjeWwtNSJ9LHsidHlwZSI6ImN5bGluZGVyIiwieCI6MTIuMjUsInkiOi00LCJ6IjotNS41LCJkaWFtZXRlciI6IjEuNSIsImgiOiI2IiwicngiOi05MCwicnkiOiItMSIsInNpZGVzIjoiNiIsImNBbGwiOiIjOGI5NTlhIiwiY1RwIjoiIzM1MzUzNSIsIm5hbWUiOiJjeWwtNiJ9LHsidHlwZSI6ImN1Ym9pZCIsIngiOjEyLjI1LCJ5IjotNCwieiI6MiwidyI6IjAuNCIsImgiOiIwLjQiLCJkIjoiOSIsImNBbGwiOiIjYjFiYmI3IiwibmFtZSI6ImN1Yi03In0seyJ0eXBlIjoicHJpc20iLCJ4Ijo4Ljc1LCJ5IjotMiwieiI6LTguNSwidyI6MC41LCJoIjoiOSIsImQiOjIsInJ4IjoiLTE4MCIsInJ6IjoiMTA2IiwiY0FsbCI6IiNiZmM5YzUiLCJuYW1lIjoicHJpLTExIn0seyJ0eXBlIjoiY3Vib2lkIiwieCI6LTcuNzUsInkiOjIuNzUsInoiOi01LjUsInciOiIxMSIsImgiOiIuNSIsImQiOiI0IiwicnoiOiItMTYiLCJjQWxsIjoiI2JmYzljNSIsIm5hbWUiOiJjdWItOCJ9LHsidHlwZSI6ImN1Ym9pZCIsIngiOjcuNzUsInkiOjIuNzUsInoiOi01LjUsInciOiIxMSIsImgiOiIuNSIsImQiOiI0IiwicngiOiItMTgwIiwicnoiOiItMTYiLCJjQWxsIjoiI2JmYzljNSIsIm5hbWUiOiJjdWItOSJ9LHsidHlwZSI6ImN5bGluZGVyIiwieCI6LTMuNSwieSI6MywieiI6LTUsImRpYW1ldGVyIjoiMi41IiwicngiOiItOTAiLCJzaWRlcyI6IjgiLCJjQWxsIjoiI2E2YWZhYyIsImNUcCI6IiMyZDMxMzMiLCJuYW1lIjoiY3lsLTcifSx7InR5cGUiOiJjeWxpbmRlciIsIngiOi0zLjUsInkiOjMsInoiOi0xMCwiZGlhbWV0ZXIiOiIxLjUiLCJyeCI6Ii05MCIsInNpZGVzIjoiNiIsImNBbGwiOiIjN2E3MTZiIiwibmFtZSI6ImN5bC04In0seyJ0eXBlIjoiY3lsaW5kZXIiLCJ4IjozLjUsInkiOjMsInoiOi0xMCwiZGlhbWV0ZXIiOiIxLjUiLCJyeCI6Ii05MCIsInNpZGVzIjoiNiIsImNBbGwiOiIjN2E3MTZiIiwibmFtZSI6ImN5bC05In0seyJ0eXBlIjoiY3lsaW5kZXIiLCJ4IjozLjUsInkiOjMsInoiOi01LCJkaWFtZXRlciI6IjIuNSIsInJ4IjoiLTkwIiwic2lkZXMiOiI4IiwiY0FsbCI6IiNhNmFmYWMiLCJjVHAiOiIjMmQzMTMzIiwibmFtZSI6ImN5bC0xMCJ9LHsidHlwZSI6InByaXNtIiwieSI6IjIuNjI1IiwieiI6LTAuNSwidyI6IjMuNSIsImgiOiIuNzUiLCJyeiI6Ii0xODAiLCJjQWxsIjoiI2JmYzljNSIsIm5hbWUiOiJwcmktMTIifSx7InR5cGUiOiJjdWJvaWQiLCJ5IjowLjUsInoiOi02LjI1LCJ3IjozLjUsImQiOjguNSwiY0FsbCI6IiNiZmM5YzUiLCJjQmsiOiIjNjc2ZjcyIiwibmFtZSI6ImN1Yi0xMCJ9LHsidHlwZSI6ImN5bGluZGVyIiwieCI6MTIuMjUsInkiOjUsInoiOi01LjUsImRpYW1ldGVyIjoiMS41IiwiaCI6IjYiLCJyeCI6Ii05MCIsInJ5IjoiLTEiLCJzaWRlcyI6IjYiLCJjQWxsIjoiIzhiOTU5YSIsImNUcCI6IiM0ZjRmNGYiLCJuYW1lIjoiY3lsLTExIn0seyJ0eXBlIjoiY3lsaW5kZXIiLCJ4IjotMTIuMjUsInkiOjUsInoiOi01LjUsImRpYW1ldGVyIjoiMS41IiwiaCI6IjYiLCJyeCI6Ii05MCIsInJ5IjoiLTEiLCJzaWRlcyI6IjYiLCJjQWxsIjoiIzhiOTU5YSIsImNUcCI6IiM0ZjRmNGYiLCJuYW1lIjoiY3lsLTEyIn0seyJ0eXBlIjoiY3Vib2lkIiwieCI6LTEyLjI1LCJ5Ijo1LCJ6IjoyLCJ3IjoiMC40IiwiaCI6IjAuNCIsImQiOiI5IiwiY0FsbCI6IiNiMWJiYjciLCJuYW1lIjoiY3ViLTExIn0seyJ0eXBlIjoiY3Vib2lkIiwieCI6MTIuMjUsInkiOjUsInoiOjIsInciOiIwLjQiLCJoIjoiMC40IiwiZCI6IjkiLCJjQWxsIjoiI2IxYmJiNyIsIm5hbWUiOiJjdWItMTIifSx7InR5cGUiOiJwcmlzbSIsIngiOjguNzUsInkiOjMsInoiOi04LjUsInciOjAuNSwiaCI6IjkiLCJkIjoyLCJyeCI6Ii0xODAiLCJyeiI6Ijc0IiwiY0FsbCI6IiNiZmM5YzUiLCJuYW1lIjoicHJpLTEzIn0seyJ0eXBlIjoicHJpc20iLCJ4IjotOC43NSwieSI6MywieiI6LTguNSwidyI6MC41LCJoIjoiOSIsImQiOjIsInJ5IjoxODAsInJ6IjoiMTA2IiwiY0FsbCI6IiNiZmM5YzUiLCJuYW1lIjoicHJpLTE0In0seyJ0eXBlIjoicHJpc20iLCJ4IjotMi4wMzEwMzQ0ODI3NTg2MjA2LCJ5IjowLjUsInoiOjEuNzUsInciOiIxLjUiLCJoIjowLjUsImQiOjcuNSwicnoiOjI3MCwiY0FsbCI6IiNiZmM5YzUiLCJjRnQiOiIjOGIyNjI2IiwibmFtZSI6InByaS0xNSJ9LHsidHlwZSI6InByaXNtIiwieCI6Mi4wMzEwMzQ0ODI3NTg2MjA2LCJ5IjowLjQ4Mjc1ODYyMDY4OTY1NTE0LCJ6IjoxLjc1LCJ3IjoiMS41IiwiaCI6MC41LCJkIjo3LjUsInJ6IjoiOTAiLCJjQWxsIjoiI2JmYzljNSIsImNGdCI6IiM4YjI2MjYiLCJuYW1lIjoicHJpLTE2In0seyJ0eXBlIjoicHJpc20iLCJ5IjoxLjc1LCJ6IjoxMiwidyI6IjIiLCJoIjoxLCJkIjoiMTMiLCJyeiI6Ii0xODAiLCJjQWxsIjoiI2JmYzljNSIsIm5hbWUiOiJwcmktMTcifSx7InR5cGUiOiJjdWJvaWQiLCJ4IjozLjUsInkiOi0yLCJ6IjoiLTIuNDEiLCJ3IjoiMi41IiwiaCI6IjAuMjUiLCJkIjoiMC4xIiwicnoiOiItMTYiLCJjQWxsIjoiIzk3OTc5YiIsIm5hbWUiOiJjdWItMTMifSx7InR5cGUiOiJjdWJvaWQiLCJ4IjotMy41LCJ5IjoiLTIiLCJ6IjoiLTIuNDEiLCJ3IjoiMi41IiwiaCI6IjAuMjUiLCJkIjoiMC4xIiwicnoiOiIxNiIsImNBbGwiOiIjOTc5NzliIiwibmFtZSI6ImN1Yi0xNCJ9LHsidHlwZSI6ImN1Ym9pZCIsIngiOi0zLjUsInkiOjMsInoiOiItMi40MSIsInciOiIyLjUiLCJoIjoiMC4yNSIsImQiOiIwLjEiLCJyeiI6Ii0xNiIsImNBbGwiOiIjOTc5NzliIiwibmFtZSI6ImN1Yi0xNSJ9LHsidHlwZSI6ImN1Ym9pZCIsIngiOjMuNSwieSI6MywieiI6Ii0yLjQxIiwidyI6IjIuNSIsImgiOiIwLjI1IiwiZCI6IjAuMSIsInJ6IjoiMTYiLCJjQWxsIjoiIzk3OTc5YiIsIm5hbWUiOiJjdWItMTYifSx7InR5cGUiOiJjdWJvaWQiLCJ4IjotOC41LCJ5IjoiLTIuMyIsInoiOi01LjI1LCJ3IjoiMi41IiwiaCI6Ii4xIiwiZCI6IjMuNSIsInJ6IjoiMTYiLCJjQWxsIjoiI2JmYzljNSIsImNUcCI6IiM4YjI2MjYiLCJuYW1lIjoiY3ViLTE3In0seyJ0eXBlIjoiY3Vib2lkIiwieCI6IjguNSIsInkiOiItMi4zIiwieiI6LTUuMjUsInciOiIyLjUiLCJoIjoiLjEiLCJkIjoiMy41IiwicnoiOiItMTYiLCJjQWxsIjoiI2JmYzljNSIsImNUcCI6IiM4YjI2MjYiLCJuYW1lIjoiY3ViLTE4In1dfQ%3D%3D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tridiv | CSS 3D Editor&/a& 基于css3 3d 的编辑器&br&&figure&&img src=&https://pic3.zhimg.com/50/938dd6e0ea7a_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic3.zhimg.com/50/938dd6e0ea7a_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=http%3A//sub.blue/fractal-lab& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&sub.blue/fractal-lab&/span&&span class=&invisible&&&/span&&/a& 之前开源的,现在用react重新了&br&&figure&&img src=&https://pic4.zhimg.com/50/fac32efdc8235aae4fa7e_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic4.zhimg.com/50/fac32efdc8235aae4fa7e_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=http%3A//idflood.github.io/ThreeNodes.js/index_optimized.html%23example/spreads1.json& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ThreeNodes.js::0.2.0&/a&&br&&figure&&img src=&https://pic3.zhimg.com/50/2fff5f9fae1cdd051ff4d8b9d460f552_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic3.zhimg.com/50/2fff5f9fae1cdd051ff4d8b9d460f552_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=https%3A//flowhub.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Flowhub - Peer-to-peer full-stack visual programming for your fingers&/a& 基于节点的编程&br&&figure&&img src=&https://pic1.zhimg.com/50/9e9ecfc43e8aee8adb620c_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic1.zhimg.com/50/9e9ecfc43e8aee8adb620c_r.jpg&&&/figure&所见即所得建站工具类:&br&&a href=&//link.zhihu.com/?target=https%3A//webflow.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&webflow.com/&/span&&span class=&invisible&&&/span&&/a&&br&&figure&&img src=&https://pic1.zhimg.com/50/4ac36a295dc86d039fc62ea4f33f66c0_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic1.zhimg.com/50/4ac36a295dc86d039fc62ea4f33f66c0_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=http%3A//www.strikingly.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Strikingly - 可能是移动时代最出色的免费建站工具&/a&&br&&figure&&img src=&https://pic1.zhimg.com/50/a7cef0bbf6c7ed7255a9_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic1.zhimg.com/50/a7cef0bbf6c7ed7255a9_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=http%3A//www.squarespace.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Build a Website&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.wix.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Free Website Builder&/a&
www. squarespace.com&br&&br&等等。。。。。。。。&br&还有非常非常多,&br&上面的都是些偏向设计和3d的比较专业,而比较常见的诸如Google docs,Google inbox,Quip, Teambition...... 等等更多,随着前端SPA框架React,angular,Vue,ember,Aurelia, Cycle, ember等的兴起,web app已经非常非常多了,&br&&br&============== 国内=============&br&&a href=&//link.zhihu.com/?target=http%3A//www.maka.im/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&『MAKA』免费H5页面&/a&&br&&figure&&img src=&https://pic4.zhimg.com/50/91fefaec366f9febd982_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic4.zhimg.com/50/91fefaec366f9febd982_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=http%3A//www.epub360.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Epub360意派&/a&&br&&figure&&img src=&https://pic2.zhimg.com/50/80e2c1f6ef44cb76af7aded3922893dd_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic2.zhimg.com/50/80e2c1f6ef44cb76af7aded3922893dd_r.jpg&&&/figure&&a href=&//link.zhihu.com/?target=http%3A//yanshuo.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&演说.io - 随时随地的在线展示文稿&/a&
作者: &a data-hash=&12b74fdb32dc5e8a03d1& href=&//www.zhihu.com/people/12b74fdb32dc5e8a03d1& class=&member_mention& data-hovercard=&p$b$12b74fdb32dc5e8a03d1&&@黄玄&/a&&br&&figure&&img src=&https://pic3.zhimg.com/50/3ee085fde38ffa9e6e7ef90_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic3.zhimg.com/50/3ee085fde38ffa9e6e7ef90_r.jpg&&&/figure&&br&&br&&br&&a href=&//link.zhihu.com/?target=https%3A//hejiao.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&禾教 - 交互教学平台&/a&&br&&figure&&img src=&https://pic2.zhimg.com/50/f1bd3ce4f62a5fc591ec2_b.jpg& data-rawwidth=&1991& data-rawheight=&1169& class=&origin_image zh-lightbox-thumb& width=&1991& data-original=&https://pic2.zhimg.com/50/f1bd3ce4f62a5fc591ec2_r.jpg&&&/figure&其他&br&&a href=&//link.zhihu.com/?target=http%3A//www.ih5.cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iH5最专业H5制作工具 &创作服务平台&/a&&br&&br&&br&我个人比较关注设计方面的web app, 自己也在开发一个互动视频编辑器,略粗糙&br&&figure&&img src=&https://pic2.zhimg.com/50/531cfaca9f517cf246e12_b.jpg& data-rawwidth=&3104& data-rawheight=&1970& class=&origin_image zh-lightbox-thumb& width=&3104& data-original=&https://pic2.zhimg.com/50/531cfaca9f517cf246e12_r.jpg&&&/figure&
既然是web app就应该是单页应用而不是一些大型网站,这里分享一些用写的比较酷的web APP 在线图片滤镜处理
,应该是用webGL写的性能和体验都非常好
性能很好的3d编辑器
非常强大…
我觉得有趣的文章一般是两种:其一是用简单、精美的数学公式,来解决问题,结果漂亮;其二是脑洞比较大,用了好玩的硬件或者技术,结果逗比。。。&br&&br&以下内容包含sig/sig asia,写完发现貌似全是technique paper;完整列表参见kesen维护的页面&a href=&//link.zhihu.com/?target=http%3A//kesen.realtimerendering.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Resource for Computer Graphics&/a&&br&&br&注1. 分类不一定精确,不要在意细节~&br&注2. 暂时更新告一段落,等有看到新的好玩的再刷上来 () 要毕不了业了TAT&br&注3. 我做的偏渲染,然后对图像视频比较感兴趣;网格、物理仿真、动画等领域不熟,见谅_(:з」∠)_&br&&br&&b&图像类&/b&&br&1. Possion Image Editing&br&前面几个答案提到了,这篇文章非常经典加好用!引用数也是惊人啊&br&&br&2. Coordinates for Instant Image Cloning&br&也是gradient field方法,不过计算量比解泊松方程小很多,结果也不差&br&&figure&&img src=&https://pic4.zhimg.com/50/0cd90ccaf678f9007e1d_b.jpg& data-rawwidth=&1249& data-rawheight=&297& class=&origin_image zh-lightbox-thumb& width=&1249& data-original=&https://pic4.zhimg.com/50/0cd90ccaf678f9007e1d_r.jpg&&&/figure&&br&3. Halftone QR Codes&br&生成对应图案的二维码,在我之前一个回答里有提到过 &a href=&http://www.zhihu.com/question//answer/& class=&internal&&QR 二维码在不影响扫码的情况下,哪些部分可以删除? - 钱康来的回答&/a&&br&&p&&a href=&//link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Albert_Einstein& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&en.wikipedia.org/wiki/A&/span&&span class=&invisible&&lbert_Einstein&/span&&span class=&ellipsis&&&/span&&/a& (二维码自动识别)&/p&&br&4. PatchMatch A Randomized Correspondence Algorithm for Structural Image Editing&br&这也是一篇很经典的文章,可以拿来“补洞” (我记得Photoshop里的智能感知修补就是这个技术&br&&figure&&img src=&https://pic3.zhimg.com/50/6ac951b80bdff2394848f_b.jpg& data-rawwidth=&1595& data-rawheight=&268& class=&origin_image zh-lightbox-thumb& width=&1595& data-original=&https://pic3.zhimg.com/50/6ac951b80bdff2394848f_r.jpg&&&/figure&&br&5.
High-quality Motion Deblurring from a Single Image &br&Fast Motion Deblurring&br&对于手机拍出来的&del&撸多了&/del&模糊的照片,如何恢复&br&&figure&&img src=&https://pic3.zhimg.com/50/fea0c05cc3_b.jpg& data-rawwidth=&1557& data-rawheight=&501& class=&origin_image zh-lightbox-thumb& width=&1557& data-original=&https://pic3.zhimg.com/50/fea0c05cc3_r.jpg&&&/figure&&br&6. “GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts&br&微软出品,只要选一个框,就能自动前后景分离。。。(魔棒什么弱爆了&br&&figure&&img src=&https://pic3.zhimg.com/50/d53479fbe88df16f468c_b.jpg& data-rawwidth=&1631& data-rawheight=&249& class=&origin_image zh-lightbox-thumb& width=&1631& data-original=&https://pic3.zhimg.com/50/d53479fbe88df16f468c_r.jpg&&&/figure&&br&7. A Geometric Study of V-style Pop-ups: Theories and Algorithms&br&Popup: Automatic Paper Architectures from 3D Models 做折纸的&br&&a data-hash=&7b5c307ca70& href=&//www.zhihu.com/people/7b5c307ca70& class=&member_mention& data-editable=&true& data-title=&@superwit& data-hovercard=&p$b$7b5c307ca70&&@superwit&/a&提到的~作者的好几篇工作也很意思了&a href=&//link.zhihu.com/?target=http%3A//cg.cs.tsinghua.edu.cn/people/%7Exianying/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Xian-Ying Li's Homepage&/a&,他毕业去网易游戏了 &br&&figure&&img src=&https://pic1.zhimg.com/50/bda3dadc45c72d51fecc5221_b.jpg& data-rawwidth=&400& data-rawheight=&300& class=&content_image& width=&400&&&/figure&&figure&&img src=&https://pic1.zhimg.com/50/157c23a04b310bd203d7_b.jpg& data-rawwidth=&400& data-rawheight=&300& class=&content_image& width=&400&&&/figure&&br&8. Intrinsic Video and Applications &br&输入一段视频,然后可以直接批量修改材质...(譬如紫色衣服变绿色之类的。。。&br&视频只找到youtube的,求搬运。。。&br&&figure&&img src=&https://pic4.zhimg.com/50/b3b3ed81ebac375c7d336_b.jpg& data-rawwidth=&1000& data-rawheight=&209& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&https://pic4.zhimg.com/50/b3b3ed81ebac375c7d336_r.jpg&&&/figure&&br&&br&9. 3D Object Manipulation in a Single Photograph using
Stock 3D Models&br&3-Sweep: Extracting Editable Objects from a Single Photo &br&(这一类的文章还有不少,我就只举例了)&br&在输入的单张图片里做各种修改,第二个文章的视频可能很多人见过了,凶残啊&br&&a class=&video-box& href=&//link.zhihu.com/?target=http%3A//v.youku.com/v_show/id_XNjA3MjAxMDk2.html%3Ffrom%3Ds1.8-1-1.2& target=&_blank& data-video-id=&& data-video-playable=&& data-name=&3-Sweep: Extracting Editable Objects from a Single Photo& data-poster=&http://g3.ykimg.com/22E0E1E9FFBC2E4C7C-D353-FEE5-40C0-357845ABA0BA& data-lens-id=&&&
&img class=&thumbnail& src=&http://g3.ykimg.com/22E0E1E9FFBC2E4C7C-D353-FEE5-40C0-357845ABA0BA&&&span class=&content&&
&span class=&title&&3-Sweep: Extracting Editable Objects from a Single Photo&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&http://v.youku.com/v_show/id_XNjA3MjAxMDk2.html?from=s1.8-1-1.2&/span&
&/a&&br&&br&&br&&b&视频类&/b&&br&1. Eulerian Video Magnification for Revealing Subtle Changes in the World&br&前面有人提到了~用高频相机拍摄的轻微变化,利用频域方法方法(我记得有人用这个在创业,譬如iPhone摄像头测心率&br&&figure&&img src=&https://pic4.zhimg.com/50/2e07a72a229c_b.jpg& data-rawwidth=&453& data-rawheight=&176& class=&origin_image zh-lightbox-thumb& width=&453& data-original=&https://pic4.zhimg.com/50/2e07a72a229c_r.jpg&&&/figure&&br&&br&2. Phase-Based Video Motion Processing&br&和上一篇有点类似的感觉,放大普通相机拍摄视频中,本来肉眼看不清的部分&br&比较逗的是,&b&作者最后还用高频相机去捕捉物理现象,证明了他们的方法是物理真实的&/b&……&br&&figure&&img src=&https://pic4.zhimg.com/50/1282f70ccd6bf7c36ce669_b.jpg& data-rawwidth=&717& data-rawheight=&271& class=&origin_image zh-lightbox-thumb& width=&717& data-original=&https://pic4.zhimg.com/50/1282f70ccd6bf7c36ce669_r.jpg&&&/figure&&br&&br&3. Automated Video Looping with Progressive Dynamism&br&根据输入视频,做一个&b&无限循环的视频&/b&出来(鬼畜GIF即视感&br&&br&4. Selectively De-Animating Video&br&&b&这篇我很喜欢!也是拿来做鬼畜的&/b&&br&&b&效果就是拍摄一段视频,然后把其他地方“静止”,可以看这个网站 &a href=&//link.zhihu.com/?target=http%3A//cinemagraphs.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cinemagraphs&/a&&/b&&br&&br&5. Video Deblurring for Hand-held Cameras Using Patch-based Synthesis&br&这个和图片部分有一个很像,也是把模糊的视频变清晰(可惜不能有码变无码_(:з」∠)_&br&&br&6. VideoSnapping: Interactive Synchronization of Multiple Videos&br&&b&安利一个作者 &a href=&//link.zhihu.com/?target=http%3A//zurich.disneyresearch.com/%7Eowang/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Oliver Wang&/a& 我很喜欢他的工作&/b&&br&这个工作是拍多个视频,然后组成一个“大”视频&br&&figure&&img src=&https://pic1.zhimg.com/50/fe4f5b3bf567e7d20802_b.jpg& data-rawwidth=&1047& data-rawheight=&263& class=&origin_image zh-lightbox-thumb& width=&1047& data-original=&https://pic1.zhimg.com/50/fe4f5b3bf567e7d20802_r.jpg&&&/figure&&br&7. Video Face Replacement&br&直接视频换脸,可以自动对嘴型&br&&a class=&video-box& href=&//link.zhihu.com/?target=http%3A//v.youku.com/v_show/id_XMzQ3NTIzNTQ0.html%3Ffrom%3Ds1.8-1-1.2& target=&_blank& data-video-id=&& data-video-playable=&& data-name=&Video Face Replacement& data-poster=&http://g2.ykimg.com/EF530CD1BCF04A897D1ED3C5BE8-A12F-F31D-F35D-F8EC26F4CD07& data-lens-id=&&&
&img class=&thumbnail& src=&http://g2.ykimg.com/EF530CD1BCF04A897D1ED3C5BE8-A12F-F31D-F35D-F8EC26F4CD07&&&span class=&content&&
&span class=&title&&Video Face Replacement&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&http://v.youku.com/v_show/id_XMzQ3NTIzNTQ0.html?from=s1.8-1-1.2&/span&
&/a&&br&&br&&b&渲染类&/b&&br&啊啊啊啊最近没看到特别好玩的……采样技术算不算_(:з」∠)_&br&我再想想&br&&br&&b&动画类&/b&&br&1. Realtime Facial Animation with On-the-fly Correctives&br&&b&主要是作者很有意思 &a href=&//link.zhihu.com/?target=http%3A//w

我要回帖

更多关于 wiibeto 的文章

 

随机推荐