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

扫一扫,访问微社区

蛮牛译馆

关注:481

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

查看: 694|回复: 6

[Unity教程] Unity物体外表面渲染【2】—raymarching方法

[复制链接]  [移动端链接]
排名
7127
昨日变化
72

101

主题

131

帖子

814

积分

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

UID
159865
好友
9
蛮牛币
1046
威望
0
注册时间
2016-8-1
在线时间
398 小时
最后登录
2017-1-20

蛮牛译员

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

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

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

x
本帖最后由 manew_JR 于 2016-11-14 10:31 编辑

体绘制:Raymarching
volumetric2.png
这篇文章继续在体绘制教程,介绍最常用的技术之一:raymarching。
简介
第1部分。Raymarching固定步数
第2部分。raymarching距离
结论
简介
粗略地说,Unity 5的照明引擎的标准行为会停止渲染,当相机的光线击中一个对象的表面。有没有内置的机制,这些射线穿透一个对象的表面。为了弥补这一点,我们引入了一种称为raymarch。我们在一个片段中的是我们正在渲染的点的位置(在世界坐标系中),相机的视图方向。我们可以手动扩展这些射线,使他们达到自定义的几何形状,只存在于着色代码。空洞的阴影需要我们这样做:
[C#] 纯文本查看 复制代码
struct v2f {
        float4 pos : SV_POSITION;        // Clip space
        float3 wPos : TEXCOORD1;        // World position
};

// Vertex function
v2f vert (appdata_full v)
{
        v2f o;
        o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
        o.wPos = mul(_Object2World, v.vertex).xyz; 
        return o;
}

// Fragment function
fixed4 frag (v2f i) : SV_Target
{
        float3 worldPosition = i.wPos;
        float3 viewDirection = normalize(i.wPos - _WorldSpaceCameraPos);
        return raymarch (worldPosition, viewDirection);
}

这篇文章的其余部分将为raymarch功能提供不同的实现。

恒定步数的Raymarching
对raymarching介绍了体绘制中第一步是设置固定步数大小。每条射线的方向STEP_SIZE扩展,直到它撞到什么东西。如果是这样的情况下,我们绘制红色像素,否则一个白色的。
vol3.png
raymarching步骤可以用下面的代码实现:
[C#] 纯文本查看 复制代码
fixed4 raymarch (float3 position, float3 direction)
{
        for (int i = 0; i < STEPS; i++)
        {
                if ( sphereHit(position) )
                        return fixed4(1,0,0,1); // Red
 
                position += direction * STEP_SIZE;
        }

        return fixed4(0,0,0,1); // White
}

可以看到渲染的情况:
rotate.gif
这篇文章的Surface Shading将完全致力于给立体几何的立体效果。在这之前,需要把重点放在一个更好的实现的raymarch技术。

Raymarching的距离辅助
是什么让raymarching常步非常低效的事实是射线进展每一次是相同数量的,不管填充体积的几何世界。一个着色的性能受到极大的添加循环。如果我们想使用实时体绘制,我们需要找到更好的一个更有效的解决方案。
我们想一个方法估计多远一个射线可以代打几何体。为了这种工作,我们需要能够估计从我们的几何形状的距离。在以前的文章中我们使用了一个函数调用sphereHit表示一个点是否在一个球体内:
[C#] 纯文本查看 复制代码
bool sphereHit (float3 p)
{
    return distance(p,_Centre) < _Radius;
}

我们可以用这样一种方式来改变它,而不是用一个布尔值,它返回一个距离:
[C#] 纯文本查看 复制代码
float sphereDistance (float3 p)
{
    return distance(p,_Centre) - _Radius;
}

现在属于一个称为标记距离函数的函数库。顾名思义,它提供了一个可以是正的或负的度量。当正的,我们是在外面的球体;当负时,我们在里面,当零,我们正是在其表面。
sphereDistance让我们有一个明确估计我们的射线可以走多远没有击中球。没有任何适当的这单,体绘制会无趣。即使这个例子似乎是微不足道的一个单一的球体,它成为一个有价值的技术对于具有更复杂的几何形状。下面的图像(从距离估计的三维分形)raymarch作品展示。每一光线的距离,是它距离最接近的对象。以这样的方式,我们可以显着减少所需的步骤,以达到绘制体积数量。
ray.png
这给我们带来了raymarching距离辅助:
[C#] 纯文本查看 复制代码
fixed4 raymarch (float3 position, float3 direction)
{
        for (int i = 0; i < STEPS; i++)
        {
                float distance = sphereDistance(position);
                if (distance < MIN_DISTANCE)
                        return i / (float) STEPS;

                position += distance * direction;
        }
        return 0;
}

为了更好地理解它是如何工作的,我们更换了表面绘制一个颜色渐变显示我们步是多少,raymarch渲染我们几何体时:
vol11.gif
很明显,面对相机的平面几何体可以立即识别。相反边缘,非常棘手。这种技术也说明我们是多接近附近的几何体。我们将看到之后的连续,环境闭塞,这可能是有帮助当添加细节时候

结论
这篇文章介绍了真实标准技术,用于实时raymarching着色器。射线在体积介质中的步进,根据最接近的附近的几何形状做一个稳定的估计。
下一篇文章将重点放在如何使用距离函数来创建几何图元,以及它们如何被组合在一起,以创建你想要的形状。




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

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


回复

使用道具 举报

排名
14098
昨日变化
6

0

主题

39

帖子

71

积分

Rank: 2Rank: 2

UID
182318
好友
0
蛮牛币
130
威望
0
注册时间
2016-11-9
在线时间
8 小时
最后登录
2016-11-25
发表于 2016-11-14 11:52:37 | 显示全部楼层
日常点赞

回复

使用道具 举报

5熟悉之中
792/1000
排名
2341
昨日变化
9

2

主题

201

帖子

792

积分

Rank: 5Rank: 5

UID
19603
好友
0
蛮牛币
1438
威望
0
注册时间
2014-3-30
在线时间
191 小时
最后登录
2017-1-20
发表于 2016-11-14 21:13:28 | 显示全部楼层

谢谢楼主分享
[发帖际遇]: 一个袋子砸在了 gameisgame 头上,gameisgame 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

2初来乍到
110/150
排名
42833
昨日变化
27

0

主题

34

帖子

110

积分

Rank: 2Rank: 2

UID
29549
好友
0
蛮牛币
272
威望
0
注册时间
2014-6-13
在线时间
74 小时
最后登录
2017-1-20
发表于 2016-11-15 09:19:19 | 显示全部楼层
很不错的案例

回复

使用道具 举报

5熟悉之中
986/1000
排名
1437
昨日变化
2

9

主题

51

帖子

986

积分

Rank: 5Rank: 5

UID
79646
好友
0
蛮牛币
2028
威望
0
注册时间
2015-3-14
在线时间
328 小时
最后登录
2017-1-20
QQ
发表于 2016-11-16 11:50:31 | 显示全部楼层
老板 膜拜

回复

使用道具 举报

排名
32039
昨日变化
17

1

主题

17

帖子

30

积分

Rank: 1

UID
183998
好友
0
蛮牛币
13
威望
0
注册时间
2016-11-16
在线时间
8 小时
最后登录
2017-1-3
发表于 2016-11-17 08:48:18 | 显示全部楼层
你是干什么的啊,看不懂 啊,亲

回复 支持 反对

使用道具 举报

4四处流浪
401/500
排名
13244
昨日变化
402

0

主题

314

帖子

401

积分

Rank: 4

UID
189581
好友
0
蛮牛币
425
威望
0
注册时间
2016-12-5
在线时间
57 小时
最后登录
2017-1-20
发表于 2016-12-27 09:54:55 | 显示全部楼层
很给力啊 赞赞赞

回复

使用道具 举报

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

本版积分规则

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