菜鸡shader:L5 fresnel、matcap和cubemap

文章目录

  • Fresnel
    • shader forge实现
    • UE4蓝图实现
  • Matcap
    • shader forge实现
    • UE4蓝图实现
  • CubeMap
    • SD和PS制作所需的贴图
    • shader forge实现
    • unity代码实现
    • UE4蓝图实现(未实现)

Fresnel

在这里插入图片描述

在这里插入图片描述

shader forge实现

在这里插入图片描述

  • 个人理解是,使用观察方向和法向方向点乘,那就相当于我们的视线看到哪里,哪里就是亮的,相当于头顶探照灯了。
  • 但是菲尼尔效果则是观察方向和法线方向离得越近,折射或者反射效果越弱;而如果观察方向和法线方向越接近90°时,反射的效果就越强。所以我们采用onemiuns(用1减去观察方向和法线方向的点乘),就能取得我们想要的效果。
  • 最后再使用power函数来增强这个菲涅尔的强度。

UE4蓝图实现

然后是ue4中的fresnel效果的实现,跟shader forge的节点差不多:
在这里插入图片描述

  • ue4中对应于shader forge中使用的法线方向的节点是PixelNormalWS,而不是VertexNormalWS这点需要注意。
  • 和unity中不同的时我们的观察方向需要通过摄像机方向取反来得到,因为shader forge的观察方向是从着色点为起点发射到相机的位置。这与ue4中的相机方向刚好相反。

Matcap

具体请参考毛星云大佬的blog
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

不像一般的Shader,需要提供光照,需要在Shader代码中进行漫长的演算,基于MatCap思想的Shader相当于MatCap贴图就把光照结果应该是怎样的标准答案告知Shader,我们只用在试卷下写出答案,进行一些加工即可。

需要注意,MatCap Shader有一定的局限性。因为从某种意义上来说,基于MatCap的Shader,就是某种固定光照条件下,从某个特定方向,特定角度的光照表现结果。

正是因为是选择的固定的MatCap贴图,得到相对固定的整体光照表现,若单单仅使用MatCap,就仅适用于摄像机不调整角度的情形,并不适合摄像机会频繁旋转,调节角度的情形。但我们可以在某些Shader中,用MatCap配合与光照交互的其他属性,如将MatCap结合一个作为光照反射的颜色指导的Reflection
Cube Map,就有了与光照之间的交互表现。这样,就可以适当弥补MatCap太过单一整体光照表现的短板。

shader forge实现

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

UE4蓝图实现

在这里插入图片描述

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

  • ue和unity的亮度不一样啊…只能手动调参了,这里学习为主,暂时就不折腾这个了。

CubeMap

这个东西其实很多地方都讲过,如果感兴趣可以看看:

  • games202的Precomputed Radiance Transfer的课
  • 或者直接参考LearnOpenGl中IBL章节
  • 庄老师PPT主要是讲了以反射形式为主的环境映射:
    在这里插入图片描述
  • 也就是我们要求的是那根绿线R。

在这里插入图片描述
在这里插入图片描述

SD和PS制作所需的贴图

下面说一下怎么用ps处理cubemap需要的贴图:
首先找到一张全景图,类似于这样的:
在这里插入图片描述
在这里插入图片描述

  • 具体可以上subtance designer里面找3D View里的全景图,打开其中一个的文件夹,然后直接拖到ps里面:
    在这里插入图片描述
  • 拖进ps里后选择作为alpha通道:
    在这里插入图片描述
  • 选择:
    在这里插入图片描述
  • 调整图像大小:
    在这里插入图片描述
  • 然后设置图像模式,默认参数确认就行,这一步是为了将图片的亮度高于1和暗度低于0的部分限制在0到1范围内:
    在这里插入图片描述
    然后导出为tga格式:
    在这里插入图片描述
    在这里插入图片描述
  • 导入到unity中,红色的需要调整,绿色的自己选择调不调整:
    在这里插入图片描述
  • 调整完应用之后就是下面这个样子,一个材质球:
    在这里插入图片描述

