unityshader 消融效果

2023-10-28

代码,讲解都在注释上面了:
冯乐乐的《unity shader 入门精要》:
相关知识:

  • 透明度
  • 阴影计算
  • 普通光照
  • 法线贴图
Properties
	{
		_BurnAmount("BurnAmount",Range(0,1)) = 0
		_LineWidth("LineWidth",Range(0,0.2)) = 0.1
		_MainTex("MainTex",2D) = "white"{}
		_BumpMap("BumpMap",2D) = "white"{}
		_BumpFirstColor("BumpFirstColor",Color) = (1,1,1,1)
		_BumpSencondColor("BumpSencondColor",Color) = (1,1,1,1)
		_BurnMap("BurnMap",2D) = "white"{}
	}
	SubShader
	{
		pass {
				Tags{"LightMode" = "ForwardBase"}
				Cull Off
				//cg语言开始编写
				CGPROGRAM

				//片段程序
				#pragma fragment frag
				#pragma multi_compile_fwdbase

				struct Output {
						float4 pos:POSITION;
						float2 uvMainTex:TEXCOORD0;
						float2 uvBumpMap:TEXCOORD1;
						float2 uvBurnMap:TEXCOORD2;
						float3 lightDir:TEXCOORD3;
						float3 worldPos:TEXCOORD4;
						//阴影
						SHADOW_COORDS(5)
				};
				Output vert(Input v)
				{
					Output o;
					o.pos = UnityObjectToClipPos(v.vertex);
					o.uvMainTex = TRANSFORM_TEX(v.uv, _MainTex);
					o.uvBumpMap = TRANSFORM_TEX(v.uv, _BumpMap);
					o.uvBurnMap = TRANSFORM_TEX(v.uv, _BurnMap);
					//切线空间转换rotation
					TANGENT_SPACE_ROTATION;
					o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
					o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
					//阴影计算
					TRANSFER_SHADOW(o);
					return o;
				}
				fixed4 frag(Output i) :SV_Target
				{
					fixed4 burn = tex2D(_BurnMap,i.uvBurnMap);
					//为了全部剪除,需要对burn.a - _BurnAmount进行差值判断
					float val = burn.a - _BurnAmount < 0.01 ? -1 : burn.a - _BurnAmount;
					//裁剪
					clip(val);
					//采样物体本身纹理图
					float3 albedo = tex2D(_MainTex, i.uvMainTex).xyz;

					//计算切线空间数据
					float3 tangentLight = normalize(i.lightDir);
					float3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uvBumpMap));
					//环境光
					fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
					//切线空间下的漫反射,也可以自己添加镜面高光,为了法线贴图
					fixed3 diff = _LightColor0.rgb*albedo*max(0, dot(tangentLight, tangentNormal));

					//裁剪边缘的颜色区域宽度
					fixed t = 1 - smoothstep(0, _LineWidth, burn.a - _BurnAmount);
					fixed3 burnColor = lerp(_BumpFirstColor, _BumpSencondColor, t);
					burnColor = pow(burnColor, 5);

					//阴影计算atten
					UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);

					fixed3 finalColor = lerp(ambient + diff * atten, burnColor, t*step(0.0001, _BurnAmount));

					return fixed4(finalColor, 1);
				}
				ENDCG
		}
		//可以试着将这个pass注释掉,看效果,会发现阴影没有随着裁剪而变化
		pass{
			
		Tags{"LightMode" = "ShadowCaster"}
			//cg语言开始编写
			CGPROGRAM

			//片段程序
			#pragma fragment frag
			#pragma multi_compile_shadowcaster
			struct Output {
				V2F_SHADOW_CASTER;
				float2 uvBurnMap:TEXCOORD2;
			};
			Output vert(Input v)
			{
				Output o;
				TRANSFER_SHADOW_CASTER_NORMALOFFSET(o);
				o.uvBurnMap = TRANSFORM_TEX(v.uv, _BurnMap);
				return o;
			}
			fixed4 frag(Output i) :SV_Target
			{	
				fixed4 burn = tex2D(_BurnMap,i.uvBurnMap);
				float val = burn.a - _BurnAmount < 0.01 ? -1 : burn.a - _BurnAmount;
				clip(val);
				SHADOW_CASTER_FRAGMENT(i)//投射阴影
			}
			ENDCG
		}

			CGINCLUDE

				//在逻辑中申明顶点和片段://编译申明函数
				//顶点程序
				#pragma vertex vert
				#include "Lighting.cginc"
				#include "AutoLight.cginc"
				#include "UnityCG.cginc"
				struct Input {
					float4 vertex:POSITION;
					float2 uv:TEXCOORD0;
					float3 normal:NORMAL;
					float4 tangent:TANGENT;
				};
				
				sampler2D _MainTex;
				float4 _MainTex_ST;
				sampler2D _BumpMap;
				float4 _BumpMap_ST;
				sampler2D _BurnMap;
				float4 _BurnMap_ST;

				float _BurnAmount;
				float _LineWidth;
				float4 _BumpFirstColor;
				float4 _BumpSencondColor;
				
			ENDCG

	}
	 FallBack "Specular"//影子

