玉石效果?——UnityShader学习笔记

自言自语

shader的能做的效果太多,又学习一种方法做了个效果。但总感觉不是那么回事儿。。 先笔记下吧

又更新了一下 调整修改了一些计算 让这个看起来更好一点 我是觉得更好了一点 上图存档

一、效果

第一版效果

在这里插入图片描述

第二版效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、Shder

4.15更新后的shader

Shader "TNShaderPractise/ShaderPractise_Jade_BackLight"
{
    Properties
    {	 [Header(Textures   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII)]
		 [Space(8)]
        _MainTex ("Texture", 2D) = "white" {}
		_NormalMap ("NormalMap",2D)="bump"{}
		_ThickMap("ThickMap",2D)="white"{}

		[Space(8)][Header(Colors   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII)]
		[Space(8)]
		[HDR]_MainColor("Main Color", Color)=(1,1,1,1)
		[HDR]_BackColor("BackColor Color", Color)=(1,1,1,1)

		[Spece(8)][Header(Parameters   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII)]
		[Space(8)]
		_ThickMapIntensity("ThickMapIntensity",Float)=1
		[Toggle(_ThickMapInvert)]_ThickMapInvert("ThickMapInvert",Float)=0
		_NormalIntensity("NormalIntensity",Float)=1
		_dis("distor",Range(0,1))=0
		_Pow("Pow",Range(0.05,10))=5
		_Value("Value",Range(0,10))=1
		//只是为了面板上能分块明显点.....
		[Space(8)][Header(MatCap   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII)]
		[Space(8)]

		_MatCap("MatCapSpecular",2D) ="black"{}
		[HDR]_MatCapColor("_MatCapColor",Color) =(1,1,1,1)
		_Roughness("Roughness",Range(0.02,1)) =1
		_rotation("Rotation",Range(0,360))=0

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue" = "Geometry"  }

        Pass
        {

			Tags {  "LightMode" = "ForwardBase" }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
			#pragma multi_compile_fwdbase
			#include "AutoLight.cginc"
            #include "UnityCG.cginc"
			#include "Lighting.cginc"

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

            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
				float3 posWS : TEXCOORD1;
				float3 nDir : TEXCOORD2;
				float3 tDir : TEXCOORD3;
				float3 bDir : TEXCOORD4;
				SHADOW_COORDS(5)
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _ThickMap;
			float _ThickMapIntensity;
			float4 _MainColor;
			float4 _BackColor;
            sampler2D _NormalMap;
			float4 _NormalMap_ST;
			float _NormalIntensity;
			float _dis;
			float _Pow;
			float _Value;
			sampler2D _MatCap;
			float4 _MatCapColor;
			float _Roughness;
			float _rotation;
			float _ThickMapInvert;


			v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.texcoord;
				o.posWS = mul(unity_ObjectToWorld,v.vertex);
				o.nDir = UnityObjectToWorldNormal(v.normal);
				o.tDir = mul(unity_ObjectToWorld,v.tangent);
				o.bDir = cross(o.nDir,o.tDir)*v.tangent.w;

				TRANSFER_SHADOW(o);

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
				//Normal
				half3 Ndir = normalize(i.nDir);
				half3 Tdir = normalize(i.tDir);
				half3 Bdir = normalize(i.bDir);
				float3x3 TBN = float3x3(Tdir,Bdir,Ndir);
				half3 bump = UnpackNormal (tex2D(_NormalMap,i.uv));
				bump.xy *= _NormalIntensity;
				bump.z = sqrt (1-saturate(dot(bump.xy,bump.xy)));			
				half3 normalDir = normalize(mul(bump,TBN));		
				//再算一套法线用于光滑度粗细度控制 不然高光太受法线影响不好看
				half3 bump2 = half3(bump.xy*saturate(1-_Roughness),bump2.z);
				bump2.z = sqrt (1-saturate(dot(bump2.xy,bump2.xy)));
				half3 normalDir2 = normalize(mul(bump2,TBN));	
				
				//Direction
				half3 lightDir = normalize(UnityWorldSpaceLightDir(i.posWS.xyz));
				half3 viewDir = normalize(UnityWorldSpaceViewDir(i.posWS.xyz));
				half3 reflDir = normalize(reflect(normalDir,-viewDir));
				

				//BackLight
				// 做了一下灯光角度偏转,显示情况中很少会有绝对水平的方向光. 后边做点光的时候需要再改回去
				half3 backLight = -normalize(float3(lightDir.x,lightDir.y-0.75,lightDir.z)+normalDir*_dis*0.15);
				half3 halfDir_back =normalize(viewDir+backLight+normalDir*_dis*0.1);

				//DOT Prepare
				half VdotL = pow(saturate(dot(viewDir,backLight)),_Pow*20)*_Value;   
				half VdotLF = dot(viewDir,lightDir)*0.5+0.5;     
				//half NdotH_back = saturate(dot(normalDir,halfDir_back));
				half NdotV = saturate(dot(normalDir,viewDir));
				half NdotV2 = saturate(dot(normalDir2,viewDir));
				half NdotL = dot(normalDir,lightDir)*0.5+0.5;     

				//MatCap
				half3 Vnormal = normalize(mul(UNITY_MATRIX_V,normalDir2));
				//旋转MatCap
				float2 MatCapUV = Vnormal.xy*0.5+0.5;
				float cosAngle = cos (radians(_rotation));
				float sinAngle =sin(radians(_rotation));
				float2x2 rot = float2x2(cosAngle,-sinAngle,sinAngle,cosAngle);
				float2 center = float2(0.5,0.5);
				MatCapUV -= center;
				MatCapUV = mul(rot,MatCapUV);
				MatCapUV += center;
		
				//这步计算没啥道理,就自己想当然来的 
				float4 MatCapSpecular =tex2D(_MatCap,MatCapUV)*_MatCapColor*pow(NdotV2,_Roughness*1000);
				
				UNITY_LIGHT_ATTENUATION(atten,i,i.posWS);


				//ThickMap 根据实际提供的贴图 可以随意进行反向转换
				float4 thickness;
				if (_ThickMapInvert == 0)
				{
					thickness = tex2D(_ThickMap,i.uv)*_ThickMapIntensity; 
				}
				else
				{
					thickness = (1-tex2D(_ThickMap,i.uv))*_ThickMapIntensity; 
				}
				
				//IndirectSpecular
				half mip =(1-_Roughness)*6;
				
				half3 envMap = DecodeHDR(UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0,reflDir,mip),unity_SpecCube0_HDR);
				//玉表面会有镜面反射,但是不会像金属和镜子一样那么清晰 所以减弱点乘以0.1 这个看个人喜好
				half4 indirectSpecular = float4(envMap,1)*0.1+MatCapSpecular;
				
				//sh 用SH来作为光源计算 不然没有方向光的时候会全黑
				float4 SH = float4(ShadeSH9(float4(normalDir,1)),1);

				//FinalColor
                fixed4 col = tex2D(_MainTex, i.uv);
				float4 frontCol =col*_MainColor*NdotL*_LightColor0*atten;
				float4 backCol =col*_BackColor*VdotL*_LightColor0*thickness;

				float4 finalCol =lerp(frontCol,backCol,VdotLF);

				float4 IBLdiff =lerp(col*_MainColor*SH,col*_BackColor*SH,1-NdotL);

				return finalCol += indirectSpecular+IBLdiff;
            }
            ENDCG
        }

		//AdditionalLightPass	   关键在于背光
        Pass
        {
			Blend One One
			Tags {  "LightMode" = "ForwardAdd" }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
			#pragma multi_compile_fwdadd
			#include "AutoLight.cginc"
            #include "UnityCG.cginc"
			#include "Lighting.cginc"

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

            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
				float3 posWS : TEXCOORD1;
				float3 nDir : TEXCOORD2;
				float3 tDir : TEXCOORD3;
				float3 bDir : TEXCOORD4;
				SHADOW_COORDS(5)
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _ThickMap;
			float _ThickMapIntensity;
			float4 _MainColor;
			float4 _SecondColor;
			float4 _BackColor;
            sampler2D _NormalMap;
			float4 _NormalMap_ST;
			float _NormalIntensity;
			float _dis;
			float _Pow;
			float _Value;
			sampler2D _MatCap;
			float4 _MatCapColor;
			float _Roughness;
			float _rotation;
			float _ThickMapInvert;


			v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.texcoord;
				o.posWS = mul(unity_ObjectToWorld,v.vertex);
				o.nDir = UnityObjectToWorldNormal(v.normal);
				o.tDir = mul(unity_ObjectToWorld,v.tangent);
				o.bDir = cross(o.nDir,o.tDir)*v.tangent.w;

				TRANSFER_SHADOW(o);

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
				//Normal
				half3 Ndir = normalize(i.nDir);
				half3 Tdir = normalize(i.tDir);
				half3 Bdir = normalize(i.bDir);
				float3x3 TBN = float3x3(Tdir,Bdir,Ndir);
				half3 bump = UnpackNormal (tex2D(_NormalMap,i.uv));
				bump.xy *= _NormalIntensity;
				bump.z = sqrt (1-saturate(dot(bump.xy,bump.xy)));			
				half3 normalDir = normalize(mul(bump,TBN));		
				//再算一套法线用于光滑度粗细度控制 不然高光太受法线影响不好看
				half3 bump2 = half3(bump.xy*saturate(1-_Roughness),bump2.z);
				bump2.z = sqrt (1-saturate(dot(bump2.xy,bump2.xy)));
				half3 normalDir2 = normalize(mul(bump2,TBN));	
				
				//Direction
				half3 lightDir = normalize(UnityWorldSpaceLightDir(i.posWS.xyz));
				half3 viewDir = normalize(UnityWorldSpaceViewDir(i.posWS.xyz));
				half3 reflDir = normalize(reflect(normalDir,-viewDir));
				

				//BackLight
				// BasePass做了一下灯光角度偏转,但点光源是范围光源 不能矫正 所以要改回标准算法
				half3 backLight = -normalize(lightDir+normalDir*_dis*0.15);
				half3 halfDir_back =normalize(viewDir+backLight+normalDir*_dis*0.1);

				//DOT Prepare
				half VdotL = pow(saturate(dot(viewDir,backLight)),_Pow*20)*_Value;   
				half VdotLF = dot(viewDir,lightDir)*0.5+0.5;     
				//half NdotH_back = saturate(dot(normalDir,halfDir_back));
				half NdotV = saturate(dot(normalDir,viewDir));
				half NdotV2 = saturate(dot(normalDir2,viewDir));
				half NdotL = dot(normalDir,lightDir)*0.5+0.5;     

				//MatCap
				half3 Vnormal = normalize(mul(UNITY_MATRIX_V,normalDir2));
				//旋转MatCap
				float2 MatCapUV = Vnormal.xy*0.5+0.5;
				float cosAngle = cos (radians(_rotation));
				float sinAngle =sin(radians(_rotation));
				float2x2 rot = float2x2(cosAngle,-sinAngle,sinAngle,cosAngle);
				float2 center = float2(0.5,0.5);
				MatCapUV -= center;
				MatCapUV = mul(rot,MatCapUV);
				MatCapUV += center;
		
				//这步计算没啥道理,就自己想当然来的 
				float4 MatCapSpecular =tex2D(_MatCap,MatCapUV)*_MatCapColor*pow(NdotV2,_Roughness*1000);
				
				UNITY_LIGHT_ATTENUATION(atten,i,i.posWS);


				//ThickMap 根据实际提供的贴图 可以随意进行反向转换
				float4 thickness;
				if (_ThickMapInvert == 0)
				{
					thickness = tex2D(_ThickMap,i.uv)*_ThickMapIntensity; 
				}
				else
				{
					thickness = (1-tex2D(_ThickMap,i.uv))*_ThickMapIntensity; 
				}
			
				//FinalColor
				fixed4 col = tex2D(_MainTex, i.uv);
				float4 frontCol =col*_MainColor*NdotL*_LightColor0*atten;
				float4 backCol =col*_BackColor*VdotL*_LightColor0*thickness;

				float4 finalCol =lerp(frontCol,backCol,VdotLF);


				return finalCol;
            }
            ENDCG
        }
		}
	FallBack "Diffuse"
}


