Unity3d Shader篇(二)— 片元漫反射着色器解析

文章目录

  • 前言
  • 一、片元漫反射着色器是什么?
    • 1. 片元漫反射着色器的工作原理
    • 2. 顶点漫反射着色器和片元漫反射着色器的比较
      • 顶点漫反射着色器
        • 优点:
        • 缺点:
      • 片元漫反射着色器
        • 优点:
        • 缺点:
  • 二、使用步骤
    • 1. Shader 属性定义
    • 2. SubShader 设置
    • 3. 渲染 Pass
    • 4. 定义结构体和顶点着色器函数
    • 5. 片元着色器函数
  • 三、效果
  • 四、总结


前言

在 Unity 中,Shader 可以用来实现各种视觉效果。本教程将详细介绍如何编写一个基于片元漫反射的着色器,使物体的颜色根据光照和法线方向的变化而变化。


一、片元漫反射着色器是什么?

1. 片元漫反射着色器的工作原理

片元漫反射着色器(Fragment Diffuse Shader)是一种用于在渲染过程中模拟物体表面的漫反射光照效果的着色器。它在每个像素(片元)级别计算光照效果,根据光源的位置和物体表面的法线方向来确定像素的颜色值。片元漫反射着色器通常用于创建逼真的光照效果,使物体的表面在不同的光照条件下呈现出合适的明暗和颜色变化。

2. 顶点漫反射着色器和片元漫反射着色器的比较

顶点漫反射着色器

工作原理:在顶点级别计算光照效果,将结果传递到片元着色器进行渲染。

优点:

计算开销相对较低,适用于大型场景或性能受限环境。
具有较好的性能表现,尤其在移动设备上。

缺点:

光照效果相对简单,可能缺乏真实感。
可能无法准确地模拟一些复杂的光照场景,如阴影和反射。

片元漫反射着色器

工作原理:在每个像素(片元)级别计算光照效果,直接在片元着色器中进行光照计算。

优点:

能够更准确地模拟光照效果,包括阴影和反射等。
提供更高的视觉真实感,可以产生更细致的光照效果。

缺点:

计算开销较大,可能影响性能,特别是在复杂场景中或移动设备上。
可能需要更多的计算资源,不适用于性能要求较高的应用场景。

二、使用步骤

1. Shader 属性定义

Properties
{
    _Diffuse("Diffuse", Color) = (1, 1, 1, 1) // 漫反射颜色属性,默认白色
}

这段代码定义了 Shader 的属性。在本例中,我们只有一个属性 _Diffuse,表示物体的基本颜色,使用 RGBA 形式表示。默认为白色。

2. SubShader 设置

SubShader
{
    Tags
    {
        "RenderType" = "Opaque" // 渲染类型为不透明
    }
    
    LOD 100 // 细节级别
}

SubShader 定义了一组渲染设置,包括标签和细节级别。在这里,我们将渲染类型标签设置为 “Opaque”,表示物体是不透明的。

3. 渲染 Pass

Pass
{
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag

    #include "UnityCG.cginc"
    #include "Lighting.cginc"
}

这里开始了渲染 Pass 部分。在这里,我们使用了 CGPROGRAM 指令来声明顶点着色器和片元着色器函数。#pragma vertex vert 和 #pragma fragment frag 分别指定了顶点着色器函数和片元着色器函数的名称。

然后,我们包含了 UnityCG.cginc 和 Lighting.cginc,它们提供了许多有用的函数和宏,用于简化编写 Shader。

4. 定义结构体和顶点着色器函数

struct v2f
{
    float4 vertex : SV_POSITION; // 顶点位置
    fixed3 worldNormal : TEXCOORD0; // 颜色
};

v2f vert(appdata_base v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex); // 顶点位置变换到裁剪空间
    fixed3 worldNormal = UnityObjectToWorldNormal(v.normal); // 世界空间法线
    o.worldNormal = worldNormal;

    return o;
}

这里定义了结构体 v2f,用于从顶点着色器向片元着色器传递数据。在顶点着色器函数中,我们将顶点位置转换到裁剪空间,并计算世界空间的法线向量。

5. 片元着色器函数

fixed4 frag(v2f i) : SV_Target
{
    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //获取环境光
    fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); //获取光源位置
    fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldLight, i.worldNormal)); // 计算漫反射
    fixed3 color = diffuse + ambient; // 最终颜色
    return fixed4(color, 1); // 输出颜色
}

片元着色器函数计算最终的颜色。首先,我们获取环境光和光源位置。然后,计算漫反射光照,并将环境光和漫反射光照相加得到最终颜色。

三、效果

顶点漫反射效果
在这里插入图片描述
片元漫反射效果
在这里插入图片描述
左:顶点漫反射 右:片元漫反射
在这里插入图片描述

四、总结

片元漫反射和顶点漫反射都是用于模拟物体在光照条件下的表现的重要技术。
片元漫反射提供了更精细的光照效果,适用于需要高度真实感和精细光照效果的场景;而顶点漫反射则适用于对性能要求较高的场景或需要大量物体渲染的场景。
在实际应用中,根据需求和场景的不同,可以选择合适的着色器技术来实现所需的光照效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【奶奶看了都会】《幻兽帕鲁》云服务器部署教程

在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或肢解后食用。 《幻兽帕鲁》官…

PostgreSQL 也很强大,为何在中国大陆,MySQL 成为主流,PostgreSQL 屈居二线呢?