效果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unityshader 消融效果 的相关文章

  • 移动物体的漫射照明

    当计算移动物体的漫射照明时 我必须将光源与物体本身一起移动 Override public void draw draw frame Move object GLES20 glVertexAttribPointer aPositionLin
  • QML 将纹理应用于网格

    我正在尝试将图像纹理应用到 QML Qt 5 6 2 中的网格 我从示例 Shadow Map QML 开始 我想对 GroundPlane 进行纹理处理 材质和效果 qml 类应用于该 GroundPlane 网格 但我看不到如何应用图像
  • OpenGL 二进制程序格式是否标准化?

    我一直在谷歌上搜索 OpenGL 二进制格式及其实际含义 到目前为止我还没有取得太大的成功 我知道我可以按如下方式获取数量和格式集 glGetIntegerv GL PROGRAM BINARY FORMATS values 0 其中 va
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 用于几何入口点的 SceneKit 着色器修改器适用于 iOS,但不适用于 OS X

    我正处于制作 SceneKit 着色器修改器 用于几何入口点 的早期阶段 该修改器根据高度图纹理置换平面的几何形状 计划是用它来创建地形 在 iOS 编辑 iOS 模拟器 中 着色器按其应有的方式工作 但会将此警告打印到控制台 SceneK
  • Qt3D默认制服和属性

    我开始学习通过 QML 使用着色器 但找不到任何讨论传递给着色器的默认统一和属性值的参考资料 在某些示例中 我们可以看到其中的几个 例如顶点位置 or 模型视图投影 这也被传递为mvp 但是没有包含我们可以使用的所有变量的清晰列表 在调查
  • 使用GL着色器语言的相机帧yuv到rgb转换

    我从字节数组中的 android 相机预览回调获取相机帧并将其传递给 jni 代码 由于我们不能在 C 中使用字节 因此我将其转换为整数数组 如下所示 JNIEXPORT void JNICALL Java com omobio armad
  • 尝试制定一种算法,将图像附加到该主题

    我实际上正在尝试制作一种看起来像三次贝塞尔曲线的算法 但我想知道是否有更简单的解决方案 这就是我想要的 该图的长度为 1 高度为 1 红线是我的实际输入 黄点是给定的参数 我们可以称之为 扭曲 介于 0 和 1 之间 绿线就是我想要的结果
  • 为什么我不能使用uniform1f而不是uniform4f来设置vec4制服?

    我通过以下方式逐步学习WebGL这本书 https sites google com site webglbook 我尝试通过使用缓冲区来绘制三个点 gl ARRAY BUFFER 而不是循环 正如我之前在本书的其他示例中所做的那样 var
  • OpenGL 定向光着色器

    我想使用 OpenGL 和 GLSL 将定向光添加到我的场景中 问题在于 理论上正确的方法会产生错误的结果 在顶点着色器中我执行以下操作 光线的方向以世界坐标给出 并使用 viewMatrix 转换为相机坐标 使用法线矩阵将顶点的法线转换为
  • GLSL 纹理立方体和纹理2D 在同一着色器中

    我似乎无法两者兼得texture2D and textureCube 在一个着色器中 当我这样做时 什么也没有显示 也没有错误 我用我自己的着色器加载器和 Apple GLSL 着色器生成器尝试了这一点 并且发生了同样的事情 即使我有也会发
  • 使用着色器创建模糊过滤器 - 从片段着色器访问相邻像素?

    我想使用 OpenGL ES 2 0 中的片段着色器创建模糊效果 我感兴趣的算法只是一个平均模糊 将所有相邻像素添加到我自己中并除以 9 进行标准化 但是我有两个问题 1 这是否需要我首先渲染到帧缓冲区 然后切换渲染目标 或者有更简单的方法
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • 如何使用鼠标改变OpenGL相机

    我正在尝试在 OpenGL 中设置一个相机来查看 3 维中的一些点 为了实现这一点 我不想使用旧的 固定的功能样式 glMatrixMode glTranslate 等 而是自己设置模型视图投影矩阵并在我的顶点着色器中使用它 正交投影就足够
  • 如何在 WebGL 中创建合适的圆角矩形?

    我试图实现答案这个问题 https stackoverflow com questions 43970170 bordered rounded rectangle in glsl但似乎有点问题 如果您打开他们的 ShaderToys 并尝试
  • 编写每个三角形/面具有纯色的 GLSL 片段着色器的方法

    我有顶点和三角形数据 其中包含每个数据的颜色triangle 面 不是每个顶点 即单个顶点由多个面共享 每个面可能具有不同的颜色 我应该如何在 GLSL 中解决这个问题以获得每个的纯色分配face正在渲染 通过平均顶点相邻多边形的颜色来计算
  • 如何使着色器淡入某种颜色?

    这是我当前使用的着色器 它通过缓慢降低不透明度来淡化对象 我想褪成紫色 如何才能做到这一点 着色器 frag uniform sampler2D texture uniform float opacity void main vec4 pi
  • 对 VBO 中的特定三角形使用不同的纹理

    我有 9 个由三角形组成的四边形 如下所示 我在用着VBO存储有关它们的数据 它们的位置和纹理坐标 我的问题是 是否可以仅使用一个来使四边形 5 具有与其余四边形不同的纹理VBO and shader 绿色代表纹理 1 黄色代表纹理 2 到
  • Phong 着色问题

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更

