Unity | Shader基础知识(第十二集:颜色混合)

目录

前言

一、日常生活中的常见现象

二、unity自带的一个结构体(表面着色器SurfaceOutputStandard)

三、自己写一个颜色混合的Shader

1.只加基础颜色Albedo

2.加入法线

 3.加入光滑度

  4.加入金属度

  5.加入自发光

四、作者的话


前言

shader里每一个结构体的存在都是有原因的,都是来源于生活的,让我们一起来从生活的角度看看吧。

一、日常生活中的常见现象

小故事一:

家里的墙是白色的,我买了一个黄色的台灯,当我打开台灯时,白墙变成了黄色。(如图1所示)

图1 白墙照了黄光

备注:墙(物体)本身的颜色是白色,环境光的颜色是黄色,得到结果是黄色。

自身颜色叫:贴图

环境光叫:环境光

小故事二(上节课讲的,法线颜色),如图2所示:

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图)-CSDN博客

图2 法线贴图

备注:物体本身有颜色,加了深度的颜色信息。

有凹凸感:法线贴图

小故事三:

手电筒打到白纸上,白纸会亮一片,手电筒打到镜子里,只会亮一个点。(如图3,4所示)

ps:我找第二张图的时候要被吓死了....都搜出来什么鬼东西。救命!!!

图3 手电筒照纸
图4 手电筒照镜子

备注:白纸比较粗糙,光照上去以后会朝不同的地方散开,但物体如果非常光滑,从哪里射过去的光,就会从哪里射回去。
光线方向是否会原路返回:光滑度

小故事四:

玻璃光滑,但光会都穿过去,金属片光滑,光会全部被反弹回去。(如图5,6)

图5 透光玻璃
图6 反光铝板

备注:光照到物体上以后,会穿透,会吸收,会反射,反射占比越多,就越像镜子。
像镜子一样,光都反射回去了:金属度

小故事五:

灯笼本身有颜色,但是它还会发光。(如图7)

图7 灯笼

备注:物体本身是蓝色带小鱼,但是有白色的光射出来。
自己是一个会发光的东西:自发光

二、unity自带的一个结构体(表面着色器SurfaceOutputStandard)

struct SurfaceOutputStandard
{fixed3 Albedo;      // 基础颜色——故事1fixed3 Normal;      // 法线——故事2half3 Emission;     //自发光——故事5half Metallic;      // 0=非金属,1=金属    金属度——故事4half Smoothness;    // 0=粗糙,1=平滑    光滑度——故事3half Occlusion;     // 遮挡(默认为 1) 这里先不讲fixed Alpha;        // 透明度 Alpha    这里先不讲
};

中文参考链接:编写表面着色器 - Unity 手册

我们就可以在shader里面直接用。

三、自己写一个颜色混合的Shader

1.只加基础颜色Albedo

(如图8所示)

