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

news2024/9/23 23:32:04

目录

前言

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

二、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;      // 基础颜色——故事1
    fixed3 Normal;      // 法线——故事2
    half3 Emission;     //自发光——故事5
    half Metallic;      // 0=非金属,1=金属    金属度——故事4
    half Smoothness;    // 0=粗糙,1=平滑    光滑度——故事3
    half 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.coloradmin.cn/o/1596251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024第十五届蓝桥杯 JAVA B组

目录 前言:试题 A: 报数游戏试题 B: 类斐波那契循环数试题C:分布式队列 前言: 没参加这次蓝桥杯算法赛,十四届蓝桥杯被狂虐,对算法又爱又恨,爱我会做的题,痛恨我连题都读不懂的题😭,十四届填空只…

计算方法实验5:对鸢尾花数据集进行主成分分析(PCA)并可视化

任务 iris数据集包含150条数据,从iris.txt读取,每条数据有4个属性值和一个标签(标签取值为0,1,2)。要求对这150个4维数据进行PCA,可视化展示这些数据在前两个主方向上的分布,其中不…

鸿蒙原生应用元服务-访问控制(权限)开发Stage模型向用户申请授权

一、向用户申请授权 当应用需要访问用户的隐私信息或使用系统能力时,例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等,应该向用户请求授权。这需要使用 user_grant 类型权限。在此之前,应用需要进行权限校验,以判断当前…

Golang教程一(环境搭建,变量,数据类型,数组切片map)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 格式化输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字…

贝叶斯公式中的先验概率、后验概率、似然概率

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

Neo4j 图形数据库中有哪些构建块?

Neo4j 图形数据库具有以下构建块 - 节点属性关系标签数据浏览器 节点 节点是 Graph 的基本单位。 它包含具有键值对的属性,如下图所示。 NEmployee 节点 在这里,节点 Name "Employee" ,它包含一组属性作为键值对。 属性 属性是…

华为HarmonyOS 4.2公测升级计划扩展至15款新机型

华为近日宣布,HarmonyOS 4.2操作系统的公测升级计划将扩展到包括华为P50系列在内的15款设备。这一更新旨在为用户提供更优化的系统性能和增强的功能。 参与此次公测的机型包括华为P50、华为P50 Pro及其典藏版、华为P50E、华为P50 Pocket及其艺术定制版、华为nova系…

Unity开发HoloLens2应用时,用VisualStudio进行真机在线Debug调试

一、需求 用Unity开发的应用,部署到真机设备出现启动崩溃,此时可以用在线调试,排查错误。 二、开发环境说明 MRholoLens2 Unity 2021.3.18 Win Win10 VS vs2022 三、调试操作步骤 1、HoloLens2与电脑的连接,Wifi连接&…

不是所有商业模式都叫传销!七星创客模式!

“商业模式是否等同于拉人头、传销?”近期,这一疑问在许多人心中萦绕。似乎每当提及商业模式,总有些人会将其与拉人头、传销等概念联系起来,仿佛所有的商业模式都带有某种负面色彩。 然而,商业模式的内涵远非如此单一。…

MCU的最佳存储方案CS创世 SD NAND

MCU的最佳存储方案CS创世 SD NAND 写在最前面MCU是什么CS创世 SD NAND 6大优势 写在最前面 转载自 雷龙官网 MCU是什么 大家都知道MCU是一种"麻雀"虽小,却"五脏俱全"的主控。它的应用领域非常广泛,小到手机手表,大到航空…

【服务器部署篇】Linux下Jenkins安装和配置

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是,产…

使用PL\SQL将Excel表格导入到oracle数据库中

因为要测试生产问题,需要把生产上oracle导出数据导入到测试环境oracle数据库中,尝试了N种方法,发现使用PL\SQL 的ODBC 方法比较好用 1、开始 首先使用plsqldev里面的,工具--》下面的odbc导入器 2、配置 点击之后,会…

获取jd.item_get-获得京东商品详情API接口请求参数请求接入示例免费接入KEY演示

京东商品详情API接口的主要作用是: 获取基本信息:包括商品的名称、品牌、产地和规格参数等,这些信息有助于构建商品的基本档案。价格信息获取:可以了解到商品的原价、促销价以及参与的各种活动信息,这对于制定销售策略…

DePT: Decoupled Prompt Tuning 论文阅读

DePT: Decoupled Prompt Tuning 了论文阅读 Abstract1. Introduction2. Methodology2.1. Preliminaries2.2. A Closer Look at the BNT Problem2.3. Decoupled Prompt Tuning 3. Experiments5. Conclusions 文章信息: 原文链接:https://arxiv.org/abs/…

微软搭建零售新媒体创意工作室大举抢占数字营销广告市场

“微软新零售创意工作室新平台利用生成式人工智能,在几秒钟内轻松定制横幅广告。零售媒体预计到2026年将成为一个价值1000亿美元的行业。” 零售媒体在过去几年中发展迅速。根据eMarketerOpens在新窗口的数据,预计到2024年,仅美国的零售媒体…

COOIS增加增强字段

SAP系统标准的工单信息报表COOIS增加客制化增强字段可以按照以下步骤处理; 1. 在显示抬头信息的输出结构IOHEADER中增加需要显示的增强字段 2. 使用BADI WORKORDER_INFOSYSTEM创建增强实施 3. 在方法TABLES_MODIFY_LAY中处理相应字段的取值逻辑

YoloV8改进策略:Block改进|轻量级的Mamba打造优秀的YoloV8|即插即用,简单易懂|附Block结构图|检测、分割、关键点均适用(独家原创)

摘要 无Mamba不狂欢,今天给大家带来一个基于轻量级Mamba的改进。模块简单易懂,即插即用! 带领大家去征服更高的领域。 论文:《LightM-UNet:Mamba 辅助的轻量级 UNet 用于医学图像分割》 https://arxiv.org/pdf/2403.05246.pdf UNet及其变体在医学图像分割中得到了广泛…

Thread和Runnable

两者都创建线程的方式,不同之处在于前者是类,后者是接口。使用的时候重写他们即可。 预热:操作系统的知识 想象此时有一条马路,走的人多了道路开始变得堵塞,如果拓宽为多车道即可解决该问题。 这便是多线程的例子。…

An Investigation of Geographic Mapping Techniques for Internet Hosts(2001年)第二部分

​下载地址:An investigation of geographic mapping techniques for internet hosts | Proceedings of the 2001 conference on Applications, technologies, architectures, and protocols for computer communications 被引次数:766 Padmanabhan V N, Subramanian L. An i…

Redis限流插件

Redis限流插件: 1:搭建层级结构 同时对 redis.log 授权 chmod 777 redis.log2:确认 redis 版本 3:下载redis配置文件 redis.conf https://redis.io/docs/management/config/ 4:上传/redis/conf作为原始 redis.conf 5:在/redis_6390/conf下编辑redis.conf docker run -it \ --…