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

2024-04-15 18:36

本文主要是介绍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稍微闲了一点,会努力更新哒,感谢大家的支持,没有你们观看,就没有我写下去的动力。

这篇关于Unity | Shader基础知识(第十二集:颜色混合)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906601

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

关于回调函数和钩子函数基础知识的整理

回调函数:Callback Function 什么是回调函数? 首先做一个形象的比喻:   你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

有关机械硬盘的基础知识

1,机械硬盘的品牌   目前市场中常见的笔记本电脑的机械硬盘品牌主要有希捷、西部数据、三星等。   2,机械硬盘的容量   硬盘容量,即硬盘所能存储的最大数据量。虽然笔记本电脑硬盘的容量会因单位密度的提升而增加,不过和台式电脑的大容量比起来,笔记本电脑硬盘的容量仍然落后许多。笔记本电脑的硬盘除了对磁盘有体积较小和数量较少的要求之外,对功耗、耐用程度、抗震性及成本等的考虑,也让笔记

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位