shader forge实现

  • 然后放下课程上的实现:
    在这里插入图片描述

  • unity中自己的实现:
    在这里插入图片描述

  • 因为我们要得到的是视线看过去与法线形成的反射方向,所以需要获取到观察方向的反方向。

  • 感兴趣的可以去了解下reflect函数的实现。

  • 和课程上的实现图相比多了AO,也就是环境光遮蔽贴图的部分。

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

unity代码实现

Shader "shader forge/L9_CubeMap2"
{Properties{_normalmap ("normal map", 2D) = "bump" {}_cubeMap ("cubeMap", Cube) = "_Skybox" {}_AOTex ("AO Texture",2D) = "White" {}_n1 ("n1", Float ) = -1_MipMap_Level ("MipMap_Level", Range(0, 7)) = 0_fresnel_exp ("fresnel_exp", Range(0, 10)) = 1_EnvSpecInt ("EnvSpecInt", Range(0, 5)) = 1}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv0 : TEXCOORD0;float4 tangent : TANGENT;float3 normal : NORMAL;};struct v2f{float2 uv0 : TEXCOORD0;                float4 pos : SV_POSITION;float4 posWorld : TEXCOORD1;float3 nDirWS : TEXCOORD2;float3 tDirWS : TEXCOORD3;float3 biDirWS : TEXCOORD4;               };uniform sampler2D _normalmap;uniform samplerCUBE _cubeMap;uniform sampler2D _AOTex;uniform float _n1;uniform float _MipMap_Level;uniform float _fresnel_exp;uniform float _EnvSpecInt;v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv0 = v.uv0;o.nDirWS = UnityObjectToWorldNormal(v.normal);o.tDirWS = normalize(mul(unity_ObjectToWorld, float4(v.tangent.xyz,0.0)).xyz);o.biDirWS = normalize(cross(o.nDirWS,o.tDirWS) * v.tangent.w);o.posWorld = mul(unity_ObjectToWorld, v.vertex);                return o;}fixed4 frag (v2f i) : SV_Target{//贴图采样float3 nDirTS = UnpackNormal(tex2D(_normalmap,i.uv0)).rgb;float AO_R = tex2D(_AOTex,i.uv0);//向量准备float3x3 TBN_Matrix = float3x3(i.tDirWS,i.biDirWS,i.nDirWS);float3 nDirWS_FT = normalize(mul(nDirTS,TBN_Matrix));float3 nDirVS_FT = normalize(mul(UNITY_MATRIX_V,float4(nDirWS_FT,0.0)).xyz);float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);float3 vrDirWS = normalize(reflect(-vDirWS,nDirWS_FT));//中间量准备fresnelfloat NoV = max(0.0,dot(nDirWS_FT,vDirWS));float OneMinusNoV = 1 - NoV;float fresnel = pow(OneMinusNoV,_fresnel_exp);cubemapfloat3 cubemap_uv = vrDirWS;float3 cubemap_color = texCUBElod(_cubeMap,float4(cubemap_uv,_MipMap_Level));//光照模型float3 finalColor = cubemap_color * fresnel;float3 EnvSpecLighting = finalColor * _EnvSpecInt * AO_R;//后处理//最后返回值return float4(EnvSpecLighting,1.0);}ENDCG}}
}

UE4蓝图实现(未实现)

额,虽然还想在ue4中实现一编,但是ue4的cubemap好像是直接用来制作天空盒的,跟本节课只是单纯作为贴图参与材质的编辑不一样,当然也有可能是我自己原因没有搜到相关教程,如果有大佬知道也可以在评论区告诉我一声。

如果对制作ue4的cubemap有兴趣的话也可移步至:

  • Unreal Engine UE4虚幻引擎,生成Cubemap(HDR高动态范围贴图)
  • UE4笔记:引擎内部制作cubemap步骤
  • UE4_SkyLight立方体贴图的创建与应用

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聚合函数group byhaving

