一日一Shader·几何渲染之爆炸【SS_9】

本文介绍了一种在Unity中使用自定义Shader实现几何渲染效果的方法,通过沿法线偏移三角面并控制动画播放,展示了如何利用CS脚本进行动画控制。详细解析了Shader代码结构,包括属性设置、顶点变换、法线处理及片段颜色计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天温习一下几何渲染,先拿个简单的效果热个身:

这个是三角面沿法线偏移产生的效果,并用cs脚本控制动画播放。

Shader "MyShader/SS_9"  
{  
    Properties{          
        _MainTex("Texture", 2D) = ""{}  
		_Power("Power",Range(0,10))=0.5		
    }  
    SubShader
    {		
		CGINCLUDE
		#include "UnityCG.cginc"	
		sampler2D _MainTex;
		float4 _MainTex_ST;
		float _Power;
		struct appdata
        {
			float4 vertex : POSITION;
			float2 uv : TEXCOORD0;			
			float3 normal : NORMAL;
		};
		struct v2f
        {
			float4 vertex : SV_POSITION;
			float2 uv : TEXCOORD0;
			float4 worldPos   : TEXCOORD1;			
			float3 normal : TEXCOORD2;
        };
			
		ENDCG
		Pass
        {  	
            CGPROGRAM 			
			#pragma vertex vert
			#pragma fragment frag
			#pragma geometry geom

			v2f vert(appdata v)
			{
				v2f o;
				o.vertex = v.vertex;				
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.worldPos = mul(unity_ObjectToWorld, v.vertex);
				o.normal = v.normal;
				return o;
			}
			[maxvertexcount(21)]
			void geom(triangle v2f v[3], inout TriangleStream<v2f>  tristream)
			{
				float3 normal = normalize(v[0].normal + v[1].normal + v[2].normal);
				for (int i = 0; i < 3; i++) {					
					v2f o = v[i];
					v[i].vertex.xyz += normal*_Power;				
					o.vertex = UnityObjectToClipPos(v[i].vertex.xyz);
					tristream.Append(o);
				}
				tristream.RestartStrip();
			}

			fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);				
                return col;
            }
            ENDCG
        }
    }
}  
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SS_9 : MonoBehaviour
{    
    private Material[] mats;
    private Transform[] objs;
    public float cdTime = 1;
    public float maxValue = 0.7f;
    public float speed = 1;
    public float rotSpeed = 1;

    public Material[] Mats
    {
        get
        {
            if (mats == null)
            {
                mats = new Material[Objs.Length];
                for(var i = 0; i < mats.Length; i++)
                {
                    mats[i] = Objs[i].GetComponent<MeshRenderer>().material;
                }
            }
            return mats;
        }

        set
        {
            mats = value;
        }
    }

    public Transform[] Objs
    {
        get
        {
            if (objs == null)
            {
                objs = transform.GetChildrenToArray<Transform>();               
            }
            return objs;
        }

        set
        {
            objs = value;
        }
    }

    IEnumerator Start()
    {
        for (var i = 0; i < Mats.Length; i++)
        {
            StartCoroutine(IE_OnceAnim(i));
            StartCoroutine(IE_Rot(i));
            yield return new WaitForSeconds(cdTime);
        }
    }
    IEnumerator IE_Rot(int _index)
    {
        while (true)
        {
            Objs[_index].Rotate(Vector3.forward, rotSpeed * Time.deltaTime);
            yield return null;
        }
    }
    IEnumerator IE_OnceAnim(int _index)
    {
        //当一个球消失时      
        var _cur = 0f;
        while (true)
        {
            Mats[_index].SetFloat("_Power", _cur);
            if (_cur > maxValue)
            {
                _cur = 0;
                Mats[_index].SetFloat("_Power", _cur);
                yield return new WaitForSeconds(cdTime);
            }            
            _cur += Time.deltaTime * speed;           
            yield return null;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值