当前位置: 首页 > article >正文

unity urp 扭曲效果(半透明物体也可扭曲)

需求描述:实现指定摄像机的热扭曲效果,并且半透明效果也是可以被扭曲的。

步骤

1.制作扭曲shader:

Shader "Unlit/HeatDistortion"
{
     Properties {
        _NoiseTex ("噪声贴图", 2D) = "white" {}
        _DistortStrength ("扭曲强度", Range(0, 0.1)) = 0.05
        _Speed ("速度", Float) = 1.0
    }

    SubShader {
        Tags { 
            "RenderType" = "Transparent" 
            "Queue" = "Transparent"  // 确保在透明物体后渲染
        }

        Pass {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            TEXTURE2D(_NoiseTex);
            SAMPLER(sampler_NoiseTex);
            TEXTURE2D(_CameraOpaqueTexture);
            SAMPLER(sampler_CameraOpaqueTexture);

            float _DistortStrength, _Speed;

            struct Attributes {
                float4 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Varyings {
                float4 positionCS : SV_POSITION;
                float2 uv : TEXCOORD0;
                float4 screenPos : TEXCOORD1;
            };

            Varyings vert(Attributes input) {
                Varyings output;
                VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
                output.positionCS = vertexInput.positionCS;
                output.uv = input.uv;
                output.screenPos = ComputeScreenPos(output.positionCS);
                return output;
            }

            half4 frag(Varyings input) : SV_Target {
                // 动态采样噪声贴图
                float2 noiseUV = input.uv + _Time.y * _Speed * 0.1;
                float2 noise = SAMPLE_TEXTURE2D(_NoiseTex, sampler_NoiseTex, noiseUV).rg;

                // 计算 UV 偏移
                float2 distort = (noise * 2 - 1) * _DistortStrength;
                float2 screenUV = (input.screenPos.xy / input.screenPos.w) + distort;

                // 采样屏幕纹理
                half4 color = SAMPLE_TEXTURE2D(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, screenUV);
                return color;
            }
            ENDHLSL
        }
    }
}

2.制作shader对应的材质

选择材质的shader为刚创建的shader,并且拖入噪声图片。

3. 制作并设置quad

在Hierarchy面板右键->3D Object->quad,将新建材质拖入quad中

3.拖拽quad

将面板拖拽到摄像机前方,此时会发现摄像机拍摄的 render texture  已经发生扭曲,但是半透明物体(比如粒子和VFX)都看不到了

4. 新建并且设置layer

 新建一个layer为DistortionLayer,并且将半透明物体的layer设置为DistortionLayer

5.设置摄像机的renderer

先找到摄像机使用的renderer,如果是Default,那么真实使用的就是0号renderer data

在Project面板中搜索这个renderer data(应该是在settings文件夹中)。

找到后点击Add Renderer Feature 添加一个render object,并且按照图所示去配置。命名为VFX Transparent(啥名字都可以,无所谓)

我们会发现game视图中已经可以看到被扭曲的半透明物体了。搞定!


http://www.kler.cn/a/596060.html

相关文章:

  • Unity—从入门到精通(第一天)
  • 一文了解ThreadLocal
  • bug:uni-file-picker上传图片报错,文件选择器对话框只能在由用户激活时显示,跨域cors
  • Ai客服机器人系统源码
  • redis搭建一主一从+keepalived(虚拟IP)实现高可用
  • 用 pytorch 从零开始创建大语言模型(零):汇总
  • 【css酷炫效果】纯CSS实现悬浮弹性按钮
  • CSS-文本属性1
  • C# HTTP 文件上传、下载服务器
  • v-自定义权限指令与v-if互相影响导致报错Cannot read properties of null (reading ‘insertBefore‘)
  • dcat-admin已完成项目部署注意事项
  • 4(四) Jmeter自动化报表html生成
  • 人工智能在电子信息工程信号处理中的应用调研
  • 抖音用户视频批量下载工具开发全解析
  • Powershell WSL部署ubuntu22.04.5子系统
  • 【css酷炫效果】纯CSS实现动态云雾效果
  • Proteus 使用入门指南
  • 19.哈希表的实现
  • 和鲸科技受邀赴中国气象局气象干部培训学院湖南分院开展 DeepSeek 趋势下的人工智能技术应用专题培训
  • thread【QT】