unity3d 渲染纹理

2018-01-31 23:12:01 u012079615 阅读数 0
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

渲染纹理

  渲染目标纹理(Render Target Texture, RTT)是指一个摄像机将渲染结果输出到颜色缓冲中,并显示到屏幕上,而不是传统的帧缓冲和后备缓冲。
  多重渲染目标(Multiple Render Target, MRT)是指把场景同时渲染到多个渲染目标纹理中,不需要为每个渲染目标纹理单独渲染完整的场景。延迟渲染就是多重渲染目标的一个应用。
  在Unity中为渲染目标纹理定义了一种专门的纹理类型——渲染纹理(Render Texture)。有两种使用方式:
-   在Project目录下创建一个渲染纹理,把这个纹理设置到某个摄像机的渲染目标上,这样这个摄像机的渲染结果就可以实时更新到渲染纹理中,还可以选择渲染纹理的分辨率、滤波模式等纹理属性。
-   在屏幕后处理时使用GrabPass命令货OnRenderImage函数来获取当前屏幕图像,Unity会把这个图像放到一张渲染纹理中,之后可以在自定义的Pass中当作普通纹理处理,实现各种屏幕特效。

镜子效果

  以下是用第一种方法实现镜子效果,代码如下:
  

Properties {
        _MainTex("Main Tex", 2D) = "white" {}
    }
    SubShader{
        Pass{
            Tags { "LightMode" = "ForwardBase" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"

            sampler2D _MainTex;

            struct a2v
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 uv : TEXCOORD0;
            };

            v2f vert(a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);

                o.uv = v.texcoord;

                o.uv.x = 1 - o.uv.x;
                //o.uv.y = 1 - o.uv.y;

                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                return tex2D(_MainTex, i.uv);
            }

            ENDCG
        }
    }
    FallBack "Specular"

  实现镜子效果只需要将纹理坐标的x进行计算就可以了。这里设置方式按照第一种方法进行设置。实现效果图如下:
               这里写图片描述

玻璃效果

  这里使用GrabPass方式来实现一种玻璃效果。当在Shader中定义了一个GrabPass时,Unity会把当前屏幕的图像绘制在一张纹理中,可以在后续的Pass中访问。GrabPass通常用来渲染透明物体,因此要小心物体的渲染队列设置,即设置为透明队列(“Queue” = “Transparent”)。
  玻璃效果的实现要先使用一张法线纹理来修改模型的法线信息,之后通过一个Cubemap来模拟玻璃的反射,模拟折射时需要使用GrabPass获取玻璃后面的屏幕图像,并使用切线空间下的法线对屏幕纹理坐标偏移后,再对屏幕图像进行采样来模拟近似的折射效果。实现代码如下:
  

