Unity shader之金属质感衣服
一套QQ飞车的衣服,模仿其效果写的shader,效果如下:

部分shader如下:
Shader "qq/Cloth"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_NormalMap("Normal Map", 2D) = "bump" {}
_AlphaTex("Alpha", 2D) = "white" {} _SpecularColor ("Specular Color", Color) = (,,,) _Cubemap("Cubemap", Cube) = "" {}
_HighLightMask ("High Light Mask", 2D) = "white" {}
} SubShader
{
Tags
{
"Queue" = "Geometry"
"IgnoreProjector" = "True"
"RenderType" = "Geometry"
}
LOD // 裙子的不透明区域
Pass
{
Tags
{
"LightMode" = "ForwardBase"
} Cull Off CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase #include "UnityCG.cginc"
#include "AutoLight.cginc"
#include "Lighting.cginc" sampler2D _MainTex;
sampler2D _NormalMap;
sampler2D _AlphaTex;
fixed4 _SpecularColor;
samplerCUBE _Cubemap;
sampler2D _HighLightMask; struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
float4 tangent : TANGENT;
}; struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 T2W1 : TEXCOORD1;
float4 T2W2 : TEXCOORD2;
float4 T2W3 : TEXCOORD3;
}; v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.uv; float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
float3 worldNormal = UnityObjectToWorldNormal(v.normal);
float3 binormal = cross(normalize(worldNormal), normalize(worldTangent)) * v.tangent.w;
float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.T2W1 = float4(worldTangent.x, binormal.x, worldNormal.x, worldPos.x);
o.T2W2 = float4(worldTangent.y, binormal.y, worldNormal.y, worldPos.y);
o.T2W3 = float4(worldTangent.z, binormal.z, worldNormal.z, worldPos.z);
return o;
} fixed4 frag(v2f i) : SV_TARGET
{
fixed4 albedo = tex2D(_MainTex, i.uv);
fixed3 alphaCol = tex2D(_AlphaTex, i.uv);
fixed alpha = alphaCol.g; float3 worldPos = float3(i.T2W1.w, i.T2W2.w, i.T2W3.w);
fixed3 worldView = normalize(UnityWorldSpaceViewDir(worldPos)); float3 tangentNormal = UnpackNormal(tex2D(_NormalMap, i.uv));
float3x3 tanToWorld = float3x3(i.T2W1.xyz, i.T2W2.xyz, i.T2W3.xyz);
float3 worldNormal = normalize(mul(tanToWorld, tangentNormal)); fixed3 ambient = albedo.xyz * UNITY_LIGHTMODEL_AMBIENT.xyz; // 漫反射 半兰伯特光照模型
fixed3 worldLight = worldView;
//float dotLN = dot(worldLight, worldNormal) * 0.5 + 0.5;
float dotLN = dot(worldLight, worldNormal) * 0.25 + 0.75; // [-1, 1] -> [0.5, 1]
fixed3 diffuse = albedo.xyz * _LightColor0.xyz * dotLN; // 金边
float3 refDir = reflect(-worldView, worldNormal);
fixed3 refCol = texCUBE(_Cubemap, refDir);
fixed3 maskCol = tex2D(_HighLightMask, i.uv);
diffuse = diffuse * ( + refCol.r * maskCol.r * * ( - alphaCol.r)); // 高光
fixed3 realWorldLight = normalize(UnityWorldSpaceLightDir(worldPos));
fixed3 halfDir = normalize(worldView + realWorldLight);
float specD = abs(dot(halfDir, worldNormal));
fixed3 specular = albedo.xyz * _SpecularColor * pow(specD, ); clip(alpha - 0.95);
fixed4 col = fixed4(ambient + diffuse + specular, alpha); return col;
} ENDCG
} // 裙子的半透明区域
Pass
{
Tags
{
"LightMode" = "ForwardBase"
}
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Cull Off CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase #include "UnityCG.cginc"
#include "AutoLight.cginc"
#include "Lighting.cginc" sampler2D _MainTex;
sampler2D _AlphaTex; struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
}; v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
} fixed4 frag(v2f i) : SV_TARGET
{
fixed4 albedo = tex2D(_MainTex, i.uv);
fixed3 alphaCol = tex2D(_AlphaTex, i.uv);
fixed alpha = alphaCol.g;
clip(0.95 - alpha);
fixed4 col = fixed4(albedo.rgb, alpha);
return col;
} ENDCG
} } Fallback "Diffuse"
}
cloth