图8 基础颜色
Shader "Custom/007_mixColor"
{Properties{    //贴图_MainTex ("Albedo", 2D) = "white" {}}SubShader{CGPROGRAM//把表面着色器的结构体相关部分引用进来#pragma surface surf Standard//承接资源的部分sampler2D _MainTex;//输入的结构体struct Input{float2 uv_MainTex;};//数据传递的方法void surf (Input IN, inout SurfaceOutputStandard o){//把贴图转换成能用的数据fixed4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;}ENDCG}FallBack "Diffuse"
}

备注:其实这里已经加了环境光,因为如果没有环境光,你就啥也看不见。(如图9所示)

图9 关闭环境光

 如果改变环境光的颜色,贴图的颜色也会改变,和故事一相同。(如图10所示)

图10 改变环境光的颜色
2.加入法线

(这部分就不细讲了,直接放代码)(如图11所示) 

图11 加入法线贴图
Shader "Custom/007_mixColor"
{Properties{    //贴图_MainTex ("Albedo", 2D) = "white" {}//法线图片_MainNormal ("NormalTexture",2D) = "bump" {}}SubShader{CGPROGRAM//把表面着色器的结构体相关部分引用进来#pragma surface surf Standard//承接资源的部分sampler2D _MainTex;sampler2D _MainNormal;//输入的结构体struct Input{float2 uv_MainTex;float2 uv_MainNormal;};//数据传递的方法void surf (Input IN, inout SurfaceOutputStandard o){//把贴图转换成能用的数据fixed4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Normal = UnpackNormal(tex2D(_MainNormal,IN.uv_MainNormal));}ENDCG}FallBack "Diffuse"
}
3.加入光滑度

(如图12所示) 越光滑,光线就会朝着太阳照射的地方反射回去。因为改变的是方向,所以调到中间的时候刚好射到眼睛里,就是白的。

图12 光滑度
Shader "Custom/007_mixColor"
{Properties{    //贴图_MainTex ("Albedo", 2D) = "white" {}//法线图片_MainNormal ("NormalTexture",2D) = "bump" {}//光滑度_Smoothness("Smoothness",Range(0,1)) = 0.5}SubShader{CGPROGRAM//把表面着色器的结构体相关部分引用进来#pragma surface surf Standard//承接资源的部分sampler2D _MainTex;sampler2D _MainNormal;float _Smoothness;//输入的结构体struct Input{float2 uv_MainTex;float2 uv_MainNormal;};//数据传递的方法void surf (Input IN, inout SurfaceOutputStandard o){//把贴图转换成能用的数据fixed4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Normal = UnpackNormal(tex2D(_MainNormal,IN.uv_MainNormal));//光滑度o.Smoothness =_Smoothness;}ENDCG}FallBack "Diffuse"
}
 4.加入金属度

(如图13所示) 这里为了光泽度感觉更明显,把其他贴图先去掉了。

图13 加入金属度​​​​​​
Shader "Custom/007_mixColor"
{Properties{    //贴图_MainTex ("Albedo", 2D) = "white" {}//法线图片_MainNormal ("NormalTexture",2D) = "bump" {}//光滑度_Smoothness("Smoothness",Range(0,1)) = 0.5//金属度_Metallic("Metallic",Range(0,1)) = 0}SubShader{CGPROGRAM//把表面着色器的结构体相关部分引用进来#pragma surface surf Standard//承接资源的部分sampler2D _MainTex;sampler2D _MainNormal;float _Smoothness;float _Metallic;//输入的结构体struct Input{float2 uv_MainTex;float2 uv_MainNormal;};//数据传递的方法void surf (Input IN, inout SurfaceOutputStandard o){//把贴图转换成能用的数据fixed4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Normal = UnpackNormal(tex2D(_MainNormal,IN.uv_MainNormal));//光滑度o.Smoothness =_Smoothness;//金属度o.Metallic =_Metallic;}ENDCG}FallBack "Diffuse"
}
 5.加入自发光

(如图14所示) 

如图14 自发光
Shader "Custom/007_mixColor"
{Properties{    //贴图_MainTex ("Albedo", 2D) = "white" {}//法线图片_MainNormal ("NormalTexture",2D) = "bump" {}//光滑度_Smoothness("Smoothness",Range(0,1)) = 0.5//金属度_Metallic("Metallic",Range(0,1)) = 0//自发光_Emission ("Emission", Color) = (1,1,1,1)}SubShader{CGPROGRAM//把表面着色器的结构体相关部分引用进来#pragma surface surf Standard//承接资源的部分sampler2D _MainTex;sampler2D _MainNormal;float _Smoothness;float _Metallic;float3 _Emission;//输入的结构体struct Input{float2 uv_MainTex;float2 uv_MainNormal;};//数据传递的方法void surf (Input IN, inout SurfaceOutputStandard o){//把贴图转换成能用的数据fixed4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Normal = UnpackNormal(tex2D(_MainNormal,IN.uv_MainNormal));//光滑度o.Smoothness =_Smoothness;//金属度o.Metallic =_Metallic;//自发光o.Emission = _Emission;}ENDCG}FallBack "Diffuse"
}

 备注:到此为止,我们常用的五个故事里的颜色混合,都写出来了。

四、作者的话

恭喜大家,shader最最基础的部分已经学完了,现在的大家已经可以看懂一些基础的shader和进行一些修改了。最近up稍微闲了一点,会努力更新哒,感谢大家的支持,没有你们观看,就没有我写下去的动力。

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

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

相关文章

Git-常规用法-含解决分支版本冲突解决方法

目录 前置条件 已经创建了Gitee账号 创建一个远程仓库 Git的优点 版本控制 Git 下载 Git的使用 检查Git的是否安装成功 git的常用命令 常用流程 Git 分支 分支流程 Git 远程仓库 远程仓库流程 特殊 可能遇到的问题 前置条件 已经创建了Gitee账号 创建一个远程仓…

Macs Fan Control Pro for Mac:全面优化Mac散热的得力助手

Macs Fan Control Pro for Mac是一款专为苹果电脑用户设计的风扇控制软件,旨在通过精确的风扇速度调节,全面优化Mac的散热性能,确保系统始终运行在最佳状态。 Macs Fan Control Pro for Mac v1.5.17中文版下载 该软件具备实时监控功能&#x…

中仕公考:教师招聘和事业单位联考的区别

教师招聘考试与事业单位联考作为两种不同的职业资格考试,其在报考条件和考试内容上存在明显的差异,具体内容为大家简要介绍一下: 一、报考条件 1. 教师招聘考试:此类考试的报名通常要求申请者持有相关教师资格证明。对于非师范生…

Maven配置的修改

在集团做java实习生的第一天,我的leader给了我项目的代码,并且还有一个settings.xml文件,当时很懵,不知道这个文件是干啥的,当然有的小伙伴可能一眼就认出来了,这个配置文件是做什么,是做maven配…

三个截然不同的爆仓案例,值得每个交易者反思

用铜做镜子,能端正衣冠;以史为镜可知兴;以人为镜能明得与失得。”做买卖,需要以他人的得失为鉴,这样才会不断地反思持续地提高持续地进步。在这篇文章中,我们会分享3个完全不同的爆仓案例给交易者一个“与明…

Maven超详细使用

定义 是一款用于管理和构建java项目的工具 作用 1. 依赖管理 2. 统一项目结构 3. 项目构建 项目目录结构 POM 项目对象模型 (Project Object Model) POM (Project Object Model) :指的是项目对象模型,用来描述当前的maven项目。 仓库 本地仓库&#…

LabVIEW光学探测器板级检测系统

LabVIEW光学探测器板级检测系统 特种车辆乘员舱的灭火抑爆系统广泛采用光学探测技术来探测火情。光学探测器作为系统的关键部件,其探测灵敏度、响应速度和准确性直接关系到整个系统的运行效率和安全性。然而,光学探测器在长期使用过程中可能会因为灰尘污…

Dinov2 + Faiss 图片检索

MetaAI 通过开源 DINOv2,在计算机视觉领域取得了一个显着的里程碑,这是一个在包含1.42 亿张图像的令人印象深刻的数据集上训练的模型。产生适用于图像级视觉任务(图像分类、实例检索、视频理解)以及像素级视觉任务(深度…

msvcp140.dll下载的方法有哪些?教你如何修复msvcp140.dll文件

之前有朋友咨询有关于msvcp140.dll下载的相关方法,所以小编觉得很有必要来给大家详细的说说这方面,教一下大家下载msvcp140.dll文件。 一.msvcp140.dll文件详细解析 msvcp140.dll是一个由Microsoft提供的动态链接库文件,属于Microsoft Visua…

✌粤嵌—2024/3/19—环形链表

代码实现: 快慢指针: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ bool hasCycle(struct ListNode *head) {// 快慢指针:快指针每次走两步,慢指针每次走一步&a…

大小端字节序、浮点数的存储

目录 1、大小端 判断当前机器的字节序 浮点数的存储 浮点数存的过程 浮点数取的过程 1、大小端 先来看一段代码&#xff1a; #include <stdio.h> int main() {int a 0x11223344;return 0; } 在调试过程中&#xff0c;在vs内存调试下&#xff0c;a中的0x11223344这…

JMeter压力测试

JMeter是一款很好用的压力测试工具&#xff0c;他可以让我们测试接口压力数据&#xff0c;吞吐量等等&#xff0c;以便于我们调整和优化接口响应速度。 首先我们去JMeter官网先把工具下载下来&#xff0c;官网链接,我们可以点击链接&#xff0c;进去以后点击下载我们需要的版本…