Properties {
        _MainTex("Main Tex", 2D) = "white" {}
        _BumpMap("Bump Map", 2D) = "bump" {}                 
        _Cubemap("Environment Cubemap", Cube) = "_Skybox" {}
        _Distortion("Distortion", Range(0, 100)) = 10
        _RefractAmount("Refraction Amount", Range(0, 1)) = 1
    }
    SubShader{
        Tags{ "RenderType" = "Opaque" "Queue" = "Transparent" }

        GrabPass { "_RefractionTex" }

        Pass{
            Tags { "LightMode" = "ForwardBase" }

            CGPROGRAM
            #pragma multi_compile_fwdbase
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            sampler2D _MainTex;
            fixed4 _MainTex_ST;
            sampler2D _BumpMap;                  //法线纹理
            fixed4 _BumpMap_ST;
            samplerCUBE _Cubemap;                //环境纹理
            fixed _Distortion;                   //控制折射的扭曲程度
            fixed _RefractAmount;

            sampler2D _RefractionTex;
            fixed4 _RefractionTex_TexelSize;     //得到纹理的纹素大小

            struct a2v
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                fixed4 tangent : TANGENT;
                fixed4 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 scrPos : TEXCOORD0;
                fixed4 uv : TEXCOORD1;
                fixed4 TtoW0 : TEXCOORD2;
                fixed4 TtoW1 : TEXCOORD3;
                fixed4 TtoW2 : TEXCOORD4;
            };

            v2f vert(a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);

                o.scrPos = ComputeGrabScreenPos(o.pos);

                o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
                o.uv.zw = TRANSFORM_TEX(v.texcoord, _BumpMap);

                float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
                fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
                fixed3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w;

                o.TtoW0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);
                o.TtoW1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
                o.TtoW2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);

                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                fixed3 worldPos = float3(i.TtoW0.w, i.TtoW1.w, i.TtoW2.w);
                fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));

                //计算切线空间中的法线
                fixed3 bump = UnpackNormal(tex2D(_BumpMap, i.uv.zw));

                //计算在切线空间中的偏移量
                float2 offset = bump.xy * _Distortion * _RefractionTex_TexelSize.xy;
                i.scrPos.xy = offset + i.scrPos.xy;
                fixed3 refrCol = tex2D(_RefractionTex, i.scrPos.xy/i.scrPos.w).rgb;

                //将法线转换到世界空间中
                bump = normalize(half3(dot(i.TtoW0.xyz, bump), dot(i.TtoW1.xyz, bump), dot(i.TtoW2.xyz, bump)));
                fixed3 reflDir = reflect(-worldViewDir, bump);
                fixed3 texColor = tex2D(_MainTex, i.uv.xy);
                fixed3 reflCol = texCUBE(_Cubemap, reflDir).rgb * texColor.rgb;

                fixed3 finalColor = reflCol * (1 - _RefractAmount) + refrCol * _RefractAmount;

                return fixed4(finalColor, 1.0);
            }

            ENDCG
        }
    }
    FallBack "Reflective/VertexLit"

  首先需要设置渲染队列为Transparent,确保在渲染该物体时,不透明的物体已经渲染到屏幕上了。之后再顶点着色器中用到了ComputeGrabScreenPos函数来得到被抓取的屏幕图像的采样坐标,然后把纹理坐标和法线纹理坐标分别进行计算,之后再计算通过将世界空间下的法线、副法线、切线的方向按列组成一个切线空间到世界空间的变换矩阵。
  在片元着色器中,先对法线纹理采样,得到切线空间下的法线方向,再和_Distortion以及_RefractionTex_TexelSize对屏幕采样坐标进行偏移,之后对_RefractionTex进行采样,得到折射的颜色。然后通过变换矩阵的每一行分别和法线点乘,得到新的世界空间下的法线方向,计算出反射方向,使用反射方向对环境纹理进行采样,并和主纹理颜色进行相乘得到反射颜色。最后用_RefractAmount对折射颜色和反射颜色进行混合,返回最终颜色。实现效果如下:
          这里写图片描述
  注意在使用GrabPass时,指定一个TexturName会提高效率,这样Unity每帧只会在后续的Pass中第一次使用时抓取一次屏幕图像,后面都会使用这张纹理。如果不指定TextureName,则会在每次使用时进行一次抓取操作。

总结

  上面两种方法都是实现了对屏幕的抓取,GrabPass在与实现简单,但是渲染纹理的效率要高于GrabPass,因为渲染纹理可以自定义纹理大小,GrabPass的分辨率则是和屏幕一致的。
  在Unity5中,引入了命令缓冲(Command Buffers),使用命令缓冲也可以实现类似抓屏的效果,可以在不透明物体渲染后把当前图像复制到一个临时的渲染目标纹理中,再进行一些操作。

2017-10-16 19:07:05 xiongwen_li 阅读数 10680
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

一.首先我们得拿到渲染纹理
我们在project面板creat一个RenderTexture,然后把这个渲染纹理给相机的Rendertexture,如下图所示:
这里写图片描述
然后如下面代码:

