unity 中 imageeffect 特效脚本中的:screen space reflection effect不能勾选,为什么呢?

2245人阅读
Editor私人定制(140)
孙广东& Unity提供了用于创建 UI 的画布。画布上有渲染模式如下&︰ 屏幕空间相机 Screen Space Camera屏幕空间覆盖 Screen Space Overlay世界空间 World Space&&&&&&&& 让我们了解哪种模式是更好的,让我们以一个非常简单的示例测试这三项。1&& 屏幕空间相机 让我们创建一个Unity项目︰ 脚本 ︰ MoveCamera.cs 在你的场景建立一个Canvas。&设置渲染模式为:& Screen Space Camera将Main Camera,拖到render camera 选项(其他相机也可以)。 用sprite或图像中作为一个背景。 才Canvas内创建尽可能多的panels 和 UI的Texts 和Images 添加到Camera上的脚本。using UnityE
using System.C
public class MoveCamera : MonoBehaviour
private float velocity = 0.0f;
private float smoothTime = 0.3f;
private bool moveCamera =
public Vector3 initialP
public Vector3 targetP
public float lerpS
public float initialZ;
public float targetZ;
void Update ()
if (Input.GetMouseButtonDown (0)) {
initialPosition = transform.
targetPosition = new Vector3 (transform.position.x + Random.Range (-5, 5), transform.position.y +
Random.Range (-5, 5), transform.position.z);
initialZ = transform.eulerAngles.z;
targetZ = initialZ + Random.Range (-50, 50);
moveCamera =
lerpSpeed = 0;
if (moveCamera) {
CameraMovementMethod ();
private void CameraMovementMethod ()
lerpSpeed = Mathf.SmoothDamp (lerpSpeed, 1.0f, ref velocity, smoothTime);
cam.transform.position = Vector3.Lerp (initialPosition, targetPosition, lerpSpeed);
cam.transform.eulerAngles = new Vector3 (0, 0, Mathf.LerpAngle (initialZ, targetZ, lerpSpeed));
Build部署到 Android 手机、 创建debugging build ,允许自动连接到profiler&在手机上运行该项目的,然后在处理随便点击屏幕在Unity编辑器中profiler上搜索 &canvas&,你会看到。:&正如你从图片中可以看到,有很多的画布的调用Calls,特别注意到CanvasRender.OnTransformChanged 每当相机移动,大约每个帧上有 50 次调用。 注意 &&调用次数是依赖于Canvas上的 使用的UI 元素个数。 我们可以更好地理解这与下面 gif: 你可以看到上面,在游戏中移动Canvas相关的摄像机,因此每个UI 元素在画布上不得不由Unity引擎重新定位。因此越多的UI元素,就需要更多的处理。那么,解决方案是什么?2&& 屏幕空间覆盖在刚刚的测试项目中我们把 Canvas的渲染模式改为 Screen Space Overlay ,并重复之前的步骤,同样想在观察Profiler。大约我们优化它约 90%正如你可以看到以上,UI 画布保持原样在Unity空间,摄像机运动的不影响 UI Canvas根本。画布保持静态。因此,不需要任何重新定位或所需的处理。实现了高的优化。3& &世界空间在世界空间模式,画布渲染手动更改为 World Space,测试结果和第一种一样。结论 ︰考虑screen space camera 类型的呈现进行大量的调用,所以非常推荐使用Overlay 绘制画布,使你的游戏在移动设备上更顺畅。(当然了这种只是限于纯UI),但是另外两种模式是有其特殊用处的!ForEach 循环优化 这是个老生常谈的话题, 主要还是产生GC的问题:public&class&ForEachLoopTest&:&MonoBehaviour
&&&&#region&PUBLIC_DECLARATIONS
&&&&public&List&GameObject&&emptyGameO
&&&&#endregion
&&&&#region&UNITY_CALLBACKS
&&&&void&Update()
&&&&&&&&if&(Input.GetKey(KeyCode.Space))
&&&&&&&&&&&&UpdateTextValue();
&&&&#endregion
&&&&#region&PUBLIC_METHODS
&&&&public&void&UpdateTextValue()
&&&&&&&&foreach&(var&item&in&emptyGameObjects)
&&&&&&&&&&&&//&PROCESS&ITEMS&IN&LIST
//&&&&&&&&for&(int&i&=&0;&i&&&emptyGameObjects .C&i++)
//&&&&&&&&{
&&&&&&&&//&PROCESS&ITEMS&IN&LIST
//&&&&&&&&}
&&&&#endregion
}按下空格键 ,当是10~30大小的循环时& 会看到如上图的 效果: 每帧产生 40B 的GCforeach (SomeType sin someList)&&& s.DoSomething();现在编译, 编译器预处理的代码:using (SomeType.Enumerator enumerator = this.someList.GetEnumerator())
while (enumerator.MoveNext())
SomeType s = (SomeType)enumerator.C
s.DoSomething();
在每次迭代时,会创建一个 enumerator对象。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:689686次
积分:10286
积分:10286
排名:第1264名
原创:249篇
转载:15篇
译文:32篇
评论:167条
阅读:11605
文章:13篇
阅读:55680
阅读:38982
文章:25篇
阅读:115745
爱科技、爱游戏、有梦想、一起!
(4)(5)(6)(2)(10)(7)(5)(5)(3)(7)(2)(5)(3)(4)(7)(16)(26)(12)(11)(22)(28)(4)(9)(2)(6)(10)(16)(13)(2)(8)(3)(2)(5)(3)(11)(14)3011人阅读
Unity3D(45)
脚本(25)
Twirl image effect distorts the rendered image within a circular region. The pixels at the centre of the circle are rotated
the rotation for other pixels in the circle decreases with distance from the centre, diminishing to zero
at the circle's edge.
旋转扭曲图像特效是指在一个圆形区域内扭曲所渲染的图像。在圆形区域中心的像素被旋转一定的角度,而其他像素的旋转程度随着距中心距离的增大而减小,在圆形区域边界减小到0。
Twirl is similar to another image effect called
, although vortex
distorts the image around a central circle rather than a single point.
旋转扭曲图像特效跟另一种叫做漩涡的图像特效相似,只不过漩涡图像特效是将图像绕着一个中心圆旋转,而非绕着单一的一个点。
As with the other
, this effect
is only available in Unity Pro and you must have the
installed before it becomes available.
和其他图像特效一样,该特效只能在Unity Pro上进行使用,并且在使用之前必须安装。
Twirl image effect applied to the scene
应用于场景的漩涡图像特效
The radius of the ellipse where image distortion occurs, given in normalized screen coordinates (ie, a radius of 0.5 is half the size of the screen).
在给定的归一化屏幕坐标中,图像扭曲出现的位置上的椭圆半径(ie,半径为 0.5
是屏幕大小的一半)
The angle of rotation at the centre point.
中心点的旋转角度
The point at the centre of the circle where distortion occurs.
扭曲处的圆形区域中心点
Hardware support&&&&
This effect requires a graphics card with pixel shaders (2.0) or OpenGL ES 2.0. PC: NVIDIA cards since 2003 (GeForce FX), AMD cards since 2004 (Radeon 9500), Intel cards since 2005 (GMA 900);
Mobile: OpenGL ES 2.0; Consoles: Xbox 360, PS3.
这个特效需要显卡拥有像素着色器(2.0)或者OpenGL ES 2.0。台式机:2003年以后的NVIDIA显卡(GeForce
FX),2004年以后的AMD显卡(Radeon 9500),2005年以后的Intel卡(GMA
900);移动设备:OpenGL ES 2.0;控制台: Xbox 360、 PS3。
All image effects automatically disable themselves when they can not run on end-users graphics card.
所有图像特效如果无法在用户显卡上运行时将会自动被关闭。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:252287次
积分:2996
积分:2996
排名:第9249名
原创:10篇
译文:40篇
评论:40条
(1)(1)(3)(1)(25)(8)(11)Unity ImageEffect 效率分析
来源:腾讯
一、问题&&&&&&Unity引擎里对渲染后期处理效果很多,如Bloom、运动模糊、景深等效果。实现过程是在作用的摄像机上加脚本并实现OnRenderImage方法,Graphics.Blit(source, destination, material);使用材质material的shader处理帧缓存的数据,再拷贝回屏幕帧缓存。&&&&&&使用ImageEffect之后,发现在某些机型上(华为mate7、三星N7100),运行效率极低,明显卡顿。UnityProfiler查看真机渲染情况&二、调查分析&&&&&&&Unity文档并没有相关的详细介绍,实现的细节也不得而知。论坛里Camera.AAResolve解释为与抗锯齿有关系,关闭全屏抗锯齿之后测试,确实不会卡顿了。&&&&&&目前主流移动&GPU&由三家公司生产,英国&Imagination&公司的&SGX&系列,美国高通公司的&Adreno&系列,以及著名显卡芯片商美国&NVIDIA&公司的移动&GeForce&系列。Arm的mali作为非主流,但在市场上有不小的份额,华为Mate7、三星N7100的GPU正是mali系列。使用Mali Graphics Debugger查看渲染如图:在前2个drawcall里都调用了glReadPixels接口在glReadPixels的最后个参数不为空,则表示数据从显存传输到系统内存,从CPU到GPU的逆向传输,这是非常缓慢的过程,并且是阻塞模式。看看其它机型渲染情况,下面是高通的gpu,使用adrenoprofiler查看。它并没有调用glReadPixels,而是使用了glBindFramebuffer。FBO(Frame buffer object)在使用前需要绑定,void&glBindFramebuffer(GLenum&target,&GLuint&id);第一个参数是指定绑定操作,读、写或可读可写。第二个参数指定绑定的对象,如果是0,则是默认的帧缓存对象。这是使用了改变渲染目标缓存的方法。由此可知不同硬件上处理的方式不一样,具体是因为Unity内部实现的原因或是硬件支持不够。查看opengl版本最大变化的版本是OPENGL3.0。其中正式把帧缓冲对象(framebuffer&object)划入core profile;帧缓冲对象之间可以互相拷贝像素到持有的不同的render target,是性能上的提升。在FBO中使用多重采样抗锯齿,在3.0版本才加入的特性,若渲染接口不支持,则用了比较低级的API来完成获取屏幕缓存数据,导致了卡顿。&我们项目使用的是OPENGL2.0,而mali系列并没有很好的支持OPENGL2.0的接口。用OPENGL3.0导出apk运行在华为mate7(mali系列)上,是没问题的。同样使用了改变渲染目标缓存的方法,因为3.0版本的FBO支持多采样。三、问题结论OPENGL2.0,ImageEffect屏幕后期处理时,改变渲染目标缓存,绑定FBO,若不在ProjectSettings里设置全屏抗锯齿是没问题的。若设置了全屏抗锯齿,不同硬件对不同版本OPENGL的支持不定。&四、解决方案1、关闭抗锯齿。2、提升OPENGL版本到3.0。3、不使用unity的OnRenderImage方法,直接使用渲染到纹理的方法。&第一种方案效果有损失,不可取;第二种可行,但版本的提升可能会有些不可预估的问题,3.0版本也弃用了很多的特性;第三种最可行,渲染到纹理的方法在绝多数机型都支持。实现方法如下:1、&&摄像机上挂接一个脚本2、&&Start方法,temp =&RenderTexture.GetTemporary获取渲染纹理3、&&Update方法,设置Camera.targetTexture&=4、&&OnPostRender方法,设置Camera.targetTexture&=Graphics.Blit(temp, null, material);运行结果:
扫描左侧二维码,关注微信公众号
即可获得游戏智库每日精彩内容推送,并且在第一时间获取游戏行业新鲜资讯。
扫描二维码下载iOS或安卓APP
网易移动VR游戏《破晓唤龙者》参展美国CES原来在unity中ImageEffect就是对屏幕坐标的最终处理效果_shader编程吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:2贴子:
原来在unity中ImageEffect就是对屏幕坐标的最终处理效果收藏
投影坐标到屏幕坐标的转换,然后在对屏幕坐标进行改变处理
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 self reflection 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信