菜鸡shader:L5 fresnel、matcap和cubemap

这篇具有很好参考价值的文章主要介绍了菜鸡shader:L5 fresnel、matcap和cubemap。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Fresnel

菜鸡shader:L5 fresnel、matcap和cubemap

菜鸡shader:L5 fresnel、matcap和cubemap

shader forge实现

菜鸡shader:L5 fresnel、matcap和cubemap

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

UE4蓝图实现

然后是ue4中的fresnel效果的实现,跟shader forge的节点差不多:
菜鸡shader:L5 fresnel、matcap和cubemap

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

Matcap

具体请参考毛星云大佬的blog
菜鸡shader:L5 fresnel、matcap和cubemap
菜鸡shader:L5 fresnel、matcap和cubemap
菜鸡shader:L5 fresnel、matcap和cubemap

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

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

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

shader forge实现

菜鸡shader:L5 fresnel、matcap和cubemap
unity中的效果:
菜鸡shader:L5 fresnel、matcap和cubemap

UE4蓝图实现

菜鸡shader:L5 fresnel、matcap和cubemap

ue4中的效果:
菜鸡shader:L5 fresnel、matcap和cubemap

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

CubeMap

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

  • games202的Precomputed Radiance Transfer的课
  • 或者直接参考LearnOpenGl中IBL章节
  • 庄老师PPT主要是讲了以反射形式为主的环境映射:
    菜鸡shader:L5 fresnel、matcap和cubemap
  • 也就是我们要求的是那根绿线R。

菜鸡shader:L5 fresnel、matcap和cubemap
菜鸡shader:L5 fresnel、matcap和cubemap

SD和PS制作所需的贴图

下面说一下怎么用ps处理cubemap需要的贴图:
首先找到一张全景图,类似于这样的:
菜鸡shader:L5 fresnel、matcap和cubemap
菜鸡shader:L5 fresnel、matcap和cubemap

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

shader forge实现

  • 然后放下课程上的实现:
    菜鸡shader:L5 fresnel、matcap和cubemap

  • unity中自己的实现:
    菜鸡shader:L5 fresnel、matcap和cubemap

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

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

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

unity的效果图:
菜鸡shader:L5 fresnel、matcap和cubemap

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 100

        Pass
        {
            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));

                //中间量准备
                fresnel
                float NoV = max(0.0,dot(nDirWS_FT,vDirWS));
                float OneMinusNoV = 1 - NoV;
                float fresnel = pow(OneMinusNoV,_fresnel_exp);

                cubemap
                float3 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有兴趣的话也可移步至:文章来源地址https://www.toymoban.com/news/detail-503731.html

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

到了这里,关于菜鸡shader:L5 fresnel、matcap和cubemap的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 菜鸡学习zookeeper源码(三)NIOServer的启动

    上一篇写到了QuorumPeer的start方法,里面主要进行执行了loadDataBase方法(进行加载本地的数据信息,具体是怎么进行加载的,没在文章中进行说明,这块小园子也没看,等分析完整体的启动流程之后在进行分析), 这篇文章的话主要写startServerCnxnFactory方法,在上一篇文章中也进

    2024年01月24日
    浏览(31)
  • 二本菜鸡,颓废两年的自我救赎

    大家好,我是帅地。 随着校招的结束,帅地的星球里也有不少小伙伴前来报喜,今天这篇,是星球一个颓废两年同学的自我救赎之路,我觉得他的经历和很多人一样,前两年可能就颓废了,后面才后知后觉,具有一定的代表性。 正文如下: 感谢地哥的邀请,作为二本+大学颓

    2024年02月03日
    浏览(39)
  • 大数据课程L5——网站流量项目的实时业务系统搭建

    文章作者邮箱:yugongshiye@sina.cn              地址:广东惠州 ⚪ 掌握网站流量项目的 Flume—Kafka 连通; ⚪ 掌握网站流量项目的实时业务系统搭建; 1. 启动三台服务器。 2. 启动 Zookeeper 集群。 执行指令: sh /home/software/zookeeper-3.4.8/bin/zkServer.sh  start 3. 启动 Kafka 集群。 4. 创

    2024年02月09日
    浏览(47)
  • VL53L5CX驱动开发(3)----检测阈值

    本章展示如何使用VL53L5CX近接传感器的\\\"检测阈值\\\"功能。这个功能允许用户为传感器设置预定义的条件,当这些条件满足时,传感器可以触发一个中断。 最近在弄ST的课程,需要样片的可以加群申请:615061293 。 VL53L5CX传感器允许用户更灵活地定义响应行为,特别是当检测到特

    2024年02月20日
    浏览(30)
  • 【菜鸡常见网络问题汇总】之:STP与RSTP的区别

    STP(spanning tree protocol)生成树协议,一种最最常用的二层破环技术。 RSTP(rapid spanning Tree Protocol ):快速生成树协议,可看做STP的进阶版本。 在以太网交换网中部署STP,如果出环,STP通过拓扑计算,可实现:消除环路,通过阻塞冗余链路消除可能存在的网络通信环路;链路备份,

    2024年01月18日
    浏览(25)
  • L5级别AIGC面试官:颠覆传统AI面试的终极力量

    困扰一:面试题目外泄严重 在传统的AI面试中,岗位题目多为固定模式,导致面试培训机构和已完成AI面试的候选人在各类平台如小红书、牛客网等泛滥散布此类问题。这使得后续参与AI面试的候选人获得不公平的备考机会。 困扰二:无法展开追问 受限于算法技能,传统AI面

    2024年02月09日
    浏览(39)
  • VL53L5CX驱动开发(5)----运动阈值检测

    本章目的是展示如何充分利用VL53L5CX传感器的高级特性,通过结合运动指示器和阈值检测功能,实现对特定场景的精确监控。首先,程序通过特定的配置,确保了传感器能够在特定的分辨率下工作,同时还可调整用于检测运动的最小和最大距离。其次,一旦在传感器的视野中

    2024年02月06日
    浏览(28)
  • VL53L5CX驱动开发(2)----设置自主模式

    “自主模式”(Autonomous mode)通常指的是设备或系统能够在没有外部输入的情况下独立完成任务。对于传感器,如VL53L5,自主模式可能意味着传感器可以独立、定期地进行测量,而不需要来自主控制器或主机的每一次单独指令。 最近在弄ST的课程,需要样片的可以加群申请:

    2024年02月04日
    浏览(26)
  • VL53L5CX驱动开发(4)----运动指示器

    VL53L5CX传感器内置了一个固件功能,可以检测场景中的运动。这个运动指示器是基于连续帧之间来计算的。使用插件vl53l5cx_plugin_motion_indicator可以使用这个选项。 运动指示器通过vl53l5cx_motion_indicator_init()函数进行初始化。如果用户想要更改传感器的分辨率,他必须使用专用函数

    2024年02月02日
    浏览(26)
  • VL53L5CX驱动开发(1)----驱动TOF进行区域检测

    VL53L5CX是一款先进的飞行感应(FlightSense)产品系列的飞行时间(ToF)多区间测距传感器。封装在微型的可回流焊盘封装内,它集成了SPAD阵列、物理红外滤光片和衍射光学元件(DOE),以在不同的环境光照条件和各种覆盖玻璃材料下实现最佳测距性能。 最近在弄ST的课程,需

    2024年02月03日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包