RenderTexture renderTexture = _mainCamera.targetTexture;//拿到目标渲染纹理
RenderTexture.active = renderTexture;
Texture2D tex = new Texture2D(renderTexture.width, renderTexture.height);//新建纹理存储渲染纹理
tex.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);//把渲染纹理的像素给Texture2D,才能在项目里面使用
tex.Apply();//记得应用一下,不然很蛋疼
byte[] bytes = tex.EncodeToPNG();//拿到图片的byte
File.WriteAllBytes(Application.dataPath + "/Resources/ScreenShort/" + _index .ToString()+ ".png", bytes);//写入本地

二.把拿到的渲染纹理,加入滑动列表,成为子项

    /// <summary>
    /// 往面料滑动列表刷数据
    /// </summary>
    private void UpadteClothData()
    {
        ClearPrintData(_iteCloths);
        for (int i = 0; i < _CustomDatas.Count; i++)
        {
            //根据数据个数实例化滑动列表子项
            Button item = Instantiate(_item);
            item.name = _CustomDatas[i].id.ToString();
            CustomData clothdata = _CustomDatas[i];
            Image[]  _ClothImags = item.GetComponentsInChildren<Image>();
            for (int j = 0; j < _ClothImags.Length; j++)
            {
                if (_ClothImags[j].name == "sprite")
                {
                    Sprite spr = Sprite.Create(_CustomDatas[i].spr, new Rect(0, 0, _CustomDatas[i].spr.width, _CustomDatas[i].spr.height), Vector2.zero);
                    spr.name = j.ToString();
                    _ClothImags[j].sprite = spr;
                }
                item.transform.SetParent(_ScreenshotScrollView.transform);
                item.transform.localPosition = new Vector3(item.transform.localPosition.x, item.transform.localPosition.y, _ScreenshotScrollView.transform.position.z);
                item.transform.localScale = new Vector3(2, 2, 2);
                _iteCloths.Add(item);
            }
        }
    }

关于ugui滑动列表的使用,最关键的是子项的创建和销毁,但是当我们不停的创建销毁子项的时候,会产生很多内存碎片,很不好,然后我们产生了对象池这个概念,但是我们还有另外一种做法,就是不进行子项的创建和销毁,而是替换子项的数据,不停的去刷新子项数据!下一节主要讲ugui滑动列表,并且实现这种功能!

2019-08-27 20:56:20 shenqiankk 阅读数 427
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

步骤:

第一步:

先创建【纹理文件夹“Textures”】和【渲染文件夹“Material”】,并且存放纹理图片
在这里插入图片描述
【创建】渲染对象
在这里插入图片描述

第二步:

【选择】shader处理方式,Legacy Shaders -> Diffuse
在这里插入图片描述
【拖拽】纹理图片
在这里插入图片描述

第三步:

【拖拽】渲染对象,给物体对象一个渲染方式
在这里插入图片描述

2017-11-26 21:11:38 SwordMaster8060 阅读数 1623
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

1.贴图纹理的尺寸标准

使用纹理图集可以帮助我们减少draw call的数目,而这些纹理的大小同样是一个需要考虑的问题。需要注意的是,所有纹理的长宽比最好是正方形,而且长款值最好是2的整数幂。这是因为有很多优化策略只有在这种时候才可以发挥最大效用。在Unity5中,即使我们导入的纹理长宽值不是2的整数幂,Unity也会自动那长宽转换到离它最近的2的整数幂值。但我们仍然应该在制作美术资源时遵守这条规则,防止由于放缩而造成不好的影响。

2.贴图纹理的多级渐近纹理技术

我们应该尽可能使用多级渐近纹理技术(mipmapping)。在Unity中,我们可以通过纹理导入面板来查看纹理的各个属性。通过把纹理类型设置成Advanced,就可以自定义许多选项,例如,是否生成多级渐近纹理,当勾选了Generate Mip Maps选项后,Unity就会为同一张纹理创建出很多不同大小的小纹理,构成一个纹理金字塔。而在游戏运行中可以根据距离物体的远近,来动态选择使用了哪一个纹理。

