Tutorials

How to enable two-sided rendering in Substance Designer?

如何在 Substance Designer 中启用两侧渲染? How can I enable Two side rendering in Substance designer? Yesterday I was asked a question by a colleague of mine I worked with before. My old colleague was able to figure it out on his own. Anyway, here are a few things to clear up. If you’re not a student … How to enable two-sided rendering in Substance Designer? 더보기

Custom Mipmap encoding practice.

此示例不是生产级别。该示例可以在生产级别使用,但是可以通过添加更有效的功能将其升级到完整的生产级别功能。This example is not a production level.This example can be used at the production level, but it can be upgraded to a full production level function by adding more efficient features. 实验目的。公司内部还没有请求,但是我们根据JP Friends Company项目团队提出的类似要求进行研究。通过改善Unity mipmap过滤的质量并改善模糊的Texel采样,我们希望改善更清晰的法线贴图表达(中等距离)或Albedo表达。在粗糙的情况下,不需要改进。 Purpose of experiment.There is no request from within our company yet, but we study this based on the similar demand … Custom Mipmap encoding practice. 더보기

对Reflection的误解(漫反射&镜面反射)

jplee23年的游戏开发商。 技术美术总监。 渴望退休的独立开发商。半灰、max、游丝结、戏剧常量、熊掌等 6 人赞同了该文章 Written by JP.Lee心动的 Technical art team leader.leegoonz@163.com 对Reflection的误解(漫反射&镜面反射) 字面含义 我们通常使用diffuse reflection(漫反射 ) 和 specular reflection( 镜面反射 ) 这两种术语。但真的懂得其含义吗? 首先来看看diffuse的字面含义。 1.散开;四散 ( 光, 热量, 味道等 ) 2. 传播(知识) ,普及, 舒缓( 情绪等 ) 3. ( 气体或液体) 弥漫;漫射;发散 来自:百度翻译 跟大家知道的意思一样吗? 下面来看看specular 的字面含义。 1. 镜子似的,反射的,反映的 2. ( 光学 )正反射性的 来自:百度翻译 这也跟大家知道的意思一样吗? 现在看看是否跟实际含义一样。 Diffuse反射在粗糙的表面形成? 很多人觉得diffusereflection 是因表面粗糙而形成的。特别是PBR … 对Reflection的误解(漫反射&镜面反射) 더보기

Lineage2m Unreal Engine Announcement of use cases.

Written by JP.Lee心动的 Technical Art team leader. Epic game UnrealSubmit 2019 . Lineage2m UnrealEngine Announcement of use cases. NC SOFT. Presentation: Jonghyun Kim, Client General Manager. Theorem: JP.Lee summary. Observe the contents and organize the context more easily. Using Lineage 2M Unreal Engine4. This was announced before the completion of development. I hope you will … Lineage2m Unreal Engine Announcement of use cases. 더보기

在GPU避免分支的方法