问题: PostgreSQL 也很强大,为何在中国大陆,MySQL 成为主流,PostgreSQL 屈居二线呢?PostgreSQL 能否替代 MySQL? 当我们讨论为何 MySQL 在中国大陆成为主流而 PostgreSQL 屈居二线时, 我们其实…

在conda 虚拟环境中快速卸载安装包(操作详解)

手动卸载虚拟环境中的安装包 1.卸载已经安装的安装包(不指定版本好) pip uninstall 包名 2.卸载指定的安装包 pip uninstall 包名版本号 注意 “” 不是 “” 批量快速卸载 写一个txt文件,例如aaa.txt。官网一般是requirements.txt&…

NLP_统计语言模型的发展历程

文章目录 统计语言模型发展的里程碑: 上半部分是语言模型技术的进展;下半部分则是词向量(词的表示学习)技术的发展。其中,词向量表示的学习为语言模型提供了更高质量的输入信息(词向量表示) 1…

AI新工具(20240203) 文心一言APP数字分身;HuggingChat Assistants等

文心一言APP数字分身-一键生成专属数字分身 文心一言数字分身是一项新功能,用户只需一张照片和录制三句语音,就能创建一个专属的数字分身。这个数字分身还支持个性化定义名称、声音、MBTI性格等,用户可以选择是否公开自己的数字分身。这个功…

11 插入排序和希尔排序

1. 插入排序 基本思想 直接插入排序是一种简单的插入排序法,基本思想: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 在玩扑克牌时,就用…

虚拟存储器

第五章:虚拟存储器 常规存储管理方式的特征 一次性 驻留性 局部性原理 程序在执行时将呈现出局部性特征,即在一较短的时间内,程序的执行仅局限于某个部分,相应地,它所访问的存储空间也局限于某个区域 时间局限性 …

创建一个Vue项目(含npm install卡住不动的解决)

目录 1 安装Node.js 2 使用命令提示符窗口创建Vue 2.1 打开命令提示符窗口 2.2 初始Vue项目 2.2.1 npm init vuelatest 2.2.2 npm install 3 运行Vue项目 3.1 命令提示符窗口 3.2 VSCode运行项目 1 安装Node.js 可以看我的这篇文章《Node.js的安装》 2 使用命令提示…

【定位·HTML】

定位布局可以分为以下四种: 静态定位(inherit) 相对定位(relative) 绝对定位(absolute) 固定定位(fixed) 一般的标签元素不加任何定位属性时,默认都属于静态…

STM32标准库——(9)TIM编码器接口

1.编码器接口简介 Encoder Interface 编码器接口编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用定…

linux ln命令-linux软链接、硬链接-linux软、硬链接的区别(二):软链接

0、序 上一篇:linux ln命令-linux软链接、硬链接-linux软、硬链接的区别(一):硬链接 描述了硬链接相关内容,本篇主要描述软链接。 1、软链接 符号链接也称软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。…

已解决!AttributeError: ‘Sequential‘ object has no attribute ‘session‘ 问题

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

【Android新版本兼容】onBackPressed()方法被弃用的解决方案

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、使用 AndroidX API 实现预测性返回手势1.1 添加依赖1.2 启用返回手势1.3 注册OnBackPressedCallback()方法来处理返回手势 一、使用 AndroidX API 实现预测…

React | Center 组件

在 Flutter 中有 Center 组件,效果就是让子组件整体居中,挺好用。 React 中虽然没有对应的组件,但是可以简单封装一个: index.less .container {display: flex;justify-content: center;align-items: center;align-content: ce…

京东微前端框架MicroApp简介

一、MicroApp 1.1 MicroApp简介 MicroApp是由京东前端团队推出的一款微前端框架,它从组件化的思维,基于类WebComponent进行微前端的渲染,旨在降低上手难度、提升工作效率。MicroApp无关技术栈,也不和业务绑定,可以用于任何前端框架。 官网链接:https://micro-zoe.gith…

Neo4j安装部署(windows、docker)

文章目录 Neo4j安装部署前言windows系统安装解压压缩包并进入bin目录查看neo4j的相关命令访问7474端口 Docker安装Neo desktop安装 Neo4j安装部署 前言 这篇blog所涉及的资源都可以在[neo4j相关资源]进行下载。 windows系统安装 解压压缩包并进入bin目录 查看neo4j的相关命…

正则表达式与文本处理工具

目录 引言 一、正则表达式基础 (一)字符匹配 1.基本字符 2.特殊字符 3.量词 4.边界匹配 (二)进阶用法 1.组与引用 2.选择 二、命令之-----grep (一)基础用法 (二)高级用…

FL Studio 21.2.2官方中文版重磅发布2024最新FL21下载安装图文使用教程

FL Studio 21.2.2中文版惯称水果编曲, 是一个完整的电音软件音乐制作环境或数字音频工作站。是现在流行的数字音频工作站之一,包括撰写,整理,记录,编辑,电音,混音和掌握专业品质的音乐。 FL Studio 21.2.2编曲软件即“Fruity Loops Studio”,简称FL,也就…

【C++初级篇】C++入门

目录 1. C关键字(C98) 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用 6.1 引用概念 6.2 引用特性 6.3 常引用 6.4…

时间复杂度为 O(n) 的排序算法

大家好,我是 方圆。本文介绍线性排序,即时间复杂度为 O(n) 的排序算法,包括桶排序,计数排序和基数排序,它们都不是基于比较的排序算法,大家重点关注一下这些算法的适用场景。 桶排序 桶排序是分治策略的一…