当前位置: 首页 > news >正文

MatCap模拟光照效果实现

大家好,我是阿赵
之前介绍过各种光照模型的实现方法。那些光照模型的实现虽然有算法上的不同,但基本上都是灯光方向和法线方向的计算得出的明暗结果。
下面介绍一种叫做MatCap的模拟光照效果,这种方式计算非常简单,脱离灯光的计算,并可以实现比较好的高光阴影效果。

一、什么是MatCap

1、MatCap的介绍:

在这里插入图片描述

MatCap是Material Capture的缩写,意思是“材质捕获”。
听名字好像很高端并且深奥,实际上却并不是什么很深奥的东西。
MatCap贴图的样子一般是这样的:
在这里插入图片描述

2、MatCap的实现原理

MatCap实现的原理很简单,把物体的世界空间法线,转换到观察空间,然后用这个值作为UV,采样MatCap贴图。所以,如果当物体是一个球体的时候,它的法线角度应该是刚刚好和MatCap贴图完全一样,所以,如果把MatCap材质赋给一个球体,它应该是会得到和MatCap贴图一样的效果,比如我拿上面那张MatCap贴图放到MatCap材质球里面,会得到这样的效果:
在这里插入图片描述

如果物体不是一个球形,由于各个面的法线变化,所以会得到这样的效果:
在这里插入图片描述

不过如果直接算世界法线转观察空间法线,会存在一个问题,如果物体偏离视窗中心点之后,会在物体边缘出现一些奇怪的颜色
在这里插入图片描述

这是因为我们的MatCap贴图只有中间圆形绘制了光影颜色,在贴图的边缘的颜色是不对的
在这里插入图片描述

在计算观察空间的时候,如果偏离屏幕中心点太多,会不小心采样到了贴图的边缘。
要解决这个问题其实也很简单,给算出来的MatCap的UV用一个变量来控制一下缩放,让UV坐标不要超出一定范围就行了。
在这里插入图片描述

二、MatCap实现的代码

下面是Unity引擎的shader