3.贴图纹理的压缩

对于像Android这样的平台,有很多不同架构的GPU,纹理压缩就变得有点复杂,因为不同的GPU架构有它自己的纹理压缩格式。幸运的是,Unity可以根据不同的设备选择不同的压缩格式,而我们只需要把纹理压缩格式设置成自动压缩即可。但GUI类型的纹理是个例外,一些时候由于对画质的要求,我们不希望对这些纹理进行压缩。

2015-12-17 10:30:30 cartzhang 阅读数 2368
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

本文章由cartzhang编写,转载请注明出处。 所有权利保留。 

文章链接:http://blog.csdn.net/cartzhang/article/details/50338133

作者:cartzhang


本文同时发表于蛮牛论坛译馆中!

使用渲染纹理的制作摄像头

从Unity5版本开始,渲染纹理的功能对所有用户开放(是的,包括免费版本)!你可以使用此功能来创造很酷的效果,在本文中,我将向你说明怎么创建一个很酷的监控相机,把相机视图投影到屏幕上。

什么是渲染纹理呢?

渲染纹理是一种你可以在其上绘制,然后像使用其他精灵/纹理一样的纹理。其中,最酷的一件事就是你可以使用它作为相机视图的目标——这样相机把它所见的绘制到纹理上(而不是显示在屏幕上)。

另外,这里还包含了一个可把渲染纹理保存为.PNG文件的脚本,你可以随便使用。

 

在TV上显示一个监控相机(忽略吸血鬼...)

该技术类似于一个监控相机设置。你有一个可看见图像的相机,然后把它记录到渲染纹理上(相当于视频带或硬件驱动存放图像),最后把图像投影到TV屏幕上。

下载

你可下载完整的Unity包(需Unity5+ 版本),或你可以跟教程做。

这个包中包括一个随机显示对象(和一个吸血鬼!)的demo场景。相机指向随机的对象,并把它显示到TV屏幕上。

吸血鬼里有一个不错的设计——你选择哪个相机是否可看见(当然,镜子或相机不能看到吸血鬼)。

在样例场景中,你可以做如下控制:

· 箭头按键——移动监控相机

· V——切换吸血鬼的可见性

· S——保存监控相机当前视图为.PNG文件。

具体步骤

若你对Unity非常熟悉,你可以跳过本节。

对于Unity新手,这里会包含大部分的详细的基本操作。若你不理解或想不通,只需要打开资源包——一个非常简单的工程——看看这些对象和他们的设置。

这个技术很大的优势就是关键功能不需要一行代码。它们都包含在了Unity的编辑器中了。

本工程有两个脚本,但是他们是附加功能(其中一个是移动相机,另一个是保存渲染纹理为.PNG文件的)。

工程

新建的Unity3D项目。

你需要的资源是两个精灵(一个TV和一个吸血鬼)。你可以从下载文件中找到或使用你自己的。

把TV放到屏幕上,然后在其他地方随机放置些对象(待会要用监控相机观察这些对象)。把吸血鬼放到这些随机对象当中。

为使TV和吸血鬼精灵导入到场景中,需要选中它们,然后把纹理类型改为精灵。

调整TV大小来使其看起来大小合适。缩放比为(441)差不多刚好。它会要把放置到场景视图中的对象转换为2D的。

你可以直接使用Untiy主菜单(比如:主菜单>GameObject>3D 对象>立方体)创建球型和立方体等等,或通过拖拽一些精灵到场景中来创建一些随机项供相机查看。

大致如下图所示,进入下一步。

 

场景如图

创建吸血鬼

通过创建一个特殊层并告诉监控相机忽略此层,使吸血鬼对相机不可见。

层次面板中选中吸血鬼,然后选择添加图层...属性面板下拉列表中添加新图层,如下:

 

