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

扫一扫,访问微社区

开发者专栏

关注:2103

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1344|回复: 15

[elsong] [初级]认识ClearFlags 与 OnRenderImage

[复制链接]  [移动端链接]
排名
34660
昨日变化
5

4

主题

6

帖子

68

积分

Rank: 2Rank: 2

UID
73054
好友
2
蛮牛币
174
威望
0
注册时间
2015-2-4
在线时间
16 小时
最后登录
2018-1-22

专栏作家

发表于 2018-1-19 10:17:03 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 elsong 于 2018-1-19 10:28 编辑

无论多基础、简单的知识,只要不会,就是难。

这些天在工作中遇到了小的问题,忽然发现很多自以为了解了的东西其实都是一知半解,所以还是多看看基础吧。这次的总结主要与相机上的Clear Flags及OnImageRender函数有关。嗯。

Clear Flags
对于这个选项,我是这么理解的:每一个相机在开始绘制时,都需要对当前RenderBuffer中的颜色缓冲区(ColorBuffer)深度缓冲区(Z-Buffer)进行是否清除的操作,这个选项控制了清除及清除后的内容。

下面将展示一下不同Clear Flags设置下的区别:
clipboard(14).png
(相机绘制一个蓝色的立方体)


Sky box:清除颜色缓冲区和深度缓冲区,并将颜色缓冲区设置为天空盒的颜色。
clipboard(9).png
(立方体以外部分的"ColorBuffer"都被天空盒填满)


Solid Color:清除颜色缓冲区和深度缓冲区,并将颜色缓冲区设置为一个固定的颜色。
clipboard(10).png
(立方体以外部分的"ColorBuffer"都被选定的颜色填满)


上述两种选项是最容易理解的,只是直接清除了缓冲区内的颜色深度数据,因此如果场景中存在多个相机,且最后一个相机被设置为上述两种ClearFlags,那么,呵呵,之前的相机绘制结果将无法直接显示(因为都被清掉了)。

Depth Only:保留颜色缓冲区,仅清除深度缓冲区。
clipboard(3).png
(两部相机先后绘制)



clipboard(8).png
仅清除了深度缓冲区的绘制)


很容易发现,由于拍蓝色立方体的蓝色相机后绘制,且不清除颜色缓冲区,因此蓝色相机在绘制之前,颜色缓冲区已经被红色相机所拍的结果:SolidColor + 红色立方体所填充,因此蓝色立方体只是在这基础之上进行的绘制。
并且,由于清除了深度缓冲区,蓝色立方体无论空间是否被红色立法体遮挡,总会任性的全部绘制,因此产生了错误的遮挡效果。

Don't Clear:毛都不清除。
clipboard.png
(毛都不清除的绘制-保留了深度缓冲区)


同上,颜色缓冲区在保留的同时,也保留了深度缓冲区,这样蓝色相机在绘制时,就会被红色立方体的深度值所影响,因此获得了正确的遮挡效果。

对了,如果只有一个相机,并且这个相机还设置了“DepthOnly”或者“Don'tClear“的选项,也就是不清除颜色缓冲区,那么当你拖动一个物体时,就会产生这种撸多了的效果:
bluemovvvve.gif
(无影脚应该就是这么拍的吧)




OnRenderImage
那么OnRenderImage跟这个相机的ClearFlags有什么关系呢?
其实没有什么太大关系。

这个函数通常是用来做什么的?
重写这个函数是为了达到屏幕后处理特效的目的,比如全屏虚化等。

这个函数如何使用及调用时机?
首先,包含这个函数的脚本必须附着在一个相机上;
其次,一旦重写这个函数,这个函数所发生的时机,就是在这个相机完成与自己有关的全部渲染后,将把这次渲染结果更新给当前RenderBuffer时的那一夜(刻)。
大概的触发时机如下图:
clipboard(17).png

注意,如果你重写了这个函数,必须有一个将缓冲区传递给dest的操作,即调用Graphics.Blit(rt,  dest)。如果没有这个操作,可以想象,经过这个相机后,RenderBuffer中将会是一片漆黑。

但是:一片漆黑仅仅是因为没有把正确的颜色缓冲区设置给当前的RenderBuffer中的ColorBuffer部分,深度缓冲区仍然不受影响

以下将讨论几种情况,希望能把问题说清楚:
测试的环境
clipboard(4).png

clipboard(12).png
1、两个立方体的空间位置关系,红色遮挡了蓝色。
2、蓝色相机只拍蓝色立方体,红色相机只拍红色立方体。3、相机渲染的顺序:红色 → 蓝色。
4、蓝色相机的渲染结果同时填充给屏幕左下角的Image,红色相机的渲染结果同时填充给屏幕左下二号Image。

第一种情况
蓝色相机Depth Only, 红色相机Solid Color = 天蓝色。
clipboard(6).png


分析
clipboard(16).png



第二种情况
蓝色相机Solid Color = 壮汉粉, 红色相机Solid Color = 天空蓝
clipboard(5).png


分析
clipboard(7).png



第三种情况
蓝色相机Solid Color = 壮汉粉,红色相机Depth Only
红色相机第一帧
clipboard(2).png
第一帧后
clipboard(13).png
分析
clipboard(19).png
第四种情况
蓝色相机Don't Clear,红色相机Solid Color + 空OnImageRender函数
clipboard(1).png
红色相机没有做向dst传递颜色缓冲区的动作
clipboard(18).png
红色相机没有生成任何东西
clipboard(11).png
蓝色受到了红色立方体深度值的影响
分析
clipboard(15).png

总结:

只要心心念着颜色缓冲区 和 深度缓冲区,掐指一算就差不多了。






