【UnityShader学习总结】

UnityShader学习总结


1、内容概述

由于仓库里写了笔记就不搬了
如空间转换:

在这里插入图片描述


光照模型:

在这里插入图片描述


高度贴图的使用:

Shader "Bump/Bump_HeightMap"
{
    Properties
    {
        [NoScaleOffset]_MainTex ("Texture", 2D) = "white" {}
		[NoScaleOffset]_DepthMap("Depth Map", 2D) = "bump" {}
		_Scale("Scale", Range(1, 10)) = 1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        Pass
        {
            Tags {"LightMode"="ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float3 lightDir: TEXCOORD1;
				float3 viewDir : TEXCOORD2;
            };

			sampler2D _MainTex;
			sampler2D _DepthMap;
			float _Scale;
			float4 _DepthMap_TexelSize;
            float4 _MainTex_ST;

            v2f vert (appdata_tan v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;
                o.uv = TRANSFORM_TEX(o.uv, _MainTex);

                //注意此函数 v 必须要有切线和法线
                TANGENT_SPACE_ROTATION;

                o.lightDir = mul(unity_WorldToObject, _WorldSpaceLightPos0).xyz;
				o.lightDir = mul(rotation, o.lightDir);
                return o;
            }

            //根据高度贴图的UV分别计算切线,然后根据切线来得到新的法线
			float3 CalculateNormal(float2 uv)
			{
            	//_DepthMap_TexelSize : 它的前两个分量包含纹理像素大小(以U和V的分数表示)。其他两个分量包含像素数量。例如,在256×128纹理的情况下,它将包含(0.00390625、0.0078125、256、128)。
				float2 du = float2(_DepthMap_TexelSize.x * 0.5, 0);
				float u1 = tex2D(_DepthMap, uv - du);
				float u2 = tex2D(_DepthMap, uv + du);
				float3 tu = float3(1, 0, (u2 - u1) * _Scale);

				float2 dv = float2(0, _DepthMap_TexelSize.y * 0.5);
				float v1 = tex2D(_DepthMap, uv - dv);
				float v2 = tex2D(_DepthMap, uv + dv);
				float3 tv = float3(0, 1, (v2 - v1) * _Scale);

            	//cross(tv, tu)和cross(tu, tv)是有区别的,我们希望向量指向上方,所以必须是cross(tv, tu)
				return normalize(cross(tv, tu)); 
			}
            
            fixed4 frag (v2f i) : SV_Target
            {
				fixed4 albedo = tex2D(_MainTex, i.uv);
				float3 normal = CalculateNormal(i.uv);

				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo.rgb;
				fixed3 diffuse = albedo.rgb * _LightColor0.rgb * saturate(dot(normal, i.lightDir));
				//只是用了漫反射
				fixed4 finalColor = fixed4(ambient + diffuse, 1.0);
				return finalColor;
            }
            ENDCG
        }
    }
}

// 内置shader
//struct appdata_tan {
//    float4 vertex : POSITION;
//    float4 tangent : TANGENT;//切线
//    float3 normal : NORMAL;
//    float4 texcoord : TEXCOORD0;
//    UNITY_VERTEX_INPUT_INSTANCE_ID
//};

2、Gitee地址

Shader个人学习总结


主要学习参考

主要参考

  • Games101
  • Shader入门精要
  • CatLikeCoding
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值