解决RenderTexture无法渲染粒子的问题

有时候我们要用RenderTexture来渲染3D物体到RawImage上然后放到UI层上,但是这么做的话会导致粒子系统无法显示出来。原因是默认shader里面有以下代码

Tags{ "Queue" = "Transparent" 
"IgnoreProjector" = "True" 
"RenderType" = "Transparent" 
"PreviewType" = "Plane"Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB
Cull Off Lighting Off ZWrite Off

“ColorMask RGB”里,只有R/G/B,没有A,所以有透明度的粒子会再Blend融合的时候直接剔除,导致看不到。

解决办法:
新建一个名为RenderTexture的shader,将以下代码复制粘贴覆盖原有代码

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "ImageEffect/RenderTexture"
{
Properties  
    {  
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}  
        _Color ("Tint", Color) = (1,1,1,1)  
          
        _StencilComp ("Stencil Comparison", Float) = 8  
        _Stencil ("Stencil ID", Float) = 0  
        _StencilOp ("Stencil Operation", Float) = 0  
        _StencilWriteMask ("Stencil Write Mask", Float) = 255  
        _StencilReadMask ("Stencil Read Mask", Float) = 255  
  
        _ColorMask ("Color Mask", Float) = 15  
    }  
  
    SubShader  
    {  
        Tags  
        {   
            "Queue"="Transparent"   
            "IgnoreProjector"="True"   
            "RenderType"="Transparent"   
            "PreviewType"="Plane"  
            "CanUseSpriteAtlas"="True"  
        }  
          
        Stencil  
        {  
            Ref [_Stencil]  
            Comp [_StencilComp]  
            Pass [_StencilOp]   
            ReadMask [_StencilReadMask]  
            WriteMask [_StencilWriteMask]  
        }  
  
        Cull Off  
        Lighting Off  
        ZWrite Off  
        ZTest [unity_GUIZTestMode]  
        Fog { Mode Off }  
        Blend One Zero  
        ColorMask [_ColorMask]  
        Blend One OneMinusSrcAlpha // 源rgba*1 + 背景rgba*(1-源A值)  
  
        Pass  
        {  
        CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
            #include "UnityCG.cginc"  
              
            struct appdata_t  
            {  
                float4 vertex   : POSITION;  
                float4 color    : COLOR;  
                float2 texcoord : TEXCOORD0;  
            };  
  
            struct v2f  
            {  
                float4 vertex   : SV_POSITION;  
                fixed4 color    : COLOR;  
                half2 texcoord  : TEXCOORD0;  
            };  
              
            fixed4 _Color;  
  
            v2f vert(appdata_t IN)  
            {  
                v2f OUT;  
                OUT.vertex = UnityObjectToClipPos(IN.vertex);  
                OUT.texcoord = IN.texcoord;  
#ifdef UNITY_HALF_TEXEL_OFFSET  
                OUT.vertex.xy -= (_ScreenParams.zw-1.0);  
#endif  
                OUT.color = IN.color * _Color;  
                return OUT;  
            }  
  
            sampler2D _MainTex;  
  
            fixed4 frag(v2f IN) : SV_Target  
            {  
                half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;  
                //clip (color.a - 0.01);  
                return color;  
            }  
        ENDCG  
        }  
    }  

}

新建一个材质球,在shader搜索“RenderTexture”选择刚才创建的shader,然后把这个材质赋予给RawImager,可以看到粒子出现了,但是有时候会出现变色,那是因为我们用来渲染RawImage的相机的颜色没有设置好,只需要做如下图的设置就可以了,注意的是渲染模式用Solid Color,颜色选择纯黑并且透明度0
在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要将绘制的图像渲染RenderTexture上,可以按照以下步骤进行: 1. 创建一个RenderTexture对象。 2. 将当前的渲染目标设置为RenderTexture对象。 3. 执行绘制操作。 4. 将渲染目标重置回默认值。 以下是一些可能使用的示例代码: ``` // 创建一个RenderTexture对象 RenderTexture renderTexture = new RenderTexture(width, height, depth, format); // 将当前的渲染目标设置为RenderTexture对象 RenderTexture.active = renderTexture; // 执行绘制操作 // 这里可以执行任何绘制操作,比如渲染纹理、绘制模型等等 // 例如,使用Camera来渲染RenderTexture上: camera.targetTexture = renderTexture; camera.Render(); // 将渲染目标重置回默认值 RenderTexture.active = null; ``` 在这个示例中,我们创建了一个指定大小、深度和格式的RenderTexture对象。然后,我们将当前的渲染目标设置为这个RenderTexture对象。接着,我们执行任何需要在RenderTexture上绘制的操作,比如使用Camera渲染RenderTexture上。最后,我们将渲染目标重置回默认值。 请注意,这只是一种可能的实现方式,具体的实现方法可能因使用的引擎或框架而异。 ### 回答2: 将渲染RenderTexture上的方法有以下几个步骤: 1. 创建一个RenderTexture对象。可以通过调用RenderTexture的构造函数或者使用RenderTexture.Create方法来创建一个RenderTexture对象。可以指定RenderTexture的分辨率、深度位数和附加的各种属性。 2. 将渲染目标设为RenderTexture。通过调用Graphics.SetRenderTarget方法,将渲染目标设为之前创建的RenderTexture对象。这样后续的渲染操作就会将渲染RenderTexture上。 3. 进行渲染。在RenderTexture设为渲染目标后,所有的绘制操作都会将渲染RenderTexture上。可以使用各种图形API(如Unity中的Graphics类)提供的绘制函数进行渲染,例如进行模型渲染粒子效果等。 4. 恢复默认的渲染目标。当渲染完成后,需要调用Graphics.SetRenderTarget方法将渲染目标恢复为默认值,通常是屏幕。这样后续的绘制操作就会将渲染到屏幕上。 5. 可选地,将RenderTexture用作贴图。通过将RenderTexture传给材质的主纹理属性,可以将RenderTexture作为贴图应用到模型上。这样可以实现将之前渲染面作为贴图效果展示在模型上。 总结起来,将渲染RenderTexture上的方法就是通过创建和设置RenderTexture为渲染目标,然后进行渲染,最后恢复默认的渲染目标。这样可以实现将渲染结果保存到RenderTexture中,以供后续使用。 ### 回答3: 将渲染RenderTexture上的方法有多种,以下是其中一种常用的方法: 首先,我们需要创建一个RenderTexture对象。可以使用Unity中的RenderTexture.Create()函数进行创建。在创建时,需要指定RenderTexture的宽度、高度、深度和颜色格式等参数。 然后,需要将摄像机的目标纹理设置为刚刚创建的RenderTexture。可以通过设置摄像机的targetTexture属性来实现,将其指定为RenderTexture对象。 接下来,可以使用摄像机进行渲染。将目标摄像机设置为活动摄像机,然后调用摄像机的Render()函数进行渲染。在渲染过程中,将会将渲染RenderTexture上。 最后,可以将RenderTexture作为纹理应用到游戏对象的材质上,或者将其保存为文件等。可以使用RenderTexture的GetReadableTexture()函数获取可以读取的纹理对象,然后将其应用到需要显示的对象上。 需要注意的是,渲染RenderTexture上可能会对性能产生一定影响,因此应该根据实际需求进行调优和优化,以提高游戏的性能和流畅度。同时,在不需要使用RenderTexture时,需要及时释放和销毁相关的资源,以避免内存泄漏等问题的产生。 综上所述,将渲染RenderTexture上的方法包括创建RenderTexture对象、将摄像机的目标纹理设置为RenderTexture、使用摄像机进行渲染、将RenderTexture应用到游戏对象的材质上等步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值