注意点:
1.法线的归一化 normalize (如果shader光照效果怪怪的,请查看是否归一化)
2.在计算自发光emission 直接使用的normal : appdata 中的normal 转到世界空间中的normal。emission跟光照没有关系,不受光照的影响(不是所有的地方都有自发光:添加emissionMask)
3.在计算直接光照效果 diffuse 和specular的时候, 用切线空间转换到世界空间中的法线
4.AO贴图: 只作用在 间接光照中 : Indirectlight中的 diffuse 和specular
用AO来限制他们的亮度
5.用一张图的 rgba四个通道来存储相应的遮罩等值

下面是实现代码:

Shader "FishMan/12_AOE"
{Properties{_MainTex ("Texture", 2D) = "white" {}_BumpMap ("Normal Map", 2D) = "bump"{}_Metallic_AO_MASK_Smoothness("_Metallic_AO_MASK_Smoothness", 2D) = "white" {}[HDR]_FresnelColor("FresnelColor", Color) = (0,0,0,0)_FresnelPower("FresnelPower", Range( 0 , 30)) = 0.8_FresnelScale("FresnelScale", Range( 0 , 1)) = 1}SubShader{Pass{Tags { "RenderType"="Opaque" "LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 3.0           #define _FORWADR_BASE#pragma multi_compile_fwdbase#pragma multi_compile_fog#include "../ExampleLibs/12_AOEimission.cginc"  ENDCG }Pass{Tags { "RenderType"="Opaque" "LightMode" = "ForwardAdd" }Blend One OneZWrite OffCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdadd#pragma multi_compile_fog#pragma target 3.0 #include "../ExampleLibs/12_AOEimission.cginc" ENDCG}Pass{Tags {"LightMode"="ShadowCaster"}CGPROGRAM#pragma vertex vertShadowCaster#pragma fragment fragShadowCaster#pragma multi_compile_shadowcaster#include "../../ShaderLibs/Shadow.cginc" ENDCG}}
}
#ifndef FMST02_AO_EIMISSION
#define FMST02_AO_EIMISSION#include "UnityCG.cginc"
#include "UnityPBSLighting.cginc" // PBS
#include "AutoLight.cginc"struct appdata
{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;float4 tangent : TANGENT;
};struct v2f
{float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float3 normal : TEXCOORD1;float3 worldPos: TEXCOORD2;#if defined(VERTEXLIGHT_ON)float3 vertexLightColor : TEXCOORD3;#endifSHADOW_COORDS(4) UNITY_FOG_COORDS(5) // 8 float3 T2WRow0 : TEXCOORD6;float3 T2WRow1 : TEXCOORD7;float3 T2WRow2 : TEXCOORD8;
};sampler2D _MainTex;float4 _MainTex_ST; sampler2D _BumpMap;
sampler2D _Metallic_AO_MASK_Smoothness;float4 _FresnelColor;
float _FresnelScale;
float _FresnelPower;UnityLight CreateDirectLight(v2f i){float3 lightDir;// float attenuation = 1;#if defined(DIRECTIONAL)lightDir = _WorldSpaceLightPos0.xyz;#elsefloat3 lightVec= _WorldSpaceLightPos0.xyz - i.worldPos; lightDir = normalize(lightVec);#endifUNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPos);  UnityLight light;light.color = _LightColor0.rgb * attenuation;light.dir = lightDir;light.ndotl = saturate(dot(lightDir,i.normal));return light;
}UnityIndirect CreateIndirectLight (v2f i) {UnityIndirect indirectLight;indirectLight.diffuse = 0;indirectLight.specular = 0;
#if defined(VERTEXLIGHT_ON)indirectLight.diffuse = i.vertexLightColor;
#endif#if defined(_FORWADR_BASE)indirectLight.diffuse += max(0, ShadeSH9(float4(i.normal, 1)));
#endifreturn indirectLight;
}void CalcVertexLightColor(inout  v2f i){#if defined(VERTEXLIGHT_ON)i.vertexLightColor = Shade4PointLights(unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,unity_LightColor[0].rgb, unity_LightColor[1].rgb,unity_LightColor[2].rgb, unity_LightColor[3].rgb,unity_4LightAtten0, i.worldPos, i.normal);
#endif
}v2f vert (appdata v)
{v2f o;UNITY_INITIALIZE_OUTPUT(v2f,o);o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.normal = UnityObjectToWorldNormal(v.normal)  ;o.worldPos = mul(unity_ObjectToWorld, v.vertex);CalcVertexLightColor(o);TRANSFER_SHADOW(o)UNITY_TRANSFER_FOG(o,o.pos);fixed3 worldNormal = o.normal;fixed3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;fixed3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;o.T2WRow0 = float3( worldTangent.x, worldBinormal.x, worldNormal.x); // * tNormal.xyzo.T2WRow1 = float3( worldTangent.y, worldBinormal.y, worldNormal.y);o.T2WRow2 = float3( worldTangent.z, worldBinormal.z, worldNormal.z);return o;
}fixed4 frag (v2f i) : SV_Target
{fixed4 albedo = tex2D(_MainTex, i.uv);float3 normalVal = UnpackNormal( tex2D(_BumpMap,i.uv));fixed4 metallic_AO_MASK_Smoothness = tex2D(_Metallic_AO_MASK_Smoothness, i.uv);float metallic = metallic_AO_MASK_Smoothness.r;float smoothness = metallic_AO_MASK_Smoothness.a;float occlusion = metallic_AO_MASK_Smoothness.g ;float3 viewDir = normalize(_WorldSpaceCameraPos - i.worldPos);
#if defined(_FORWADR_BASE)float emissionMask = metallic_AO_MASK_Smoothness.b;float ndv = dot( normalize(i.normal), viewDir );float fresnel = pow(1 - ndv,_FresnelPower) * _FresnelScale ;float4 emission =  fresnel * emissionMask * _FresnelColor;
#endif  i.normal = fixed3(dot(i.T2WRow0,normalVal), dot(i.T2WRow1,normalVal), dot(i.T2WRow2,normalVal));i.normal = normalize(i.normal);float oneMinusReflectivity ;float3 specularTint;albedo.rgb = DiffuseAndSpecularFromMetallic(albedo,metallic,specularTint,oneMinusReflectivity);UnityLight light = CreateDirectLight(i);UnityIndirect indirectLight = CreateIndirectLight(i);indirectLight.diffuse *= occlusion;indirectLight.specular *= occlusion;//light.color *= occlusion;float4 col = UNITY_BRDF_PBS(albedo,specularTint,oneMinusReflectivity,smoothness,i.normal,viewDir,light,indirectLight);UNITY_APPLY_FOG(i.fogCoord, col);
#if defined(_FORWADR_BASE)col += emission;
#endif  return col;
}
#endif

附资源百度云:
链接: https://pan.baidu.com/s/1UdDCnt6uEfhy5IPNnEam5g
提取码: 9b6s

unity中使用AO贴图和自发光emission的简单应用相关推荐

  1. Unity中的法线贴图、漫反射及高光

    我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性.在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了. 我 ...

  2. unity入门精要之第6 章 Unity 中的基础光照--环境光和自发光

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.Unity 中的环境光和自发光 二.在Unity Shader 中实现漫反射光照模型 参考 前言 但这种模型有很多局限性.首先,有很 ...

  3. 【技术美术美术部分】AO贴图的烘焙及应用

    写在前面 计划完整学习AO相关,先从最直观的美术角度看看AO贴图如何烘焙及应用的,我觉得能更好的帮助我学习和理解,因此美术向的学习排在了图形学算法学习的前面.文中图片都是直接截图别人视频的内容,如有侵 ...

  4. Unity 图灵Turning 之 在Unity中实现图灵 聊天机器人 简单聊天的功能

    Unity 图灵 之 在Unity中实现图灵 聊天机器人 简单聊天的功能 目录 Unity 图灵 之 在Unity中实现图灵聊天机器人简单聊天的功能 一.简单介绍 二.图灵官网关于在线聊天机器人的接入 ...

  5. Unity Shader-Ambient Occlusion环境光遮蔽(AO贴图,GPU AO贴图烘焙,SSAO,HBAO)

    前言 十一放假很开心,正好赶上观望了了许久的<尼尔·机械纪元>打折啦.窝在家里搞了三天三夜,终于E结局通关啦!!!真的好久没玩过这么好玩的游戏了,于是乎我的废话应该会多不少,毕竟,写blo ...

  6. unity 太阳自发光_unity shader基础之——unity中实现环境光、自发光

    上篇主要讲的是unity中的光照模型及其原理,还有几种光照类型(自发光.环境光.漫反射.高光反射),后面几篇文章就开始在unity中实现这几种光照类型,本篇在unity实现自发光.环境光. 一.uni ...

  7. 【游戏开发实战】Unity Unlit ShaderGraph实现与PBR的自发光贴图类似的叠加效果

    文章目录 一.前言 二.最终效果 三.PBR ShaderGraph中的自发光 四.Unlit ShaderGraph中的自发光 1.简单的加操作实现自发光 2.优化版 一.前言 之前写过一篇文章: ...

  8. Unity中利用材质自发光实现物体闪烁效果

    Unity中利用材质自发光实现物体闪烁效果 补充:这种方法有一点问题,在测试(Windows平台)的时候发现,要想在Build出来的游戏中实现闪烁效果,就必须在 Project 窗口中将源材质的自发光 ...

  9. 在Unity中模仿游戏《江南百景图》中物体的出现效果

    在Unity中模仿游戏<江南百景图>中物体的出现效果 1. 效果 1.1. 游戏中的效果 1.2. 在Unity中模仿的效果 2. 思路 3. 实现 3.1. 图片 3.2. shader ...

最新文章

  1. pandas使用pct_change计算数据列的百分比变化、环比变化率:计算当前元素和前一个元素之间的百分比变化、使用style函数指定format的格式:百分比、缺失值替换、用颜色标注极大值和极小值
  2. 【译】如何停止使用console.log()转而使用浏览器debugger
  3. ActiveRecord使用多数据库
  4. C# 结构体与类的区别
  5. springmvc学习笔记--ueditor和springmvc的集成
  6. 面试突然问Java多线程底层原理,我哭了!
  7. NodeJs中使用jQuery?
  8. 分离了sa默认的数据库 , 用sa登录不了的解决方法
  9. EXCEL图表技巧:选择合适图表最全指南,建议收藏
  10. 军用装备温湿度循环测试,温湿度环境可靠性实验室GJB150A
  11. python人脸照片分类_Python系列之三——人脸检测、人脸识别
  12. macOS 安装 Win11 常见问题及解决方案
  13. linux-CentOS7.6操作系统安装手册
  14. 倍福PLC TwinCAT 3 基础——编程基础
  15. 用gsm模块自动收发短信
  16. CDOJ 796 DAGE(Big Brother)
  17. ecshop常见漏洞
  18. Docker 安装、使用
  19. SLF4J(六) - MDC/MDCAdapter是什么?
  20. 数据库设计之冗余、索引以及查询优化

热门文章

  1. STC12系列单片机的1T模式和12T模式
  2. 腾讯,迅雷,完美等公司的一些笔试题整理
  3. Ubuntu下彻底卸载mysql、安装mysql、及MySQLdb模块
  4. 阿里云弹性计算总经理张献涛:智能化、高效能、新交互将重塑互联网
  5. c#--XAML语言介绍
  6. 亿道信息丨12.2英寸加固平板丨三防平板丨工业平板丨货物追踪好助手
  7. 即构科技肖传发:即刻构建在线教育的音视频互动场景
  8. PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解
  9. ASP.NET中 RadioButtonList(单选按钮组)的使用
  10. 51单片机中断的调用寄存器组(PSW)的作用,以及汇编堆栈的作用,堆栈指针的SP的使用方法,RAM的运行和ROM在单片机具体运行和C语言的优势和中断,定时器基础知识(上)