转载请注明出处:https://www.cnblogs.com/jietian331/p/10830238.html
Unity shader之金属质感衣服的更多相关文章
- Unity Shader入门精要学习笔记 - 第10章 高级纹理
转载自 冯乐乐的 <Unity Shader入门精要> 立方体纹理 在图形学中,立方体纹理是环境映射的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层 ...
- 【Unity Shader】Unity Chan的卡通材质
写在前面 时隔两个月我终于来更新博客了,之前一直在学东西,做一些项目,感觉没什么可以分享的就一直没写.本来之前打算写云彩渲染或是Compute Shader的,觉得时间比较长所以打算先写个简单的. 今 ...
- Unity3D学习(六):《Unity Shader入门精要》——Unity的基础光照
前言 光学中,我们是用辐射度来量化光. 光照按照不同的散射方向分为:漫反射(diffuse)和高光反射(specular).高光反射描述物体是如何反射光线的,漫反射则表示有多少光线会被折射.吸收和散射 ...
- 小强学渲染之Unity Shader编程HelloWorld
第一个简单的顶点vert/片元frag着色器 1)打开Unity 5.6编辑器,新建一个场景后ctrl+s保存命名为Scene_5.默认创建的场景是包含了一摄像机,一平行光,且场景背景是一天空盒而 ...
- 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现
[Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...
- Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)
关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...
- 【转】《Unity Shader入门精要》冯乐乐著 书中彩图
为方便个人手机学习时候查阅,从网上转来这些彩图. 如属过当行为,联系本人删除. 勘错表 http://candycat1992.github.io/unity_shaders_book/unity_s ...
- Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘
转自 冯乐乐的<Unity Shader 入门精要> 2010年的Unity 3 中,Surface Shader 出现了. 表面着色器的一个例子. 我们先做如下准备工作. 1)新建一个场 ...
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
随机推荐
- sql 投影查询
使用SELECT * FROM <表名> WHERE <条件>可以选出表中的若干条记录.我们注意到返回的二维表结构和原表是相同的,即结果集的所有列与原表的所有列都一一对应. 如 ...
- 状态压缩dp增量统计贡献——cf1238E(好题)
这题的状态设计非常巧妙,因为dp[S]表示的并非当前正确的值,而是维护一个中间量,这个中间量在到达末状态时才正确 当然官方的题解其实更加直观,只不过理解起来其实有点困难 /* 给定一个串s,字符集为2 ...
- NX二次开发-Block UI C++界面Object Color Picker(对象颜色拾取器)控件的获取(持续补充)
Object Color Picker(对象颜色拾取器)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_obj.h> UF_init ...
- python re.findall 使用
python re.findall 使用 import re #\w 匹配字母数字及下划线 print(re.findall('\w','hello alan _god !@^&#^$^!*& ...
- PAT_A1070#Mooncake
Source: PAT A1070 Mooncake (25 分) Description: Mooncake is a Chinese bakery product traditionally ea ...
- img路径错误时,用户友好图片
img 标签的属性里面添加 onerror="this.src='error友好图片'" 就可以了!
- POJ 1673 EXOCENTER OF A TRIANGLE(解三角形重心)
题目链接:http://poj.org/problem?id=1673 AC代码: #include<cstdio> #include<cmath> #include<a ...
- pytest_按标记执行
import pytest@pytest.mark.webtestdef test_send_http(): pass @pytest.mark.apptestdef test_devide(): p ...
- python_django_urls基础配置
url配置:请求地址与views函数的匹配 首先,指定根级url配置文件,默认为setting.py中的ROOT_URLCONF='项目名.urls'(俺们也不用去修改啥) 我们urls有两个,一个是 ...
- js实现截取字符串后几位
var strs ="wdsdabcdefages" strs.substring(obj.filename.lastIndexOf("a")+1,strs.l ...