当前位置:网站首页>Refract-折射
Refract-折射
2022-08-09 00:08:00 【ThomasQxx】
斯涅尔定律-Snell’s Law :n1 * Sin a = n2 * Sin b,n1 和 n2就是两个物体的折射比,a = 入射角 b = 反射角 移动 :n1 / n2 = sin b / sin a = 透射比。
Shader "QShader/Refract"{
Properties{
_BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0)
_RefractColor("Refract Color",Color) = (1.0,1.0,1.0,1.0)
_RefractAmount("Refract Amount",Range(0,1)) = 1.0
//透射比不能等于0
_RefractRatio("Refract Ratio",Range(0.1,1)) = 0.5
_RefractTex("Refract Texture",Cube) = "skybox"{
}
}
SubShader{
pass {
Tags{
"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex Vertex
#pragma fragment Fragment
#include "Lighting.cginc"
#include "AutoLight.cginc"
struct a2v {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float3 worldPos : TEXCOORD0;
float3 worldNormal : TEXCOORD1;
float3 worldViewDir : TEXCOORD2;
float2 uv : TEXCOORD3;
float3 worldRefractDir : TEXCOORD4;
//SHADOW_COORDS 声明了一个名为_ShadowCoord的阴影纹理坐标变量。
//它的作用是声明一个用于对阴影纹理采样的uv坐标。一般用于片元着色器的输入结构体中,
//而且这个宏的参数需要是下一个可用插值寄存器的索引值,这里是5。
SHADOW_COORDS(5)
};
fixed4 _BaseColor;
fixed4 _RefractColor;
float _RefractAmount;
float _RefractRatio;
samplerCUBE _RefractTex;
v2f Vertex(a2v v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.uv = v.texcoord;
o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);
//计算折射向量
o.worldRefractDir = refract(normalize(o.worldViewDir),normalize(o.worldNormal),_RefractRatio);
TRANSFER_SHADOW(o)
return o;
}
fixed4 Fragment(v2f i) :SV_TARGET{
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _BaseColor.xyz;
fixed3 diffuse = _LightColor0.xyz * _BaseColor.xyz * saturate(dot(worldNormal,lightDir));
//通过折射向量对CubeMap进行采用
fixed3 refraction = texCUBE(_RefractTex,i.worldRefractDir) * _RefractColor.xyz;
UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
return fixed4(ambient + lerp(diffuse,refraction,_RefractAmount) * atten,1.0);
}
ENDCG
}
}
}
边栏推荐
- 北京信息科技大学第十三届程序设计竞赛暨ACM选拔赛(重现赛)
- Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [33,755] milliseco
- C# 如何关联键盘按钮 (KeyChar/KeyCode值 KeyPress/KeyDown事件 区别)
- NOR flash和NAND flash的区别
- WeChat applet console error - summary 】 【
- 蓝牙模块HC-08——连接
- STM32的HAL库初体会
- 几种常见的开源软件许可协议(GPL, LGPL, Apache License, BSD)
- 为什么依赖注入出现的频率这么高?
- 穿越派·派盘+KeePass = 最安全的私人密码管理方案
猜你喜欢
随机推荐
Task19_14_最长公共前缀
工作中经常遇到的232、485、TTL信号
ResNet 6大变体对比
Ubuntu下Docker安装Mysql (快速简便)
记一次“粗暴”的Flash模拟EEPROM法(用的STM32F030C6芯片,没找到模拟EEPROM库函数)
第五章 数据链路层与局域网
穿越派·派盘 + OmniFocus = 私人项目管理库
GRPC学习(An RPC library and framework)
关于在core中使用minio对象存储
WeChat applet console error - summary 】 【
Mysql Workbench导出sql文件出错:Error executing task: ‘ascii‘ codec can‘t decode byte 0xd0 in position 26:
第五章 数据库编程
pc端电脑屏幕常见尺寸
VsCode配置自己喜欢的字体,背景,妈妈再也不担心我写代码枯燥了
C# ToString
C#在控制台应用程序中显示输出字节型数据
LeetCode 0179. 最大数
Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [33,755] milliseco
Mysql Workbench用.sql文件将数据导入数据库
如何下载安装穿越派V3.14版本?