创建新图层

在用户图层8的字段下键入“vampire”。

 

命名为‘vampire’

在吸血鬼选中的状态下,设置它的图层为吸血鬼:

 

设置图层目前不起任何作用,但是在我们操作几步后,它就会起作用了。

创建渲染纹理

在资源文件夹任意地方右键单击,选择创建>渲染纹理。创建一个新的渲染纹理。命名为SecurityCameraTexture

 

创建一个渲染纹理

 

 

选择SecurityCameraTexture纹理,在属性面板中设置它大小为480x270。它的大小决定着它的分辨率,以及将要从相机视图中保存的.PNG图像的分辨率。


设置渲染纹理的大小

从渲染纹理创建材质

使用刚才创建的SecurityCameraTexture创建一个新的材质 

1.  

在资源文件夹任意地方右键单击

2. 

选择创建>材质,命名为SecurityFootage

3. 

选中新材质,修改它的着色器属性(在属性面板上)为手机/漫反射(Mobile/Diffuse)(你需要让它的材质接受一个纹理,缺省是不支持的)

4. 

SecurityCameraTexture 拖拽到材质的纹理属性上(右上角带有山峰照片的小盒子上):


创建新材质

至此,我们创建了一个材质,它可以把theSecurityCameraTexture 纹理显示到任何对象表面。

监控相机

向场景中添加一个新的相机(主菜单>GameObject>相机)。

重命名新相机为SecurityCamera

SecurityCameraTexture 拖拽到SecrityCamera的目标纹理字段上。这就使相机视图显示渲染纹理而不是显示到屏幕上,因为相机此时是作为录像而不是把它显示到游戏屏幕上。

 

当相机被选中,你可以看到一个可看到场景窗口的小小预览窗口。


当相机被选中时,它的视图在预览窗口中显示的是场景视图。你的场景也许与上图不太一样。

 

把相机移动到可以看到所有对象和吸血鬼的地方。你需要确保相机在你3D空间场景的前方,这样就可以看到场景中所有对象。当可在相机预览窗口中看到所有对象时(不包括TV屏幕),进行下个步骤。

过滤吸血鬼

在上图预览窗口(需要把对象显示在TV屏幕上,待会就可以了)中,你不能看到吸血鬼。为过滤吸血鬼,在层次面板中选中SecurityCamera,然后从它的裁剪Mask中移除vampirelayer (这样它就看不吸血鬼图层的任何东西)

1. 

在层次面板中选中SecurityCamera 

2. 

在属性面板中,点击裁剪Mask的下拉列表

3. 

取消吸血鬼图层的对勾(勾选的图层是相机可见的)。

 

过滤vampire图层的对象

 

 若在相机预览中吸血鬼依旧可见,回去看看,确保你对吸血鬼创建了吸血鬼图层。

创建TV

在场景中创建一个平面(主菜单>GameObject>3D对象>平面(Plane))。重命名平面为TVScreen。

若你之前没有用过平面,可能会觉得奇怪。因为平面是一个二维的平面,它在某些角度和视角下可能看不到。旋转平面使其面向相机。切换3D和2D场景视图可帮助你修改它。

修改TV Screen使其适合TV精灵的屏幕。确保它被放置到TV精灵的正前方,让主相机看到它。

拖拽SecurityFootage TV Screen的材质>元素0Element 0)的属性(待会你需要像屏幕下方一样扩展材质列表):


使用之前创建的SecurityFootage作为平面的材质

至此,已经把材质关联到TV 屏幕上。你会想起之前的步骤,材质将显示监控相机看到的。

若TV图片上下颠倒,你需要旋转平面到正确位置。

就是这样!

 

你甚至不需要运行场景就可以看到场景对象(除了吸血鬼)显示到TV屏幕上了。超级棒!

我们总结一下我们基本步骤:

1. 

创建一个渲染纹理

2. 

