文章目录

  • 自言自语
  • 一、效果
    • 第一版效果
    • 第二版效果
  • 二、Shder
  • 总结

自言自语

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{//Normalhalf3 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));    //Directionhalf3 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 Preparehalf 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;     //MatCaphalf3 Vnormal = normalize(mul(UNITY_MATRIX_V,normalDir2));//旋转MatCapfloat2 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; }//IndirectSpecularhalf 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);//FinalColorfixed4 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 OneTags {  "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{//Normalhalf3 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));    //Directionhalf3 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 Preparehalf 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;     //MatCaphalf3 Vnormal = normalize(mul(UNITY_MATRIX_V,normalDir2));//旋转MatCapfloat2 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; }//FinalColorfixed4 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"
}

总结

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

玉石效果?——UnityShader学习笔记相关推荐

  1. 带顶点动画的护盾效果——UnityShader学习笔记

    文章目录 自言自语 一.效果 二.C# 三.Shader 总结 自言自语 最近又是很久没有更新笔记了.原因有二. 一.最近一直再啃一个看起来酷炫的护盾效果 啃了好久啊.直至效果满意 也理解了. 这个是 ...

  2. 模板测试+一个好玩的顶点动画效果——UnityShader学习笔记

    文章目录 一.自言自语 效果 模板测试效果(图传错了就懒得继续换了) 模板测试代码 顶点动画面板 顶点动画效果 顶点动画shader代码 总结 一.自言自语 嗯,又是很久没写笔记了.学习的进度和效率没 ...

  3. 方块粒子动画效果——UnityShader学习笔记

    文章目录 自言自语 一.效果和面板 二.Shader 总结 自言自语 很早以前学B站一个UP主的东西.今天突然想起来.果然发现看不懂了.不理解了.然后自己又啃了一遍.总算理解了.并且发现了一些不合适的 ...

  4. Unity-shader学习笔记(七)

    文章目录 Unity-shader学习笔记(七) 15 更复杂的光照 15.1 Unity的渲染路径 15.1.1 前向渲染路径 15.1.1.1 前向渲染路径的原理 15.1.1.2 Unity中的 ...

  5. UnityShader学习笔记:Caustic水纹焦散与鱼群制作水族馆

    UnityShader学习笔记:Caustic水纹焦散 贴图 代码部分 关于聚散色彩分离的疑惑 鱼群动画 本文教程原地址:https://www.alanzucconi.com/2019/09/13/ ...

  6. 消散效果shader实践含clip阴影pass——UnityShader学习笔记

    文章目录 自言自语 一.效果部分 二.Shader部分 总结 自言自语 消融效果shader学习练习笔记 没啥可说得了 写完看不见模型了 ORZ 然后晚上回来把绕不明白的几个函数给绕明白了...再加上 ...

  7. 简单的builltin下的PBRshader手撸练习——UnityShader学习笔记

    文章目录 自言自语 一.截图效果 二.shader 总结 自言自语 又是很久没有写笔记了.因为一直在啃PBR.总算在昨晚算是啃通了一遍.不过这只是个简单的builltin下的相对简单的PBR框架的sh ...

  8. anacoda的spyder在调用matplotlib的时候无法显示动画效果【学习笔记】

    ipython console的默认设置将图像结果显示在终端,但是这样显示存在的问题是无法显示动画效果,因此需要将动画效果显示到单独的窗口,按照下面的截图即可显示. 方法一.按照如下截图显示设置,重启 ...

  9. [JS]图片自动切换效果(学习笔记)

    上次在下载的网页中看到 javascript实现图片自动切换效果: <style text="text/css"> /*图片滚动栏*/ .container, .con ...

最新文章

  1. python转换数据类型(int、float、str、eval、tuple、list、chr、ord、bin、oct、hex)
  2. jsessionid和jwt_JWT与Session的比较
  3. 计算机网络基础专业找工作,2021计算机网络技术前景怎么样? 好找工作吗
  4. 利用python求解度中心性
  5. app.vue里使用data_在电脑使用讯飞有声,通过python自动化朗读
  6. 计算机网闸合同,网闸三大主流技术 -电脑资料
  7. 7-5 猴子选大王 (20 分)
  8. 阿里平台上转的 数据模型架构规范
  9. 下列哪项不属于以太网交换机的特点_钢筋混凝土结构的特点及配筋要求考点,每天几分钟,轻松学二建...
  10. java常用类之String类
  11. java 港澳台手机号码正则表达式
  12. 计算机专业保研面试备考:计算机算法(必看)
  13. 3天完成Open CPU开发!7天完成Costdown!满足客户对成本、功耗、安全性等方面的需求!
  14. win10 快速截屏
  15. hadoop集群-单词统计
  16. Vue 设置路由title
  17. OpenCV之图像ROI与ROI操作
  18. perl Carp模块使用举例(转)
  19. 「开机自启」macOS如何关闭开机自启动软件?
  20. 如何用迅雷下载python_使用python爬虫爬取迅雷侠下载,呵呵,你懂得

热门文章

  1. 3D建模软件快捷键大全,想要提高游戏建模效率必看
  2. 在Android手机上使用油候插件Tampermonkey或者脚本猫
  3. WonderTrader高频交易初探及v0.6发布
  4. uniapp自定义日历组件
  5. 3D打印塑料钢网全流程介绍(文件输出、PCB刷锡浆、PTC焊接)
  6. 软考A计划-重点考点-专题十二(JAVA程序设计)
  7. The 50 Most Essential Pieces of Classical Music
  8. Steata分布式事务的使用
  9. 空降微博热搜第一,这款消除游戏有什么新花样?
  10. No.4-VulnHub-Tr0ll:1-Walkthrough渗透学习