UnityShader玉石效果

news2024/11/30 5:01:40

效果:

代码:

Shader "MyShader/Jade"
{
    Properties
    {
         _DiffuseColor("漫反射颜色",color)=(1,1,1,1)
        _ThicknessMap("厚度图",2d)="white"{}
        _AddColor("叠加颜色",color)=(1,1,1,1)
        _CubeMap("环境贴图",Cube)="white"{}
        _RotateAngle("环境贴图旋转偏移",Range(0,360))=0
        _BackLightContrast("透光对比度",float)=1.0
        _BackLightScale("透光亮度",float)=1.0
        _Distort("扭曲程度",Range(0,1))=1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Tags{"LightMode"="ForwardBase"}
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase

            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #include "Lighting.cginc"

            float _BackLightContrast;
            float _Distort;
            float _BackLightScale;
            sampler2D _ThicknessMap;
            samplerCUBE _CubeMap;
            float4 _CubeMap_HDR;
            float _RotateAngle;
            float4 _DiffuseColor;
            float4 _AddColor;

            float3 Rotate(float3 v,float rotateAngle)
            {
                float rad = rotateAngle*UNITY_PI/180.0;
                float2x2 rotateMul = float2x2(cos(rad),-sin(rad),sin(rad),cos(rad));
                float2 rotate_dir = mul(rotateMul,v.xz);
                return float3(v.x,rotate_dir.y,v.z);
            }

            struct appdata
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 normal_world : TEXCOORD1;
                float3 pos_world : TEXCOORD2;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;
                o.normal_world =normalize( mul(v.normal,unity_WorldToObject).xyz);
                o.pos_world = mul(unity_ObjectToWorld,v.vertex).xyz;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                half3 normal_world = normalize(i.normal_world);
                half3 view_dir = normalize(_WorldSpaceCameraPos.xyz-i.pos_world);
                half3 light_dir = normalize(_WorldSpaceLightPos0.xyz);
                //漫反射
                half NdotL = saturate(dot(normal_world,light_dir));
                half3 diffuse_term = NdotL*_DiffuseColor*_LightColor0.xyz+_AddColor.xyz;
                //透射光
                half3 back_dir = -normalize(light_dir+normal_world*_Distort);   //透射方向
                half VdotBL = saturate(dot(view_dir,back_dir));
                half thickness = 1.0-tex2D(_ThicknessMap,i.uv).r;
                half back_light = saturate(pow(VdotBL,_BackLightContrast))*_BackLightScale;
                half3 backlight_term = back_light*_LightColor0.xyz*thickness;
                //环境光
                half3 hdr_reflect_dir = normalize(reflect(-view_dir,normal_world));
                half3 rotate_hdr_reflect_dir = Rotate(hdr_reflect_dir,_RotateAngle);
                half frensil = 1-saturate(dot(normal_world,view_dir));
                float4 hdr_color = texCUBE(_CubeMap,rotate_hdr_reflect_dir);
                half3 env_color = DecodeHDR(hdr_color,_CubeMap_HDR)*frensil;
        

                half3 final_color = backlight_term+env_color+diffuse_term;
                return fixed4(final_color,1.0);
            }
            ENDCG
        }
        Pass
        {
            Tags{"LightMode"="ForwardAdd"}
            Blend One One
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdadd

            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #include "Lighting.cginc"

            float _BackLightContrast;
            float _Distort;
            float _BackLightScale;
            sampler2D _ThicknessMap;

            float3 Rotate(float3 v,float rotateAngle)
            {
                float rad = rotateAngle*UNITY_PI/180.0;
                float2x2 rotateMul = float2x2(cos(rad),-sin(rad),sin(rad),cos(rad));
                float2 rotate_dir = mul(rotateMul,v.xz);
                return float3(v.x,rotate_dir.y,v.z);
            }

            struct appdata
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 normal_world : TEXCOORD1;
                float3 pos_world : TEXCOORD2;
                LIGHTING_COORDS(3,4)
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;
                o.normal_world =normalize( mul(v.normal,unity_WorldToObject).xyz);
                o.pos_world = mul(unity_ObjectToWorld,v.vertex).xyz;
                TRANSFER_VERTEX_TO_FRAGMENT(o);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                half3 normal_world = normalize(i.normal_world);
                half3 view_dir = normalize(_WorldSpaceCameraPos.xyz-i.pos_world);
                half3 light_dir = normalize(_WorldSpaceLightPos0.xyz);

                //透射光
                half3 back_dir = -normalize(light_dir+normal_world*_Distort);   //透射方向
                half VdotBL = saturate(dot(view_dir,back_dir));
                half thickness = 1.0-tex2D(_ThicknessMap,i.uv).r;
                half back_light = saturate(pow(VdotBL,_BackLightContrast))*_BackLightScale;
                half3 backlight_term = back_light*_LightColor0.xyz*thickness;

                half3 atten = LIGHT_ATTENUATION(i);

                half3 final_color = backlight_term*atten;
                return fixed4(final_color,1.0);
            }
            ENDCG
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1449914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】const、static关键字和构造函数初始化

💗个人主页💗 ⭐个人专栏——C学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 1. const修饰成员函数 1.1 语法格式 1.2 权限放大缩小 1.3 思考 1.4 解答 2. 再谈构造函数 2.1 构造函数体赋值 2.2 初始…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Navigation组件 鸿蒙(HarmonyOS)项目方舟框架&#…