聚合函数&group by group by 字段名 规定依据哪个字段分组聚合 group by核心子句是可选项,使用该子句是为了依据相同字段值分组后进行聚合运算,常和聚合函数联用 不使用group by 子句时使用聚合函数,select子句中只能写聚合函数和包含聚…

(16)燃油流量和液位传感器

文章目录 前言 16.1 燃油流量传感器 16.1.1 连接到自动驾驶仪 16.2 燃油液位传感器 16.2.1 PWM油位传感器 16.2.2 模拟油位传感器 前言 在 4.0 及以后的固件版本中,ArduPilot 提供了使用燃油流量和液位传感器的能力,此外还有电池监控器。支持脉冲输…

Linux入门

文章目录 一、Linux安装1.1、安装方式介绍1.2、网卡设置1.3、安装SSH连接工具1.4、Linux和windows目录结构对比1.5、Linux目录结构 2、Linux常用命令2.1、Linux命令初体验2.2、使用技巧2.3、命令格式2.4、文件目录操作命令文件目录操作命令ls小知识 文件目录操作命令cat文件目录…

农产品批发采购APP开发 手机里的农产品市场

农业发展是民生之本,随着互联网时代的到来各行各业都迎来了新的发展机遇,农产品批发采购、配送服务等方面也发生了很大的改变,各种农产品商城APP、农产品批发采购平台、农产品供应管理系统的开发让包含农产品信息、数据、物流、配送、仓储、质…

决策树精讲

一、决策树的构造 决策树的构造是一个递归的过程,有三种情形会导致递归返回:(1)当前结点包含的样本全属于同一类别,这时直接将该结点标记为叶结点,并设为相应的类别;(2)当前属性集为空,或是所有样本在所有…

STM32外设系列—DHT11

文章标题 一、DHT11简介二、数据手册分析2.1 接口说明2.2 串行通信说明2.2.1 单总线通信2.2.2 单总线传输数据位定义2.2.3 时序图 三、DHT11程序设计3.1 初始化GPIO3.2 发送起始信号3.3 接收一个字节数据3.4 接收温湿度信息并校准 四、总结 一、DHT11简介 DHT11是一款常用的数…

【新星计划·2023】Linux内核、发行版讲解,它们有什么区别?

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、Linux内核版 二、Linux发行版 1、Debian 2、Slackware 3、Red Hat 4、Gentoo 三、内核版和发行版的区别 1、内核版 2、发行…

BUUCTF 还原大师 1

题目描述: 我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全,E903???4D…

计算机启动

按下主机上的 power 键后,第一个运行的软件是 BIOS,BIOS 全称叫 Base Input & Output System,即基本输入输出系统。 (8086的1MB内存) 地址 0~0x9FFFF 处是 DRAM,顶部的 0xF0000~0xFFFFF&am…

AR急诊急救大平台远程专家会诊方案

随着AR技术的完善,在医院急救中,需要及时把各方面专家汇在一起会诊,在AR这方面有数据采集清晰,资料呈现方便便捷,针对客户需要,我们对业务需求分析,比较市面多种产品,把会议&#xf…

【OpenCV DNN】Flask 视频监控目标检测教程 10

欢迎关注『OpenCV DNN Youcans』系列,持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 10 3.10 OpenCV DNNFlask实时监控目标检测1、加载MobileNet SSD模型2、导入分类名称文件3、处理视频帧进行目标检测4、新建一个Flask项目5、Python 程序文件6、视频流的网…

如何使用KoodousFinder搜索和分析Android应用程序中的安全威胁

关于KoodousFinder KoodousFinder是一款功能强大的Android应用程序安全工具,在该工具的帮助下,广大研究人员可以轻松对目标Android应用程序执行安全研究和分析任务,并寻找出目标应用程序中潜在的安全威胁和安全漏洞。 账号和API密钥 在使用该工具之前,我们首选需要访问该…