Shader "AzhaoMatCap"
{Properties{_MainTex ("Texture", 2D) = "white" {}_MatCapTex("MatCapTex", 2D) = "white" {}_MatCapIntensity("MatCapIntensity",Range(0,2)) = 1_MatCapPow("MatCapPow",Range(0,5)) = 1_MatCapUVScale("MatCapUVScale",Range(0,1)) = 1}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{Cull offCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal:NORMAL;};struct v2f{                float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float3 normal:TEXCOORD1;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _MatCapTex;float _MatCapIntensity;float _MatCapPow;float _MatCapUVScale;float2 GetMatCapUV(float3 objNormal){float3 normalWorld = mul(unity_ObjectToWorld, objNormal);float3 normalView = mul(UNITY_MATRIX_IT_MV, normalWorld);return normalView.xy*0.5+0.5;}v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.normal = v.normal;return o;}float4 frag (v2f i) : SV_Target{// sample the texturefloat4 col = tex2D(_MainTex, i.uv);float2 MatCapUV = GetMatCapUV(i.normal)*_MatCapUVScale;float4 MatCapCol = tex2D(_MatCapTex, MatCapUV)*_MatCapIntensity;MatCapCol = pow(MatCapCol, _MatCapPow);float3 finalCol = col.rgb*MatCapCol.rgb;return float4(finalCol,col.a);}ENDCG}}
}

代码很简单,通过法线方向获取MatCap的UV,都写在GetMatCapUV方法里面了,就2、3行代码而已。
然后我个人习惯,为了控制一个叠加颜色的强度和对比度,我都是先乘再pow。
最后再给了一张MainTex贴图,作为混合固有色的例子。

三、MatCap的优缺点和应用

1、优点

1.比起真实的光照模型,MatCap计算量很少,只是算个UV采样一张贴图就可以了
2.光照效果非常的可控,可以自己绘制喜欢的高光、阴影和补光的效果
在固定摄像机角度和光照方向的情况下,用MatCap模拟物体的材质,通过使用不同的MatCap贴图,可以达到很强的质感

2、缺点

MatCap的缺点也很明显,因为它的光照效果是假的,所以从不同的角度观察物体,它的光照是不会变化的,也不能做到跟随灯光旋转变化而变化。
所以MatCap的效果一般只能用于固定摄像机和灯光角度的情况下。

3、应用

下面换了几张不同的MatCap贴图,可以看出,物体有了非常强的质感。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的shader代码里面,我最后是用乘法来和MainTex颜色叠加,是因为我想MatCap同时产生亮部和暗部的效果。其实我们也可以单纯用MatCap来叠加某个部分的效果,比如,可以改成用加法,然后MatCap贴图只绘制高光部分,其余部分都涂黑。这样我们可以通过MatCap来单纯的叠加高光部分,然后暗部使用烘焙贴图或者顶点颜色来实现,也是可以的。
虽然说MatCap只能用于固定角度,但如果通过贴图遮罩,只限于模型的某些小局部的金属之类强高光的地方显示,其实也能在模型转动或者运动的时候,产生比较不错的质感。
MatCap的其他应用,各位可以再发挥一下想象力。

相关文章:

MatCap模拟光照效果实现

大家好,我是阿赵 之前介绍过各种光照模型的实现方法。那些光照模型的实现虽然有算法上的不同,但基本上都是灯光方向和法线方向的计算得出的明暗结果。 下面介绍一种叫做MatCap的模拟光照效果,这种方式计算非常简单,脱离灯光的计算…...

二十一、PG管理

一、 PG异常状态说明 1、 PG状态介绍 可以通过ceph pg stat命令查看PG当前状态,健康状态为“active clean” [rootrbd01 ~]# ceph pg stat 192 pgs: 192 activeclean; 1.3 KiB data, 64 MiB used, 114 GiB / 120 GiB avail; 85 B/s rd, 0 op/s2、pg常见状态 状…...

SAPUI5开发01_01-Installing Eclipse

1.0 简要要求概述: 本节您将安装SAPUI 5,以及如何在Eclipse Juno中集成SAPUI 5工具。 1.1 安装JDK JDK 是一种用于构建在 Java 平台上发布的应用程序、Applet 和组件的开发环境,即编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。 在安装 JDK 之前,首…...

Qt之高仿QQ系统设置界面

QQ或360安全卫士的设置界面都是非常有特点的,所有的配置项都在一个垂直的ScrollArea中,但是又能通过左侧的导航栏点击定位。这样做的好处是既方便查看指定配置项,又方便查看所有配置项。 一.效果 下面左边是当前最新版QQ的系统设置界面,右边是我的高仿版本,几乎一毛一样…...

JVM概览:内存空间与数据存储

核心的五个部分虚拟机栈:局部变量中基础类型数据、对象的引用存储的位置,线程独立的。堆:大量运行时对象都在这个区域存储,线程共享的。方法区:存储运行时代码、类变量、常量池、构造器等信息,线程共享。程…...

固态存储设备固件升级方案

1. 前言 随着数字化时代的发展,数字数据的量越来越大,相应的数据存储的需求也越来越大,存储设备产业也是蓬勃发展。存储设备产业中,发展最为迅猛的则是固态存储(Solid State Storage,SSS)。数字化时代,海量…...

Python交通标志识别基于卷积神经网络的保姆级教程(Tensorflow)

项目介绍 TensorFlow2.X 搭建卷积神经网络(CNN),实现交通标志识别。搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠,然后经过全连接层,最后用softmax映射为每个类别的概率,概率最大的即为识别…...

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium? 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人!!! 重点:配套学习资料和视频教学 一、什么是Selenium? …...

Python进阶-----高阶函数zip() 函数

目录 前言: zip() 函数简介 运作过程: 应用实例 1.有序序列结合 2.无序序列结合 3.长度不统一的情况 前言: 家人们,看到标题应该都不陌生了吧,我们都知道压缩包文件的后缀就是zip的,当然还有r…...

win10打印机拒绝访问解决方法

一直以来,在安装使用共享打印机打印一些文件的时候,会遇到错误提示:“无法访问.你可能没有权限使用网络资源。请与这台服务器的管理员联系”的问题,那为什么共享打印机拒绝访问呢?别着急,下面为大家带来相关的解决方法…...

深度学习训练营之数据增强

深度学习训练营学习内容原文链接环境介绍前置工作设置GPU加载数据创建测试集数据类型查看以及数据归一化数据增强操作使用嵌入model的方法进行数据增强模型训练结果可视化自定义数据增强查看数据增强后的图片学习内容 在深度学习当中,由于准备数据集本身是一件十分复杂的过程,…...

Tomcat安装及启动

日升时奋斗,日落时自省 目录 1、Tomcat下载 2、JDK安装及配置环境 3、Tomcat配置环境 4、启动Tomcat 5、部署演示 1、Tomcat下载 直接入主题,下载Tomcat 首先就是别下错了,直接找官方如何看是不是广告,或者造假 搜索Tomc…...

【专项训练】排序算法

排序算法 非比较类的排序,基本上就是放在一个数组里面,统计每个数出现的次序 最重要的排序是比较类排序! O(nlogn)的3个排序,必须要会!即:堆排序、快速排序、归并排序! 快速排序:分治 经典快排 def quickSort1(arr...

Android压测测试事件行为参数对照表

执行参数参数说明颗粒度指标基础参数--throttle <ms> 用于指定用户操作间的时延。 -s 随机数种子&#xff0c;用于指定伪随机数生成器的seed值&#xff0c;如果seed值相同&#xff0c;则产生的时间序列也相同。多用于重测、复现问题。 -v 指定输出日志的级别&#xff0c;…...

【观察】亚信科技:“飞轮效应”背后的数智化创新“延长线”

著名管理学家吉姆柯林斯在《从优秀到卓越》一书中提出“飞轮效应”&#xff0c;它指的是为了使静止的飞轮转动起来&#xff0c;一开始必须使很大的力气&#xff0c;每转一圈都很费力&#xff0c;但达到某一临界点后&#xff0c;飞轮的重力和冲力就会成为推动力的一部分&#xf…...

QT编程从入门到精通之十四:“第五章:Qt GUI应用程序设计”之“5.1 UI文件设计与运行机制”之“5.1.1 项目文件组成”

目录 第五章:Qt GUI应用程序设计 5.1 UI文件设计与运行机制 5.1.1 项目文件组成 第五章:Qt GUI应用程序设计...

(二分)730. 机器人跳跃问题

目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 AcWing 730. 机器人跳跃问题 - AcWing 一些话 // 向上取整 mid的表示要写成l r 1 >> 1即可&#xff0c;向下取整 mid l r >> 1 // 这里我用了浮点二分&#xff0c;mid (l r) / 2&#xff0c;最…...

vue3使用nextTick

发现nextTick必须放在修改一个响应式数据之后&#xff0c;才会在onUpdated之后被调用&#xff0c;如果nextTick是放在所有对响应式数据修改之前&#xff0c;则nextTick里面的回调函数会在onBeforeUpdate方法执行前就被调用了。可是nextTick必须等到onUpdated执行完成之后执行&a…...

传统图像处理之颜色特征

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

GPS问题调试—MobileLog中有关GPS关键LOG的释义

GPS问题调试—MobileLog中有关GPS关键LOG的释义 [DESCRIPTION] 在mobile log中,有很多GPS相关的log出现在main log和kernel log、properties文件中,他们的意思是什么,通过这篇文档进行总结,以便在处理GPS 问题时,能够根据这些log快速的收敛问题。 [SOLUTION] 特别先提醒…...

【企业管理】你真的理解向下管理吗?

导读&#xff1a;拜读陈老师一篇文章《不会向下负责&#xff0c;你凭什么做管理者&#xff1f;》&#xff0c;引发不少共鸣&#xff0c;“很多管理者有一种错误的观念&#xff0c;认为管理是向下管理&#xff0c;向上负责。其实应该反过来&#xff0c;是向上管理&#xff0c;向…...

Centos7 硬盘挂载流程

1、添加硬盘到Linux&#xff0c;添加后重启系统2、查看添加的硬盘&#xff0c;lsblksdb 8:16020G 0disk3、分区fdisk /dev/sdbmnw其余默认&#xff0c;直接回车再次查看分区情况&#xff0c;lsblksdb1 8:17 0 20G 0 part4、格式化mkfs -t ext4 /dev/sdb15、挂载mkdir /home/new…...

认识vite_vue3 初始化项目到打包

从0到1创建vite_vue3的项目背景效果vite介绍&#xff08;对比和vuecli的区别&#xff09;使用npm创建vitevitevuie3创建安装antdesignvite自动按需引入&#xff08;vite亮点&#xff09;请求代理proxy打包背景 vue2在使用过程中对象的响应式不好用新增属性的使用$set才能实现效…...

【Go】cron时间格式

【Go】cron时间格式 Minutes&#xff1a;分钟&#xff0c;取值范围[0-59]&#xff0c;支持特殊字符* / , -&#xff1b;Hours&#xff1a;小时&#xff0c;取值范围[0-23]&#xff0c;支持特殊字符* / , -&#xff1b;Day of month&#xff1a;每月的第几天&#xff0c;取值范…...

leetcode 55. 跳跃游戏

给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,1,1,4] 输出&#xff1a;true 解释&#xff1a;可以先跳 1 …...

Linux:文件流指针 与 文件描述符

目录一、文件描述符二、文件流指针三、缓冲区之前讲解过了IO库函数和IO接口&#xff0c;库函数是对系统调用接口的封装&#xff0c;也就是说实际上在库函数内部是通过调用系统调用接口来完成最终功能的。 库函数通过文件流指针操作文件&#xff0c;系统调用接口通过文件描述符操…...

基于FPGA实现正弦插值算法

1、正弦插值的算法分析 1.1 信号在时域与频域的映射关系 在进行正弦算法分析之前&#xff0c;我们回顾一下《数字信号处理》课程中&#xff0c;对于信号在时域与频域之间的映射关系&#xff0c;如下图。 对于上图中的原始信号x(t)&#xff0c;使用ADC对信号进行采样&#xff0…...

JavaWeb_会话技术

文章目录会话跟踪技术的概述Cookie概念Cookie工作流程Cookie基本使用发送Cookie获取CookieCookie原理分析Cookie的使用细节Cookie的存活时间Cookie存储中文SessionSession的基本使用概念工作流程Session的基本使用Session的原理分析Session的使用细节Session的钝化与活化Sessio…...

Reactor响应式流的核心机制——背压机制

响应式流是什么&#xff1f; 响应式流旨在为无阻塞异步流处理提供一个标准。它旨在解决处理元素流的问题——如何将元素流从发布者传递到订阅者&#xff0c;而不需要发布者阻塞&#xff0c;或订阅者有无限制的缓冲区或丢弃。 响应式流模型存在两种基本的实现机制。一种就是传统…...

[数据结构]栈的深入学习-java实现

CSDN的各位uu们你们好,今天千泽带来了栈的深入学习,我们会简单的用代码实现一下栈, 接下来让我们一起进入栈的神奇小世界吧!0.速览文章一、栈的定义1. 栈的概念2. 栈的图解二、栈的模拟实现三.栈的经典使用场景-逆波兰表达式总结一、栈的定义 1. 栈的概念 栈&#xff1a;一种…...

pis粉丝做的网站/百度电脑版下载

2019独角兽企业重金招聘Python工程师标准>>> 1. 使用 synchronized 关键字&#xff0c;代码如下 synchronized(anObject) { value map.get(key);} 2、使用 JDK1.5提供的锁&#xff08;java.util.concurrent.locks.Lock&#xff09;。代码如下 lock.lock(); value…...

未央免费做网站/西安网站维护

点击上方“蓝色字”可关注我们&#xff01;暴走时评&#xff1a;德国首都柏林正迅速发展成为加密货币体系的主要中心。在英国脱欧之后&#xff0c;德国吸引了来自世界各地的大量人才和资金&#xff0c;他们正在柏林建立一个丰富的区块链生态系统。早期加密货币支持者的动机是挑…...

网站建设的步骤图/中国最新消息今天

这篇文章也是基于知乎的一个答案。因为前天蛋疼写了个99行蛋疼版2048&#xff0c;所以一时兴起在知乎上搜了搜2048&#xff0c;结果发现了这个问题。看了看&#xff0c;票数最高的两个答案都是错的&#xff0c;所以自己推导了一下。2048的玩法就不赘述了&#xff0c;先来看看相…...

动易sf做网站多少钱/廊坊自动seo

版本&#xff1a; https://flink.apache.org/downloads.html https://archive.apache.org/dist/flink/ 发展历史&#xff1a; 2014年 Jan一月14 precursor - 初期形式 2014年Apr四月14 incubation - 孵化 2014年 Dec十二月14 Top Level 2015年6月 0.9.0 2016年Mar5月16 1.0.0...

自己做了个网站/中国疫情最新数据

配置环境也是门学问&#xff0c;反正我每次配环境能出一堆问题&#xff0c;望所有同学都有耐心&#xff0c;最后一定会解决的~ ps&#xff1a;如果解决不了&#xff0c;可使用饮鸩止渴大法--叫同组小伙伴直接发node-module给你哈哈哈~ 报错 > node-sass3.13.1 install E:\no…...

wordpress nana主题/百度账号中心官网

云南技师学院计算机程序设计专业招生培养目标&#xff1a;培养从事计算机程序开发的中级技能人才。学习年限&#xff1a;3年(初中毕业生)&#xff0c;2年(高中毕业生)职业能力&#xff1a;具有积极的人生态度、健康的心理素质、良好的职业道德和较扎实的文化基础知识&#xff1…...