On Mesh Cloud Rendering – Reimplement Sea of Thieves’ cloud | 模型云渲染-重现盗贼之海的云

Sea of Thieves, Tech Art and Shader Development中提到了他们的云的渲染方法,非常的trick和cheap,对云的渲染模型做了相当大的简化,然后却还有不错的效果。笔者这里尝试重现Sea of Thieves中云的做法。原作在视频中给出了很多细节原理,笔者这里给出一点补充。 本文的代码,模型,houdini预计算文件在Github可获取: Mesh-Cloud-Rendering 1. 体渲染原理 首先我们回顾一下体渲染的公式 体积渲染图解,来自RTR4 体积渲染公式,来自RTR4 体积渲染的原理可以用上面这个图解和公式表示。 这个式子有两项,p点是视线上第一个不透明物体,c是相机,v是视线 前面一项是p点到c点的透射度(Transmittance) 乘以 p点的颜色后面一项是一个视线路径的...
Read More

A Short History of Parallax Occlusion Mapping/Relief Mapping | 视差贴图,一个简短的历史

上图:左-法线贴图,右-视差贴图 我们常用法线贴图模拟表面的细节凹凸,不过法线贴图的一个问题是在视角很低(Gazing Angle)时会出现失真。 主要原因是法线贴图不会考虑高度的遮挡关系,因此有一些被遮挡的面会被渲染出来。解决这一问题的方法主要有两种: Tessellation, 通过细分增加面数,使得面片具有高度。Parallax Occlusion Mapping/Relief Mapping,通过在贴图空间中根据视线的方向,通过与高度图求交,获取到真实应该采样的UV坐标。 第一种方式增加了顶点和面数,对vertex/hull tess压力较大,而后一种由于需要多次采样高度图,对pixel shader压力较大。以下主要讨论POM/Relief的原理和一些修正。 1. Offset Limiting Parallax 最早是2001年...
Read More

Hair Rendering and Modelling – An Intro | 头发渲染与建模 – 简介

这篇中回顾了头发渲染模型的历史和一些实现细节,尝试使用Ornatrix建模头发,并在Unity中重现了UE中的Marschner模型,添加了eccentric参数。 1 渲染   1.1 Kajiya-Kay     最早研究毛发渲染的便是Kajiya和Kay,他们在1989年提出了Kajiya-Kay模型。这也成为了实时图形学的标准方法,甚至在30年后的今天,大量游戏的头发还是使用的这个模型。Jim Kajiya应该是个日裔,他在Utah大学完成的博士学位,目前还在微软研究院工作。他因为对毛发渲染做出的突出贡献,获得了1997年的奥斯卡技术贡献奖。   在游戏中使用这个模型还要追溯到GDC2004的Hair Rendering and Shading这个Talk,主讲者Thorsten Scheuermann来自AMD。PPT中比较详细地描述了kajiyakay模型和一些hacking技...
Read More

Vertex Shader Animation Revisit | 顶点动画再议

1. 概述 mesh的顶点可定义属性,比较常见的自定义通道是顶点色color和uv3 uv4及以上,因为一般uv1是贴图坐标,uv2是lightmap坐标,所以不太考虑这俩。那就这些我们就已经有 3 * 4 = 12个通道了。这里面可以存的数据一般包括: 运动强度 1个频率1个通道就够了 运动相位,防止运动sync,取决于有几层相位叠加了,1个频率1个通道 位置,意义上可能是运动的目标位置,或者LOD的位置,这个一般需要比较精确还不能压缩,肯定要3个通道了 方向,意义上可以是运动方向,法线等很多,这个一般不用太精确,如果压缩的话3个通道,不压缩的话甚至pack成一个通道都可以 其它gameplay相关的参数了 数据存在顶点上可能的问题是,模型一压缩,数据就坏掉了。另外毕竟顶点上支持的数据套数比较少。因此比较高精度和大数据量的...
Read More

Some Shader Optimization Tricks | 一些Shader优化技巧

1 精度问题 精度越低的数值类型意味着更低的寄存器数量,更快的计算,以及更低的能耗。 能耗:half < float < short < int. 注意,最大的是int! 不过需要注意的是half的取值范围,IEEE754规定binary16类型用1个符号位,5个指数位,10个有效位。所以 [crayon-650ea1913f888984098175/] 嗯,65536就是INF了. 以及误差需要注意。在1附近,误差是2^-10,大约0.001。在4096到8192的范围,误差是4。 写shader时可以instanceid,vertexid,threadid都用ushort(不过shaderlab没有ushort是为啥。。。),写字面量时值的后面加个h就表示half了。 2. 算术问题-乘加MAD shader一般会有一个硬件指令MAD,一次计算一个乘加,如Metal的...
Read More