在GPU避免分支的方法Unity TechnologiesOrigianl Authored by Brandon Fogerty(XR Graphics Engineer at Unity Technologies.) Additional Organized by JP.Lee(李正彪)leegoonz@163.com概要这边来稿文章中,希望了解如何编写GPU着色器友好型代码,以避免和分支相关的性能费用。“分支”有着什么意义?使用明确的 if / then随时都可以产生分支。编译器遇到条件会作出命令。GPU可去的地方有两处。因此需要决定要使用哪种代码路径。以下示例展示了在汇编GPU里面运行的示例。运算变量设置为幻数7,则添加该数字。否则的话要减掉。 为什么要避免分支?为了增加CPU使用率,大多数计算机都尝试在管线上执行尽可能多的任务。汇编指令按顺序执行,CPU会尝试在尽可能多的CPU内核上执行尽可能多的指令。举个简单的例子。想象一下,在Twilight Zone内,我们就是世界上最高效的程序员! 用两行代码写了电子游戏! CPU会尽可能在每一个CPU内核上各执行一个,共计两个光荣的指令。这是计算机能够更有效的运行代码。 但是在分支时,计算机可能会花时间准备未运行的代码结果。从结论上看处理器时间被浪费,影响了游戏或应用程序的应答能力。CPU 侧分枝误诊通常会导致周期遗漏超过40次。– Charles Sanglimsuwan (集成开发人员相关工程师)运气不错,最新的CPU处理器速度惊人,实际分支预测出色,因此分支错失几乎不会有问题。但是GPU仍然存在性能问题。 GPU尝试并行解决大量计算,因此大部分GPU不支持分支预测GPU为什么会发生性能问题?GPU为生成美丽的图像,喜欢并行进行很多工作!GPU为进行多种固有的结果计算,进行了精心设计,解决了通过单一滤镜(例如:着色器程序)实施的多种输入和相关的问题。这就是渲染经常使用GPU(Graphics processor units)的原因。通过几个Shader程序运行位置,法线,贴图坐标等具有不同属性的固有顶点,该Shader程序输出在画面上表现的大量固有像素颜色。举个例子,显示器是1080 × 960这样的一般HD像素的情况下,GPU在一组输入时,将计算1080 × 960 = 1,036,800个的固有像素颜色值!那是很多的计算结果!想象一下在1080×960的高清游戏体验。游戏尝试每秒渲染60个固有的图像或帧。因此GPU在1秒之内需要计算1080x960x60以上的固有像素颜色值!结论上看一秒之内可以计算62,208,000个固有像素值!撰写本文的节点,NVDIA最现金的GPU是GeForce RTX 2080 Ti。它有着比英特尔最先进的CPU处理器i9-7980XE更多4,352个Cuda内核,18个内核。非常大的差异吧? GPU有大量的处理内核,但是与最新的CPU相比,其核心处理数量仍不足百万。至少目前还没有!显卡在物理上太大了,可能会很昂贵。 因此,GPU将尝试对要解决的问题类型进行特定假设。GPU充分利用SIMD。SIMD表示单个命令的多种数据。SIMD允许以并行方式为多个输入运行计算。SIMD通常希望输入和输出位于相邻的内存块中。因此SIMD操作不必加载每个输入并单独保存每个结果,而是加载输入并将结果保存为单个加载/保存操作,从而减少昂贵的内存加载和保存。SIMD的使用要求内存布局严格,并在应用程序设计中维持更好地内存缓存一致性上有积极作用。SIMD在CPU和GPU均可使用.在CPU使用SIMD的示例可参考此处。与CPU程序不同,GPU程序几乎始终使用SIMD。为了充分利用SIMD,GPU通常每个内核都有很多ALU。ALU是算术逻辑设备的缩写。ALU执行数学命令。举个例子,使用“add 4, 3”命令计算结果7。因此,单一内核上有8个ALU的话,就可以同事并行运行8个计算。即,单一GPU内核有8个ALU,则单个GPU内核则可以同事计算8个像素值!但是,着色器阶段使用动态分支会发生什么呢?核心是必须执行所有代码路径,并最终丢弃不满足条件的代码路径。这意味着ALU会浪费时间执行任何未使用的操作。也就是说渲染图像需要更长的时间。 使用示例:在Unity里,使用立体shader以保证双眼能够准确渲染。左眼以绿色表示渲染,右眼渲染的显示为红色。下面是使用立体shader渲染双眼锁渲染的单个球体。 针对此的纯接近方式是基于unity_StereoEyeIndex变数的条件方法。 分段shader的集合输出如下: 注意从0行开始的分支。分段shader stage上指定的内核将强制所有ALU执行两个条件结果。但是不满足条件的结果将被丢弃。这种情况,可能是一部分ALU执行了被浪费的操作。我们刚刚让几种ALU很伤心,现在他们提出了他们为什么需要存在。不要让可怜的小ALU做很忙的工作了。(✖╭╮✖)  你肯定不喜欢浪费时间吧?用ALU做一些游泳的事情吧。如果能够去掉条件部,可以减少浪费,让ALU更有效率,更加幸福!以下示例演示了分段着色器的实现方式: 没有明确的条件,仔细看下HLSL组件输出。 再一次确认也是!没有分支!我们现在使用的不是明确的条件部,而是Lerp。lerp在两个值之间执行线型插值。Lerp本质上是: 如组件输出所示,lerp会转换一些比乘法和分支更好地附加输出。基本上会向lerp函数提供两个任意值,传递第三个参数”t value”。t值一般是易于操作的空间数0.0和1.0之间的数字。t值为0.0,结果为a。如果t值为1,则结果为b。t值介于0.0和1.0之间的话,结果将在a和b之间线性显示。 对于我们来说,我们知道unity_StereoEyeIndex是左眼或者右眼分别是0或者1。因此,这可以很好的操作,并可以避免明确的分支。避免分支的其他方法是什么?默认情况下,我们希望得到的是将条件转换为数学方程式。为了帮助实现这个目标,我们继续介绍HLSL硬件加速功能。 step(y,x) … 在GPU避免分支的方法 더보기