创建一个相机将看到的内容绘制到渲染纹理上

3. 

创建一个材质来显示渲染纹理

4. 

最后,创建TV 屏幕显示材质。

跟真的监控相机一样,我们扑捉视图,通过一个录像设备(渲染纹理类似于电影的摄像机)把它发送到一个屏幕上。

提高部分

 

样例工程中包含两个额外的代码。一个脚本是添加一些用户控制以便移动监控相机和切换吸血鬼的显示和隐藏;另一个脚本当按下“S”键时,把监控相机视图保存为一个.PNG格式图片文件。第二个脚本如下,并做了注释。

保存渲染纹理

代码是Unity问答中‘Mate-O’ 编写,做了修改(http://answers.unity3d.com/questions/22954/how-to-save-a-picture-take-screenshot-from-a-camer.html)

代码很简单——读取渲染纹理像素,编码为.PNG ,最后保存为.PNG。注释说明了每段代码功能。


Code example:
using UnityEngine;
using System.Collections;
using System;
 
public class CameraSnapshot : MonoBehaviour
{
[SerializeField]
RenderTexture securityCameraTexture;  // drag the render texture onto this field in the Inspector
[SerializeField]
Camera securityCamera; // drag the security camera onto this field in the inspector
 
void LateUpdate()
{
 
    if (Input.GetKeyDown("s"))
    {
        StartCoroutine(SaveCameraView());
    }
 
}
 
public IEnumerator SaveCameraView()
{
    yield return new WaitForEndOfFrame();

    // get the camera's render texture
    RenderTexture rendText= RenderTexture.active;
    RenderTexture.active = securityCamera.targetTexture;
 
    // render the texture
    securityCamera.Render();
 
    // create a new Texture2D with the camera's texture, using its height and width
    Texture2D cameraImage= new Texture2D(securityCamera.targetTexture.width, securityCamera.targetTexture.height, TextureFormat.RGB24, false);
    cameraImage.ReadPixels(new Rect(0, 0, securityCamera.targetTexture.width, securityCamera.targetTexture.height), 0, 0);
    cameraImage.Apply();
    RenderTexture.active = rendText;
 
    // store the texture into a .PNG file
    byte[] bytes = cameraImage.EncodeToPNG();
 
    // save the encoded image to a file
    System.IO.File.WriteAllBytes(Application.persistentDataPath + "/camera_image.png", bytes);
}
}
	

 

一旦脚本添加到场景中,就可以按下“S”键来获取相机截图。你可以访问保存的文件。

总结

渲染纹理是一个你可以绘制的画布。通过关联渲染纹理到相机的输出,就可以把相机所见绘制到渲染纹理上。

因为渲染纹理是一个纹理,就可以把它关联到材质上。然后,添加材质到对象上并有效的把渲染纹理投影到对象的表面。

监控显示是对它工作原理是一个很好的比喻。相机就是相机,渲染纹理是视频录制,材质是你视频投影到的屏幕。

展望?

现在,你应该理解了渲染纹理的工作原理,并可灵活使用。.PNG输出也提供了很多可能。渲染纹理特性(还有其他属性)对Unity5之前的非专业版本用户不开放,越来越开放使Unity成为越来越棒的工具。

使用该技术的一些想法:

· 使用多个精灵形成一个新的图片保存为.PNG,在游戏中使用(比如:通过不同的特征组成一张脸)。

· 红外相机可以看到裸眼不可见生物。

· 若你可以找到一个方法修改相机输出(比如:让TV屏幕为黑白屏或像老电脑屏幕一样泛绿光)。

 

 


-----------

原文地址:http://unity.grogansoft.com/in-g ... ing-render-texture/


完整工程和资源链接:http://pan.baidu.com/s/1o7ypjUM

--------------

感谢COCO的修改!thxs!

--------------

若有问题,请随时联系!

非常感谢!


Unity3D 渲染路径

阅读数 2266