Mybatis开发辅助神器p6spy

Mybatis什么都好,就是不能打印完整的SQL语句,虽然可以根据数据来判断一二,但始终不能直观的看到实际语句。这对我们想用完整语句去数据库里执行,带来了不便。 怎么说呢不管用其他什么方式来实现完整语句,都始终不是Myb…

相机图像质量研究(18)常见问题总结:CMOS期间对成像的影响--CFA

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

B2科目二考试项目笔记

B2科目二考试项目笔记 1 桩考1.1 右起点倒库1.2 移库(左→右)1.3 驶向左起点1.4 左起点倒库1.5 驶向右起点 2 侧方停车考试阶段(从路边开始): 3 直角转弯4 坡道定点停车和起步5 单边桥6 通过限速限宽门7 曲线行驶8 连续…

每日五道java面试题之java基础篇(六)

目录: 第一题:Java 创建对象有哪⼏种⽅式?第二题 .Integer a 127,Integer b 127;Integer c 128,Integer d 128;相等吗?第三题.Object 类的常⻅⽅法?第四题 List和Set的区别第五题 ArrayList和…

代码解读:Stable Video Diffusion 中对运动程度的控制

Diffusion Models视频生成-博客汇总 前言:在SVD中,对运动的控制可以分成对镜头运动的控制和对内容运动的控制,这篇博客详细通过代码讲解如何对内容运动的控制。 目录 方法一:motion_bucket_id 简述 代码解读 方法二&#xff1…

【Linux】yum软件包管理器

目录 Linux 软件包管理器 yum 什么是软件包 Linux安装软件 查看软件包 关于rzsz Linux卸载软件 查看yum源 扩展yum源下载 Linux开发工具 vim编辑器 上述vim三种模式之间的切换总结: 命令模式下,一些命令: vim配置 Linux 软件包管理…

BUGKU-WEB 社工-初步收集

题目描述 题目截图如下: 描述:其实是杂项,勉强算社工吧。来自当年实战 进入场景看看: 解题思路 做题先看源码关注可下载的资源(zip压缩包)抓包寻找可能存在的加密信息(base64)不管三七二十一先扫描目录再说 ps&…

【小记】MacOS Install golang

问题 - command not found: go ➜ brew install golang ➜ go version go version go1.21.7 darwin/arm64写在最后:若本文章对您有帮助,请点个赞啦 ٩(๑•̀ω•́๑)۶

.target勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言: 网络安全威胁如勒索病毒已经成为企业和个人数据安全的重大挑战之一。.target勒索病毒作为其中的一种,以其高度复杂的加密算法和迅速变化的攻击手法备受关注。本文将深入介绍.target勒索病毒的特点,探讨如何有效地恢复被加密的数据文件…

计网day3

四 链路层 4.1 基本概念 4.2 封装成帧 4.3 差错控制 4.4 流量控制与可靠传输机制 停止-等待协议: 后退N帧协议(GBN) 选择重传协议(SR): 4.5 信道划分介质访问控制 ALOHA协议&#…

大厂的供应链采购系统设计

关注我,紧跟本系列专栏文章,咱们下篇再续! 作者简介:魔都技术专家兼架构,多家大厂后端一线研发经验,各大技术社区头部专家博主,编程严选网创始人。具有丰富的引领团队经验,深厚业务架…

嵌入式CAN通信协议原理(下)

本篇文章结合实际CAN控制器继续介绍协议相关的内容,还有示例讲解。 好了,继续吧! 二. STM32 CAN 控制器介绍 STM32 的芯片中具有 bxCAN 控制器 (Basic Extended CAN),它支持 CAN 协议 2.0A 和 2.0B 标准。 该 CAN 控制器支持最…

【JAVA】计算机软件工程人工智能研究生复试资料整理

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 1. Java 1. == 和 equals的区别 比较基本数据类型是比较的值,引用数据类型是比较两个是不是同一个对象,也就是引用是否指向同 一个对象,地址是否相同,equ…

【Java】零基础蓝桥杯算法学习——线性动态规划(一维dp)

线性dp——一维动态规划 1、考虑最后一步可以由哪些状态得到,推出转移方程 2、考虑当前状态与哪些参数有关系,定义几维数组来表示当前状态 3、计算时间复杂度,判断是否需要进行优化。 一维动态规划例题:最大上升子序列问题 Java参…

【C++第二阶段-重载-关系运算符函数调用】

你好你好! 以下内容仅为当前认识,可能有不足之处,欢迎讨论! 文章目录 关系运算符-重载-判断相等函数调用运算符重载 关系运算符-重载-判断相等 场景:两个对象,若有年龄和性别的不同,是否可以直…

算法学习——LeetCode力扣贪心篇1

算法学习——LeetCode力扣贪心篇1 455. 分发饼干 455. 分发饼干 - 力扣(LeetCode) 描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[…

android 控制台输出 缺失

问题 android 控制台输出内容缺失 详细问题 笔者进行android开发,期望控制台打印Log日志或是输出内容 Log.i("tag","content");或 System.out.println("content")但是实际上,上述内容并没有按照笔者期望打印 解决方…

【sgSearch】自定义组件:常用搜索栏筛选框组件(包括表格高度变化兼容)。

sgSearch源码 <template><div :class"$options.name" :expand"expandSearch" :showCollapseBtn"showCollapseBtn"><!-- v-clickoutside"(d) > (expandSearch false)" --><ul class"search-list"&…