总结

嗯 虽然慢了点。 但是实现的效果还行~ 算是比较满意了 也能根据开放的参数调出多种效果了。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Jade6.5和Jade9都是非常受欢迎的玉石版本,它们在市场上都有一定的优势和特点。 首先,Jade6.5是一种相对较旧的玉石版本,具有浓郁的历史和文化底蕴。这种玉石质地坚硬,纹路清晰,具有古朴的韵味。它的老化程度会让石头表面形成一些自然的裂纹和细微的砂眼,这被认为是一种宝贵的特征。此外,Jade6.5的产量相对较低,因此它的珍贵程度也相对较高。 而Jade9则是相对较新的一种玉石版本。它保持了玉石的传统特点,质地坚硬且光滑,但与此同时,它也通过现代科技的加工技术,大大提高了玉石的纹理细腻程度。Jade9的表面经过打磨处理,可以保持美丽并延长使用寿命,因此备受现代人的青睐。另外,Jade9的产量相对较高,价格也相对较为亲民。 要判断哪种玉石版本更适合,可以根据个人需要和喜好来决定。如果你喜欢历史悠久的玉石,追求古朴和独特的氛围,那么Jade6.5可能更适合你。但如果你更注重玉石的纹理细腻度以及价格方面的考量,那么Jade9可能是更好的选择。 总的来说,无论是Jade6.5还是Jade9都是优质的玉石版本,最好根据个人需求和喜好来选择。在购买玉石之前,最好了解每种版本的特点,并找到适合自己的选择。 ### 回答2: jade6.5和jade9都是嵌入式系统开发工具包中的两个版本,用于嵌入式软件开发。它们都有各自的特点和优势。 首先,jade6.5是较早发布的版本,已经有一段时间的开发历史。它在稳定性和成熟度方面有一定的优势。开发者在使用它进行嵌入式软件开发时,可以更加放心和信任它的可靠性。此外,由于它已经发布了一段时间,开发社区中已经有较多的相关资源和支持文档可供参考和借鉴。 而jade9则是新一代的版本,它可能提供了一些新的功能和更新。由于是最新版本,它可能会有更好的性能、更多的新特性、更高的兼容性等方面的优势。同时,由于较新,开发社区中可能还在不断积累相关的资源和支持文档。 从选择上来说,具体要根据开发者的需求和项目的要求来决定。如果项目对成熟度和稳定性有较高要求,或者项目已经在使用jade6.5开发,那么继续使用jade6.5可能会是一个较稳妥的选择。如果项目对新功能和性能要求较高,或者刚开始一个新项目,那么可以选择使用jade9来获得最新的特性和性能优势。 总之,两个版本都有各自的优势和适用场景,开发者需要根据具体项目需求做出选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值