随机推荐

  • javaScript基础面试题 --- == 与 ===有什么不同?

    与 有什么不同 比较的是数值 通过ValueOf方法做隐式转换 比较的是数据类型 和 数值 全部都是true console log 1 1 true console log true 1 true console log null und
  • openwrt中添加自定义驱动模块

    1 make menuconfig中的 kernel modules 其中的各个配置选项来自于下面目录中的 mk文件 root localhost openwrt openwrt trunk package kernel linux mod
  • vs2017 配置cuda 项目

    在这里记录一下 我用vs2017配置cuda项目过程中的种种问题 具体总结归类可分为如下几个步骤 一 增加 cu源码拓展类型 打开VS 依次打开 工具 选项 文本编辑器 文件拓展名 新增扩展名 cu 编辑器 Microsoft Visual
  • Windows Server 2008 R2 CVE-2012-0002/CVE-2012-0152 漏洞处理

    CVE 2012 0002 CVE 2012 0152 漏洞处理 发现漏洞 补丁信息查找 过程示例 下载补丁 补丁安装 漏洞处理结束 发现漏洞 通过nmap扫描windows server 发现上述 CVE 2012 002 CVE 201
  • Box2d学习笔记五:API学习之b2World

    以前做Android开发 每次需要查文档的时候 某个类某个方法 我就情不自禁的会把相关的方法全部看一遍 有些没用过的就猜它的意思 然后测试 我觉得这样的学习方法能快速的了解API 了解该类能完成的功能 所以按照我的惯例 学习box2d我也是
  • JDBC链接Access数据库

    JDBC链接Access数据库 1 新建Access数据库 mdb1 mdb 新建表 user 2 通过JDBC ODBC桥接器链接 首先设置odbc数据源 具体步骤为 打开控制面板 控制面板 gt 管理工具 gt 数据源 ODBC 打开数
  • ImportError: libGL.so.1: cannot open shared object file: No such file or directory缺少共享库

    原因 缺少共享库 解决方法 1 centos 1 yum install mesa libGL x86 64 测试可用 2 查到的方法 没有测试过 2 Ubuntu sudo apt update sudo apt install libg
  • ubuntu安装WPS2019以及解决缺少字体问题

    环境 ubuntu22 04 2 LTS 步骤 1 去官网下载最新的WPS 官网地址如下 WPS Office 2019 for Linux 支持多版本下载 WPS官方网站 2 sudo dpkg i 安装包 deb 3 安装完成 首次用W
  • FFmpeg 视频处理入门教程(转)

    FFmpeg 视频处理入门教程 阮一峰 FFmpeg 是视频处理最常用的开源软件 它功能强大 用途广泛 大量用于视频网站和商业软件 比如 Youtube 和 iTunes 也是许多音频和视频格式的标准编码 解码实现 FFmpeg 本身是一个
  • 一步一步学习Android TV/盒子开发(一)

    写在前面的话 本人做了几年的机顶盒和Android电视上的应用开发 写这些文章只是为了让初次接触大屏开发的同学能够快速上手 TV端因为没有触控操作 只有遥控操作 所以焦点处理 控制以及按键监听是其主要特点 焦点处理 设置可获取焦点 布局中需
  • pytorch量化中torch.quantize_per_tensor()函数参数详解

    torch quantize per tensor input scale zero point dtype 实现8位量化 摘要 对该函数各个参数的分析 量化 计算机运算时 默认32位浮点数 若将32位浮点数 变成8位定点数 会快很多 目前
  • Node.js 学习(二) 创建第一个应用

    如果我们使用PHP来编写后端的代码时 需要Apache 或者 Nginx 的HTTP 服务器 并配上 mod php5 模块和php cgi 从这个角度看 整个 接收 HTTP 请求并提供 Web 页面 的需求根本不需 要 PHP 来处理
  • 信息化建设第三方验收测试报告要求

    信息化建设是企业未来高质量发展的必由之路 也是企业法治的必要手段 信息化建设指品牌利用现代信息技术来支撑品牌管理的手段和过程 随着计算机技术 网络技术和通信技术的发展和应用 企业信息化已成为品牌实现可持续化发展和提高市场竞争力的重要保障 信
  • Html+css(第二天)

    1 列表标签 场景 在网页中按照行展示关联性的内容 如 新闻列表 排行榜 账单等 特点 按照行的方式 整齐显示内容 种类 无序列表 有序列表 自定义列表 1 1 无序列表 场景 在网页中表示一组无顺序之分的列表 如 新闻列表 特点 列表的每
  • kubernetes集群部署springcloud项目【AL】

    kubernetes集群部署springcloud项目 AL 先手工做 非自动化 环境 192 168 73 138 master 192 168 73 139 node1 192 168 73 140 node2 192 168 73 1
  • 修改tomcat catalina.bat调整jvm内存及tomcat窗口标题

    开发这么久了 总会时不时碰到内存溢出的错误 知道应该去 catalina 中去设置一下jvm的内存大小 可是每次都忘记具体在哪个位置 而且 很多时候 出现内存溢出的环境都不是本机 而是服务器搭建环境的时候 而此时也没太多时间让自己去读一下
  • 一道模拟赛的题

    前言 这是一个不错的题啊 在这里记录一下 题意 听说不是原创题 那我就放上来了 应该没有关系吧QAQ 有一个 n m 的地图 地图上的每一个位置可以是空地 炮塔或是敌人 你需要操纵炮塔消灭敌人 对于每个炮塔都有一个它可以瞄准的方向 你需要在
  • 怎么将服务器上的文件变成共享文件,服务器上文件夹怎么共享

    服务器上文件夹怎么共享 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 CPH服务提供云手机批量控制功能 该功能可以通过A
  • 并发下的Map常见面试题

    HashMap 和 HashTable 有什么区别 java中的另一个线程安全的与HashMap极其类似的类是什么 同样是线程安全 它与HashTable在线程同步上有什么不同 HashMap 与 ConcurrentHashMap的区别
  • unityshader 消融效果

    代码 讲解都在注释上面了 冯乐乐的 unity shader 入门精要 相关知识 透明度 阴影计算 普通光照 法线贴图 Properties BurnAmount BurnAmount Range 0 1 0 LineWidth LineW