UnityShader玉石效果

效果:

代码:

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
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java实现多级目录树(递归实现)

一.应用场景 有时候需要我们后台给前台传树结构的数据,要怎么查询? 怎么返回数据呢? 二.数据库表设计以及数据内容(以部门举例) id 主键 parent_id 父级部门id depart_name 部门名词 sort 部门排序三.实体类 Data public…

Qt 软件封装与打包

1. Qt 软件封装 1、首先以 release 方式进行编译,将生成的 CloudOne.exe 文件复制到 D:\CloudApp 文件夹(自行创建) 2、打开 Qt 命令行工具(如下图所示),并按顺序输入如下指令 cd D:\CloudApp windeployq…

Spring Boot 笔记 019 创建接口_文件上传

1.1 创建阿里OSS bucket OSS Java SDK 兼容性和示例代码_对象存储(OSS)-阿里云帮助中心 (aliyun.com) 1.2 编写工具类 package com.geji.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun…

每日一题——数字翻转

题目; 这道题看似是很简单的回文数 实则就是很简单的回文数 但是需要注意的一点是负数 可以在开头就进行判断&#xff0c;如果N<0的话就令N-N&#xff0c;将所有数都转成正数就好办了 上代码&#xff1a; #include <iostream> #include<string> #include<…

算法沉淀——哈希算法(leetcode真题剖析)

算法沉淀——哈希算法 01.两数之和02.判定是否互为字符重排03.存在重复元素04.存在重复元素 II05.字母异位词分组 哈希算法&#xff08;Hash Algorithm&#xff09;是一种将任意长度的输入&#xff08;也称为消息&#xff09;映射为固定长度的输出的算法。这个输出通常称为哈希…

Spring Security学习(四)——登陆认证(包括自定义登录页)

前言 和前面的文章隔了很长时间才更新Spring Security系列&#xff0c;主要原因一个是之前太忙了&#xff0c;把项目都忙完了&#xff0c;赶上春节假期&#xff0c;就慢慢研究。Spring Security的体系非常复杂&#xff0c;一口吃不了热豆腐&#xff0c;没办法速成&#xff0c;…

微服务—ES数据同步

目录 数据同步 问题分析 方案1. 同步调用 方案2. 异步通知 方案3. 监听binlog​编辑 各方案对比 案例——利用MQ实现数据同步 步骤1. 导入hotel-admin项目 步骤2. 声明交换机、队列 步骤3. 发送MQ消息 步骤4. 接收MQ消息 步骤5. 测试同步功能 数据同步 elasticsea…

八、键盘响应

之前博文格式已经固定&#xff0c;这里就不在赘述了&#xff0c;直接把核心代码进行解释一下即可&#xff0c;仅作为小笔记而已 项目实现功能&#xff1a; 按下键盘0&#xff0c;显示原始图像 按下键盘1&#xff0c;显示原始图像的灰度图 按下键盘2&#xff0c;显示原始图像的…

Python-To-Do-List

今天跟着油管学习创建了简单的代办事项列表应用程序&#xff0c;使用了python的tkinter库来制作图形用户界面&#xff08;GUI&#xff09; 1. 导入tkinter库 python Copy code import tkinter from tkinter import * 这两行导入了tkinter模块&#xff0c;它是Python的标准GUI库…

六、Redis之数据持久化及高频面试题

6.1 数据持久化 官网文档地址&#xff1a;https://redis.io/docs/manual/persistence/ Redis提供了主要提供了 2 种不同形式的持久化方式&#xff1a; RDB&#xff08;Redis数据库&#xff09;&#xff1a;RDB 持久性以指定的时间间隔执行数据集的时间点快照。AOF&#xff0…

django CBV 与 DRF APIView源码分析

django CBV源码分析 在django框架中&#xff0c;视图层中的逻辑即可以使用函数处理也可以使用类进行处理&#xff0c;如果在视图层中使用函数处理请求&#xff0c;就是FBV(function base views)&#xff0c;如果在视图层中使用类处理请求&#xff0c;就是CBV(class base views…

微信,支付宝在线换钱平台系统源码

探索全新、全开源的在线换钱系统源码&#xff0c;它将以前所未有的方式改变您的支付体验。我们为您精心打造了一个集简单易用与安全高效于一身的优质产品&#xff0c;它采用最新的技术开发&#xff0c;为您带来前所未有的便捷与安心。 这款在线换钱系统源码设计直观&#xff0…

【大数据Hive】hive 表设计常用优化策略

目录 一、前言 二、hive 普通表查询原理 2.1 操作演示说明 2.1.1 创建一张表&#xff0c;并加载数据 2.1.2 统计3月24号的登录人数 2.1.3 查询原理过程总结 2.2 普通表结构带来的问题 三、hive分区表设计 3.1 区表结构 - 分区设计思想 3.2 操作演示 3.2.1 创建分区表…

每日一题(数字颠倒,单词倒排)

数字颠倒_牛客题霸_牛客网 (nowcoder.com) #include <stdio.h>int main() {char arr[100];gets(arr);int lenstrlen(arr);for(int ilen-1;i>0;i--){printf("%c",arr[i]);}return 0; } 单词倒排_牛客题霸_牛客网 (nowcoder.com) #include <stdio.h> #…

《Java 简易速速上手小册》第4章:Java 中的异常处理(2024 最新版)

文章目录 4.1 异常类型和错误 - 遇见你的小怪兽4.1.1 基础知识4.1.2 重点案例&#xff1a;文件读取处理4.1.3 拓展案例 1&#xff1a;处理空指针异常4.1.4 拓展案例 2&#xff1a;捕获多个异常 4.2 异常处理机制 - 穿上你的超级英雄斗篷4.2.1 基础知识4.2.2 重点案例&#xff1…

Vuex 模块的详解

Vuex 模块是将 store 分割成多个模块的一种方式&#xff0c;每个模块都有自己的状态、mutations、actions 和 getters。这有助于更好地组织和管理应用程序的状态。 创建模块&#xff1a; 首先&#xff0c;需要创建一个模块。可以在 store 中定义一个新的模块对象&#xff0c…

python小项目----多重剪切板

代码&#xff1a; import shelve,pyperclip,sysimport mcbmcbShelfshelve.open(mcb)# 保存剪切板内容 if len(sys.argv)3 and sys.argv[1].lower()save:#剪切板的内容保存到第三个参数中mcbShelf[sys.argv[2]]pyperclip.paste()print("你的剪切板中的内容将被保存到mcbSh…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月14日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月14日 星期三 农历正月初五 1、 第十四届全国冬季运动会将于17日开幕&#xff0c;部分赛事今天起陆续开赛。 2、 2024年购房政策将进一步宽松&#xff0c;专家称今年买房性价比更高。 3、 春节档票房突破45亿元&#…

算法学习——LeetCode力扣回溯篇2

算法学习——LeetCode力扣回溯篇2 40. 组合总和 II 40. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字…

(二)【Jmeter】专栏实战项目靶场drupal部署

该专栏后续实战示例&#xff0c;都以该篇部署的项目展开操作。 前置条件 参考“&#xff08;一&#xff09;【Jmeter】JDK及Jmeter的安装部署及简单配置” 安装部署Jmeter&#xff0c;从文章最后下载“Postman、Rancher.ova、VirtualBox-7.0.12-159484-Win.exe、Xshell-7.0.01…