clipboard(6).png

评分

参与人数 1鲜花 +10 收起 理由
wlm001 + 10 赞一个!

查看全部评分


回复

使用道具 举报

7日久生情
1610/5000
排名
4822
昨日变化
46

0

主题

1162

帖子

1610

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
0
蛮牛币
1474
威望
0
注册时间
2017-7-12
在线时间
198 小时
最后登录
2018-2-22
发表于 2018-1-19 15:22:16 | 显示全部楼层
[发帖际遇]: 夜雨微凉 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
1546/5000
排名
2706
昨日变化

0

主题

682

帖子

1546

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
148286
好友
0
蛮牛币
3073
威望
0
注册时间
2016-5-11
在线时间
418 小时
最后登录
2018-2-10
发表于 2018-1-19 16:23:29 | 显示全部楼层
[发帖际遇]: 一个袋子砸在了 tzb1125 头上,tzb1125 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
438/500
排名
6516
昨日变化
1

2

主题

161

帖子

438

积分

Rank: 4

UID
17318
好友
0
蛮牛币
6
威望
0
注册时间
2014-3-11
在线时间
129 小时
最后登录
2018-2-12
发表于 2018-1-22 11:28:42 | 显示全部楼层
666不错的文字

回复

使用道具 举报

6蛮牛粉丝
1058/1500
排名
5784
昨日变化
2

6

主题

638

帖子

1058

积分

Rank: 6Rank: 6Rank: 6

UID
236677
好友
0
蛮牛币
1693
威望
0
注册时间
2017-8-9
在线时间
218 小时
最后登录
2018-2-22
发表于 2018-1-22 17:27:32 | 显示全部楼层
感谢分享

回复

使用道具 举报

排名
13548
昨日变化
2

0

主题

25

帖子

96

积分

Rank: 2Rank: 2

UID
257079
好友
0
蛮牛币
112
威望
0
注册时间
2017-11-30
在线时间
25 小时
最后登录
2018-2-11
发表于 2018-1-23 08:09:39 | 显示全部楼层
感谢分享,学习了

回复

使用道具 举报

4四处流浪
426/500
排名
6413
昨日变化
1

6

主题

104

帖子

426

积分

Rank: 4

UID
252607
好友
0
蛮牛币
804
威望
0
注册时间
2017-11-5
在线时间
148 小时
最后登录
2018-2-17
发表于 2018-1-23 08:50:10 | 显示全部楼层
感谢分享,学习了

回复

使用道具 举报

2初来乍到
133/150
排名
17387
昨日变化
5

0

主题

55

帖子

133

积分

Rank: 2Rank: 2

UID
236975
好友
0
蛮牛币
185
威望
0
注册时间
2017-8-11
在线时间
52 小时
最后登录
2018-2-1
发表于 2018-1-23 09:04:24 | 显示全部楼层

回复

使用道具 举报

4四处流浪
305/500
排名
10724
昨日变化

0

主题

172

帖子

305

积分

Rank: 4

UID
250350
好友
1
蛮牛币
395
威望
0
注册时间
2017-10-23
在线时间
55 小时
最后登录
2018-2-22
发表于 2018-1-23 14:09:51 | 显示全部楼层

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

回复

使用道具 举报

5熟悉之中
654/1000
排名
4317
昨日变化

2

主题

124

帖子

654

积分

Rank: 5Rank: 5

UID
209909
好友
0
蛮牛币
633
威望
0
注册时间
2017-3-4
在线时间
250 小时
最后登录
2018-2-10
发表于 2018-1-24 20:13:21 | 显示全部楼层
点大顶顶顶顶顶

回复

使用道具 举报

排名
34660
昨日变化
5

0

主题

15

帖子

42

积分

Rank: 1

UID
214039
好友
0
蛮牛币
57
威望
0
注册时间
2017-3-23
在线时间
21 小时
最后登录
2018-2-22
发表于 2018-1-26 11:03:22 | 显示全部楼层
6666趣味十足的文笔

回复 支持 反对

使用道具 举报

7日久生情
1686/5000
排名
1307
昨日变化

1

主题

528

帖子

1686

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
56496
好友
0
蛮牛币
4802
威望
0
注册时间
2014-11-19
在线时间
375 小时
最后登录
2018-2-14
发表于 2018-1-28 17:57:08 | 显示全部楼层
66666感谢

回复

使用道具 举报

排名
25146
昨日变化
5

0

主题

69

帖子

96

积分

Rank: 2Rank: 2

UID
182113
好友
0
蛮牛币
82
威望
0
注册时间
2016-11-8
在线时间
15 小时
最后登录
2018-2-12
发表于 2018-2-2 13:08:12 | 显示全部楼层
6666666666666666666666666666

回复 支持 反对

使用道具 举报

3偶尔光临
260/300
排名
18578
昨日变化
737

0

主题

208

帖子

260

积分

Rank: 3Rank: 3Rank: 3

UID
267381
好友
0
蛮牛币
229
威望
0
注册时间
2018-2-1
在线时间
28 小时
最后登录
2018-2-21
发表于 2018-2-6 15:52:40 | 显示全部楼层
[发帖际遇]: 一个袋子砸在了 墨染青天 头上,墨染青天 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

排名
16881
昨日变化
501

0

主题

25

帖子

76

积分

Rank: 2Rank: 2

UID
88613
好友
0
蛮牛币
94
威望
0
注册时间
2015-4-2
在线时间
21 小时
最后登录
2018-2-21
QQ
发表于 昨天 21:47 | 显示全部楼层
的顶顶顶顶顶的顶顶顶顶顶顶顶顶顶顶

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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