PBR Specular D的几何学含义

PBR Specular D的几何学含义 jplee 2019.9.03 PBR( Physically Based Rendering )里成为大趋势的Cook-Torrance的Specular BRDF [1]定义如下: 这里面D函数是对于微表面(microfacet)的倾斜度的分布(Distribution)函数。本文档将对于本函数在几何学上的意义进行说明。 一个表面(surface)是由几个微表面构成,这是PBR理论的根本。而且构成表面的各微表面都有着不同的法线(normal)。另外微表面上发生了镜面反射(mirror reflection, 正反射)。 很多文档里面将这样的微表面的法线用m表示,也会用h表示。应该是microfacet normal和half vector的略写。那么图1里面表面和微表面的关系就显而易见了。 图1:由微表面构成的表面[2]. 微表面的法线用m来表示很容易理解,但是用h(half vector)来表示就有点费解了。Burley和Cook-Torrance [1, 3]一致记述了用半向量(half vector)来表现微表面的法线。 这里最好是用半向量的思路来理解这个含义。上面我们已经假设微表面能够镜面反射,现在我们来反过来看一下这个问题。 表面内,能够给我们展示镜面反射的、带有倾斜度的微表面究竟有多少呢? 这就是我们要通过Specular D函数得到的值的本质。要看到图2最左边的微表面向我这个方向的镜面反射结果的话,需要怎样的倾斜度呢?这里的n是表面法线,m是微表面法线。 图2: 微表面样品 镜面反射是“入射角和反射角相同的反射”。因此像下图那样光的向量l和视图向量v的一半,即半向量(h)和微表面法线(m)一致的情况下,就会发生镜面反射。 这里我们可以推断的是,如果有很多尖锐的微表面,逆反射(retroreflection)数量就会增多;如果乱乱的很粗糙的话,漫反射就会更加严重;柔和的话(即,m和n几乎一样的面很多的话),正反射的概率就很大了。 结论就是,我们的问题可以更改如下: 光的向量l和视图向量v同时具备的时候,与他们的半向量h一样的微表面法线m有多少呢? 查找半向量h和微表面法线m的角度是0的微表面分布,是Specular D函数的目标。因此所有的文献里面都会以这样的假设为基础,使用“半向量是微表面的法线” 这样的表现方式。 [3] 里面Burley将实测数据和其他Specular D函数进行了比较。 图3: Burley比较的分布(Distribution) 从左至右 chrome实测值,GGX,Beckmann. 首先现有模型中最好的是GGX(与Trowbridge-Reitz一样)。但是看实测数据,可以看到类似糊掉的效果以及更长的tail。因此在Burley情况下,Specular lobe得到了双重表现。详细的内容请参考相关报道。 但是实时渲染的世界里Specular lobe计算两次的话,会有负担。因此在UE4里面就只使用GGX。 当然也会有几个变种,可以在Specular BRDF Reference 进行确认。但是在这个思路里面”正态分布(Normal Distribution)” 并不是正规分布。只是”法线的分布”的意思,跟”Specular … PBR Specular D的几何学含义 더보기

对Reflection的误解(漫反射&镜面反射)

字面含义 我们通常使用diffuse reflection(漫反射 ) 和 specular reflection( 镜面反射 ) 这两种术语。但真的懂得其含义吗? 首先来看看diffuse的字面含义。 1.散开;四散 ( 光, 热量, 味道等 ) 传播(知识) ,普及, 舒缓( 情绪等 ) ( 气体或液体) 弥漫;漫射;发散 来自:百度翻译 跟大家知道的意思一样吗? 下面来看看specular 的字面含义。 镜子似的,反射的,反映的 ( 光学 )正反射性的 来自:百度翻译 这也跟大家知道的意思一样吗? 现在看看是否跟实际含义一样。 Diffuse 反射在粗糙的表面形成? 很多人觉得diffuse reflection 是因表面粗糙而形成的。特别是PBR 的重要因素微表面 ( microfacet ),会使人这么想。但是diffuse大部分不是因表面粗糙而形成的,只有一部分是那么形成的。 看字面含义diffuse 有 “散开”, “传播” 的意义。就是说不是单纯因碰撞到表面后反射出来的东西。 根据参考资料[ 1 ]-{参考资料在本文末端}, diffuse形成的原理如下。(翻译了资料的一部分) 在Solids(人造物) … 对Reflection的误解(漫反射&镜面反射) 더보기