开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

蛮牛译馆

关注:496

当前位置:游戏蛮牛 技术专区 蛮牛译馆

查看: 924|回复: 1

[Unity教程] Unity物体外表面渲染【3】—Surface Shading

[复制链接]  [移动端链接]
排名
7204
昨日变化
9

116

主题

147

帖子

890

积分

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

UID
159865
好友
9
蛮牛币
1457
威望
0
注册时间
2016-8-1
在线时间
441 小时
最后登录
2017-2-28

蛮牛译员

发表于 2016-11-14 10:43:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
体绘制:Surface Shading
volumetric3.png
这第三部分的体绘制教程将解释如何在一个真实的绘制。这是必不可少的步骤,使团队效能都要光弱,亮灯的三维形状,用现在的raymarching方法。
geom1.gif
简介
第一步。Lambertian反射
第二步。法线估计
第三步。阴影
第四步。镜面反射
结论
介绍
先前教程的体绘制,Volumetric Rendering,用raymarching技术绘制一个球在一个立方体中:
rotate.gif
这个解决方案是唯一能够告诉如果从相机内的光线投射是击中虚拟球。我们没有关于它的位置或方向的信息。因此,我们只能提供一个轮廓。其结果是一个没有灯,扁球形,看起来和一个圈有没什么不同。

Lambertian 反射
如果我们想给体绘制带来深度,我们需要一种方法来绘制任意的几何图形。在前面的教程中,基于物理的渲染和照明模型,我们已经看到了如何在Unity 4中计算3D对象的阴影。该技术依赖于朗伯反射,它提供了一个简单而有效的模型来模拟光的行为在三维表面。由朗伯表面反射的光的量取决于表面方向(法线方向)和光的方向。
Image_4850_03_03.png
我们以前是功能LightingSimpleLambert;对于本教程的目的,我们可以把它这样改:
[C#] 纯文本查看 复制代码
#include "Lighting.cginc"
fixed4 simpleLambert (fixed3 normal) {
        fixed3 lightDir = _WorldSpaceLightPos0.xyz;        // Light direction
        fixed3 lightCol = _LightColor0.rgb;                // Light color

        fixed NdotL = max(dot(normal, lightDir),0);
        fixed4 c;
        c.rgb = _Color * lightCol * NdotL;
        c.a = 1;
        return c;
}

函数作为输入的表面法线,所有其他参数都通过内置的变量,Unity提供给了着色(你可以找到完整的列表在这里)检索。这一行,其实计算朗伯反射突出

法线估计
在本教程的主要思想是采用朗伯反射,绘制立方体内的虚拟结构。选择的照明模型不依赖于光源的距离,但需要我们正在渲染的表面点的法线方向。
这不是一个简单的任务,因为用于球体的距离函数没有这样的信息。在他的全面指导体绘制(在这里),代码的艺术家Íñigo Quílez,建议法线估计技术。他的方法是在附近的点采样的距离场,得到一个估计的局部表面曲率。如果你熟悉梯度递减,这是梯度估计步骤:
[C#] 纯文本查看 复制代码
float3 x_right = p + float3(0.01, 0, 0);
float3 x_left  = p - float3(0.01, 0, 0);
float x_delta = x_right - x_left;

X轴上的差分计算是通过评估在左边和右边的点上的距离计算的。我们可以复制这些所有的Y和Z轴,单位化:
[C#] 纯文本查看 复制代码
float3 normal (float3 p)
{
        const float eps = 0.01;

        return normalize
        (        float3
                (        map(p + float3(eps, 0, 0)        ) - map(p - float3(eps, 0, 0)),
                        map(p + float3(0, eps, 0)        ) - map(p - float3(0, eps, 0)),
                        map(p + float3(0, 0, eps)        ) - map(p - float3(0, 0, eps))
                )
        );
}

这种正常的估计引入了一个新的参数,eps,它表示用于计算表面梯度的距离。这种技术的假设是,我们是阴影的表面是比较光滑的。连续表面的梯度不能正确地近似点的法线方向。

阴影
raymarching代码我们至今只击中或错过。我们现在要返回的是在体积表面上的命中点的实际颜色:
[C#] 纯文本查看 复制代码
fixed4 raymarch (float3 position, float3 direction)
{
        for (int i = 0; i < _Steps; i++)
        {
                float distance = map(position);
                if (distance < _MinDistance)
                        return renderSurface(position);

                position += distance * direction;
        }
        return fixed4(1,1,1,1);
}

使表面函数将计算法线然后套用朗伯照明模型:
[C#] 纯文本查看 复制代码
fixed4 renderSurface(float3 p)
{
        float3 n = normal(p);
        return simpleLambert(n);
}

这些简单的修改已经足以创建非常真实的效果:
shade1.gif
这种阴影的优点是它对场景中的灯光起反应作用。提供的模型非常简单,但你可以通过使用一个更复杂的照明技术添加更多的细节。

镜面反射
如果我们想多走一步,我们也可以在表面上实现镜面反射。再次,我们可以引用Blinn-Phong光照模型从Physically Based Rendering 和 Lighting Models,并相应地改变simpleLambert:
BlinnPhong.png
[C#] 纯文本查看 复制代码
// Specular
fixed3 h = (lightDir - viewDirection) / 2.;
fixed s = pow( dot(normal, h), _SpecularPower) * _Gloss;
c.rgb = _Color * lightCol * NdotL + s;
c.a = 1;


变量_speculerpower控制镜面反射的大小或传播,而_gloss表明他们是多么的粗糙程度。为了更好地欣赏的结果,我们需要使用一个一块几何体。要突出差异,只有调低一半使用镜面反射:
v10.gif


结论
这篇文章展示了如何模拟与距离创建体积形状逼真的效果,照明辅助raymarching着色器。无论是Lambertian反射和Blinn Phong光照模型已用来模仿真实物体的阴影。这两种技术运作为最先进的实时光照模型在Unity 4中。没有什么可以阻止你进一步探索这个概念,通过你自己的模型不断的实验

在这个系列的下一期将教你如何创建和组合几何图元,以创建任何你想要的形状。





》》译馆招募新译员啦!《《
     蛮牛译林军福利多多哦!

扫描下方二维码关注游戏蛮牛官方微信~每日都有精选干货与你分享呦~
155547iluo7umxezrb2ekr.png

回复

使用道具 举报

5熟悉之中
569/1000
排名
3249
昨日变化
1

0

主题

78

帖子

569

积分

Rank: 5Rank: 5

UID
60139
好友
0
蛮牛币
897
威望
0
注册时间
2014-12-8
在线时间
195 小时
最后登录
2017-2-28
发表于 2016-11-14 17:10:22 | 显示全部楼层
看效果很不错啊

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表