自由学习记录(45)

news2025/3/25 23:56:02

顶点片元着色器(important)

1.需要在Pass渲染通道中编写着色器逻辑
2.可以使用cG或HLSL两种shader语言去编写Shader逻辑
3.代码量较多,灵活性较强,性能消耗更可控,可以实现更多渲染细节
4.适用于光照处理较少,自定义染效果较多时(移动平台首选)

表面着色器是Unity对顶点/片元着色器的封装
可以用更少的代码实现复杂的逻辑
但是性能和可控性较差
它的特点是
1.直接在subshader语句块中书写着色器逻辑
2.我们不需要关心也不需要使用多个Pass,每个Pass如何染,Unity会在内部帮助我们去处理
3.可以使用cG或HLSL两种shader语言去编写shader逻辑
4.代码量较少,可控性较低,性能消耗较高
5.适用于处理需要和各种光源打交道的着色器,但是在移动平台上需要注意性能表现

表面着色器 和顶点/片元着色器这两种unity Shader形式都使用了可编程管线
而对于一些老设备(Dx7.0、0penGL1.5或OpenGLES1.1):它们不支持可编程管线着色器
这时就需要使用固定函数着色器来进行渲染
这些着色器只能实现一些非常简单的效果
它的特点是:
1.需要在Pass染通道中编写着色器逻辑
2.需要使用shaderLab语法中的染设置命令来编写,而非cG和HLSL着色器语言
但是由于这些旧设备目前市面上几乎已经没有了
所以固定函数着色器我们几乎不会再使用
只做了解即可
即使我们现在在unity中使用固定函数着色器来编写Shader,在内部也会被编译为顶点/片元着色器
因此真正意义的固定函数着色器已经不存在了

subshader语句块


渲染标签

通过标签来确定什么时候以及如何对物体进行渲染

渲染队列(Render Queue)优化渲染效率、正确处理透明物体、减少渲染错误

队列名队列值(Queue)渲染顺序(从小到大)用途
Background1000最早渲染用于背景物体,通常比不透明物体更早渲染
Geometry2000渲染大部分不透明物体绝大多数 3D 模型、地面、建筑
AlphaTest2450用于透明裁剪(如叶子、栅栏)用于 clip() 处理的材质,如草丛、栅栏
Transparent3000后渲染(需要正确混合透明效果)玻璃、水、烟雾等需要 Alpha 混合的对象
Overlay4000最晚渲染UI、HUD、特效等最前景的物体

(Opaque) → 应该先渲染,因为它们会遮挡后面的物体,减少 GPU 计算量

(Transparent) → 必须后渲染,否则无法正确混合(比如玻璃、水等)透明物体依赖前面已经渲染好的背景

特效、后处理 → 可能需要在所有物体之后渲染。

  • 你有 半透明水,希望它在透明物体 之后 渲染,但又不想晚于 UI → 可以设定 "Queue" = "Transparent + 10"
  • 你有 特效 Shader,希望它比普通透明物体 稍早渲染,避免遮挡问题 → 可以设定 "Queue" = "Transparent - 1"

RenderType方便 Unity 进行批量优化,

渲染管线(Render Pipeline)或后处理效果(Post Processing)可以识别、管理和优化不同类型的 Shader

一个 SubShader 只能有一个 RenderType

当使用批处理时,模型会被变换到世界空间中,模型空间会被丢弃
这可能会导致某些使用模型空间顶点数据的shader最终无法实现想要的结果
可以通过开启禁用批处理来解决该问题


 

渲染状态

通过状态来确定渲染时的剔除方式、深度测试方式、混合方式等等内容

Shader 间接控制片元,光栅化阶段(Rasterization) 生成GPU 底层的片元

Shader 控制的片元是 GPU 片元的“表现层”

片元(Fragment)主要由片元着色器(Fragment Shader)或像素着色器(Pixel Shader)控制,表示屏幕上即将被渲染的像素信息(颜色、深度等)

剔除,就是不渲染,背面剔除就是背面不渲染,正面剔除就是正面不渲染,不剔除就是都渲染

Cull Back背面剔除
Cull Front正面剔除
Cull off不剔除
不设置的话,默认为背面剔除

深度缓冲(Depth Buffer):
深度缓冲是一个与屏幕像素对应的缓冲区,用于存储每个像素的深度值(距离相机的距离)。
在渲染场景之前,深度缓冲被初始化为最大深度值,表示所有像素都在相机之外。
最后留在深度缓冲中的信息会被染
ZWrite on写入深度缓冲
Zwrite off不写入深度缓冲
不设置的话,默认为写入
一般情况下,我们在做透明等特殊效果时,会设置为不写入

当前像素的深度值小于深度缓冲中的值,说明当前像素在其他物体之前,它会被绘制,并更新深度缓冲。
当前像素的深度值大于等于深度缓冲中的值,说明当前像素在其他物体之后,它会被丢弃,不会被绘制,并保持深度缓冲不变。

当前深度缓冲中的值

ZTest Less
ZTest Greater
ZTest LEqual 小于等于
ZTest GEqual 大于等于
ZTest Equal
ZTest NotEqual不等于当前深度缓冲中的值,就通过测试,写入到深度缓冲中
ZTestAlways 始终通过深度测试,写入深度缓冲中
不设置的话,默认为LEqual

深度缓冲(Z-Buffer)用于存储每个像素的深度值(Z 值),片元的深度值由 投影变换后的位置 计算得出

混合是在深度测试之后去进行的,混合过后它就会把颜色存入到一个颜色缓冲区当中,颜色缓冲区其实就是一个内存空间,

混合(Blending)决定当前片元的颜色如何与已经存储在颜色缓冲区的颜色进行合成,常用于半透明材质、特效(如火焰、光晕、烟雾)

混合发生在 深度测试(Z-Test)之后,颜色写入(Color Write)之前:先检查 当前片元(Fragment) 是否应该被渲染,如果当前片元被挡住(ZTest 失败) → 直接丢弃,不执行混合

如果通过,获取当前片元的颜色(源颜色,SrcColor),获取颜色缓冲区(Framebuffer)中的颜色(目标颜色,DstColor)

常见的混合模式(Blend Mode)

混合模式公式用途
Alpha 混合FinalColor = SrcColor * SrcAlpha + DstColor * (1 - SrcAlpha)玻璃、烟雾、透明物体
Additive(加法混合)FinalColor = SrcColor * 1 + DstColor * 1光效、火焰、魔法特效
Multiplicative(乘法混合)FinalColor = SrcColor * DstColor阴影、滤镜效果

Shader "Custom/LODExample"
{
    SubShader
    {
        LOD 100
        Pass { /* 低 LOD 的 Shader 代码 */ }
    }

    SubShader
    {
        LOD 300
        Pass { /* 高 LOD 的 Shader 代码 */ }
    }
}

ColorMask 配置用途
ColorMask RGB忽略 Alpha 通道,避免透明度影响
ColorMask A仅写入 Alpha,用于特效
ColorMask 0只影响深度缓冲,不影响颜色(Shadow Map)

一个Shader设定之后,执行顺序

步骤执行阶段Shader 相关代码作用
① 解析 Shader 标签Shader 解析阶段Tags { "Queue"="Geometry" }确定渲染顺序、是否透明
② 选择 SubShader运行时自动匹配LOD 300选择适合当前硬件的 Shader
③ Pass 开始GPU 处理Pass {}进入渲染 Pass
④ 处理渲染状态设置 GPU 状态Cull BackZTest Less控制渲染面、深度计算方式
⑤ 片元着色器执行GPU 计算颜色frag()计算颜色值
⑥ 深度测试片元写入前ZTestZWrite确保正确的片元渲染
⑦ 颜色混合颜色计算Blend计算透明度混合
⑧ 颜色写入最终像素写入ColorMask RGB控制通道写入

在subshader语句块中使用渲染状态会影响之后的所有渲染通道Pass
在Pass语句块中使用渲染状态只会影响当前Pass渲染通道,不会影响其他的Pass

渲染通道

具体实现着色器代码的地方(每个subshader语句块中至少有一个渲染通道,可以有多个)

Unity内部会把Pass名称转换为大写字母
因此在使用usePass命令时必须使用大写形式的名字

在其他shader中复用该Pass代码时
UsePass "TeachShader/Lesson4/MYPAss"

但是subshader语句块中的 渲染标签 不能够在Pass中使用
Pass当中有自己专门的标签

1.Tags{"LightMode”=“标签值"}
主要作用
指定了该Pass应该在哪个阶段执行
可以将着色器代码分配给适当的渲染阶段,以实现所需的效果

Always
始终渲染:不应用光照
ForwardBase
在前向渲染中使用:应用环境光、主方向光、顶点/SH光源和光照贴图
ForwardAdd
在前向染中使用:应用附加的每像素光源(每个光源有一个通道)
Deferred
在延迟渲染中使用;渲染G缓冲区
Shadowcaster
将对象深度染到阴影贴图或深度纹理中
MotionVectors
用于计算每对象运动矢量
PrepassBase
在旧版延迟光照中使用;渲染法线和镜面反射指数
PrepassFinal
在旧版延迟光照中使用:通过组合纹理、光照和反光来渲染最终颜色
Vertex
当对象不进行光照贴图时在旧版顶点光照谊染中使用;应用所有顶点光源
VertexLMRGBM
当对象不进行光照贴图时在旧版顶点光照渲染中使用;在光照贴图为 RGBM 编码的平台上(PC 和游戏主机)
VertexLM
当对象不进行光照贴图时在旧版顶点光照渲染中使用;在光照贴图为双LDR编码的平台上(移动平台)

2.Tags{“RequireOptions”=“标签值”}
主要作用
用于指定当满足某些条件时才渲染该Pass

3.Tags{"PassFlags"="标签值"}
主要作用:
一个染通道Pass可指示一些标志来更改染管线向Pass传递数据的方式

目前unity仅支持
Tags{"PassFlags"="OnlyDirectional"}

意味着非重要光源的数据将不会传递到顶点光源或球谐函数着色器变量

备用shader的语法非常简单
Fallback "shader名"
或者
FallbackOff
它的主要作用就是提供“救命稻草”
我们一般会使用较为低级的效果作为备用shader
确保对象在低端设备上也能够正常渲染

-------------------

Shader的属性主要就是三种类型
数值、颜色和向量、纹理贴图
我们只需要掌握属性声明的基础语法即可
它的主要是:
1.可以在材质面板被编辑
2.可以在后续当作输入变量提供给所有子着色器使用

纹理贴图属性的定义

1.颜色
Name("Display Name",Color) =(number1,number2,number3,number4)
注意:颜色值中的RGBA的取值范围是0~1(映射e~255)
2.向量
Name("Display Name",Vector)=(number1,number2,number3,number4)
注意:向量值中的XYZW的取值范围没有限制

Shader选择的路径

1.直接修改shader文件中Shader后的名字即可
2.Shader的名字决定了在材质面板的选择路径

可以选择对应的图形接口,生成查看(方便根据不同平台的情况去查看Shader生成的对应代码)

PBR 参数(Metallic、Smoothness、Albedo)FX Shader(特效 Shader)

一般的使用流程是
Shader---材质----赋值给GameObject对象上依附的MeshRenderer等相关渲染器组件上进行使用

为什么 Unity 需要 ShaderLab?

ShaderLab 是 Unity 专用的着色器(Shader)编写语言,用于定义 Unity 渲染管线如何处理 材质、光照、特效 等。它的作用类似于 OpenGL 的 GLSL、DirectX 的 HLSL,但 ShaderLab 不是单纯的编程语言,而是一个着色器封装框架,允许你在 Unity 里编写 Shader 代码,同时管理材质参数和渲染状态。

提供了 结构化的写法可以用 HLSL(高阶着色器语言) 来写 Shader

管理 Pass、渲染状态、ShaderLab 里定义 Shader 变量、HLSL 计算最终颜色

Unity 默认的所有 Shader 都是 ShaderLab 结构

Unity 的核心设计理念是 跨平台 + 可扩展、允许开发者自定义 Shader、兼顾不同的渲染后端(如 DirectX、OpenGL、Vulkan、Metal)

Windows(DirectX)、Mac(Metal)、安卓(Vulkan)、WebGL(OpenGL)每个平台的 Shader 语言都不一样

ShaderLab 的核心作用就是对各个平台的 Shader 语言进行封装和统一,让开发者在 Unity 里写 Shader 时不需要直接面对不同的底层 API(DirectX、Metal、Vulkan、OpenGL),而是通过 ShaderLab 提供的统一结构来管理和适配不同平台。

Technical Artist核心技能要求:

Shader & 渲染优化(最核心)第 1 阶段:3-5 周】

为什么先学 Shader?
Shader 是 TA 的核心技能,它控制了画面的最终呈现,而且学 Shader 能直接出作品,有利于建立信心和作品集。

学习 Shader 编程

  • HLSL(Unity) → Unity Shader Graph + ShaderLab
  • GLSL(OpenGL)(如果以后想研究 OpenGL)
  • Unreal Shader(USF)(如果想做 Unreal 开发)
  • 练习:写几个基础 Shader(溶解、描边、透明效果)

理解现代渲染管线

  • 先学 Unity SRP(URP/HDRP)
  • 再学 Unreal 渲染架构(Deferred / Forward)
  • 练习:用 Unity URP/HDRP 写一个 PBR Shader

性能优化

  • Draw Call 优化
  • GPU Profiler 调试
  • LOD、贴图优化
  • 练习:优化一个小场景(减少 Draw Call,提升 FPS)

美术工具 & 资产管线第 2 阶段:3-4 周】

为什么第二步学美术工具?
Shader 只是渲染的一部分,但模型、贴图、动画 都由美术资源决定,你要学会如何处理这些资源,提高美术生产效率。

熟悉 3D 美术工具

  • Maya / Blender(基本建模、绑定)
  • Photoshop(贴图处理)
  • ZBrush(雕刻,次世代角色管线)
  • 练习:制作一个简单的 3D 角色(带 UV 和贴图)

资产管线(Art Pipeline)

  • 如何高效导入游戏资源(FBX、USD、GLTF)
  • 练习:导出 FBX,并正确在 Unity / Unreal 里显示

材质 & 贴图

  • UV 贴图、法线贴图、光照贴图(Lightmap)
  • 练习:给一个 3D 物体制作完整材质

编程能力(技术美术必备)第 3 阶段:4-6 周】

为什么第三步学编程?
Shader 和美术技能都有了之后,就需要写工具来提升工作流效率,比如自动化模型导入、Shader 调试工具等。

掌握一门编程语言

  • C++(Unreal Engine)
  • C#(Unity,SRP、Editor Tool)
  • Python(Maya / Blender 插件,工具开发)
  • 练习:用 Python 写一个 Maya 插件(自动导出 FBX)

图形 API(进阶,选学)

  • OpenGL / DirectX / Vulkan(如有更深入需求)
  • 练习:用 OpenGL 画一个简单的模型渲染

工具开发

  • 用 Python/C++ 编写插件,提升美术工作效率
  • 练习:制作一个 Unity 编辑器工具(批量修改 Shader 参数)

美术基础 & 审美 -----长期积累

为什么美术基础放到第四步?
因为审美是长期积累的东西,你需要在 Shader、美术管线、工具开发的过程中不断锻炼它。

良好的色彩、光影、构图感

  • 练习:调整一个 3D 场景的光照,让它更好看
  • 练习:用后处理(Post Processing)做出电影感

了解动画、绑定

  • 角色管线:绑定、蒙皮(Maya / Blender)
  • 动画导入导出、IK 处理
  • 练习:绑定一个角色,并在游戏中正确播放动画

加分项(可选学习)

这些内容可以在 掌握了基础之后 选择性学习。

VFX(特效)

  • Unity VFX Graph、Unreal Niagara
  • 粒子系统、流体模拟(Houdini)
  • 练习:制作一个魔法特效

后处理(Post Processing)

  • Bloom、DOF、Motion Blur、Color Grading
  • 练习:制作一个高质量的后处理特效

机器学习(次世代游戏优化)

  • AI 生成贴图、智能 LOD 优化
  • 了解 NVIDIA DLSS、AI Upscaling
  • 练习:用 AI 生成贴图并优化资源

30 天计划快速入门:

第 1-2 周(Shader 基础)

✅ 了解 Unity ShaderLab / HLSL
✅ 做一个溶解 Shader、描边 Shader
✅ 了解光照模型(PBR)

第 3-4 周(渲染优化 + 美术管线)

✅ 了解 Unity SRP / HDRP
✅ 了解 Draw Call 优化、GPU Profiler
✅ 掌握 Maya、PS 的基础,能导入 3D 资源

第 5-6 周(编程 + 自动化工具)

✅ 掌握 C++ / C#(Unity / Unreal)
✅ 用 Python 写一个工具,优化美术管线
✅ 用 C# 在 Unity 里开发一个小插件

第 7 周(整合作品)

✅ 制作一个 Shader + VFX 效果
✅ 导出 FBX,优化资源,并展示在游戏中
✅ 用 GPU Profiler 进行优化

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

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

相关文章

数据源支持远程Excel/CSV,数据集支持分组字段功能,DataEase开源BI工具v2.10.6 LTS版本发布

2025年3月17日,人人可用的开源BI工具DataEase正式发布v2.10.6 LTS版本。 这一版本的功能变动包括:数据源方面,新增支持远程Excel/CSV数据源,支持以HTTP、HTTPS、FTP协议获取远程服务器上的Excel和CSV数据文件,并且可以…

SpringBoot3使用CompletableFuture时java.util.ConcurrentModificationException异常解决方案

问题描述 在Spring Boot 3项目中,使用CompletableFuture进行异步编程时,偶发{"code":500,"msg":"java.util.ConcurrentModificationException"}异常,但代码中并未直接操作List或CopyOnWriteArrayList等集合类…

STM32__红外避障模块的使用

目录 一、红外避障模块 概述 二、直接读取OUT引脚电平 三、使用中断方式触发 一、红外避障模块 概述 引脚解释: VCC接3.3V 或 5.0VGND接开发板的GNDOUT数字量输出(0或1); 低电平时表示前方有障碍 ; 通过可调电阻调整检测距离 产品特点: …

Redis JSON 用id读取content总结(sendCommand())

Redis JSON 读取总结(方法 2 - sendCommand()) 💡 背景 在 Redis 中,我们存储了 JSON 数据,并希望通过 Jedis sendCommand() 方式读取 JSON 里的 "content" 字段。由于 jedis.jsonGet() 可能在旧版本不支持…

基于3DMax与Vray引擎的轻量级室内场景渲染实践

欢迎踏入3DMAX室内渲染的沉浸式学习之旅!在这个精心设计的实战教程中,我们将携手揭开3DMAX与Vray这对黄金搭档在打造现实室内场景时的核心奥秘。无论您是渴望入门的3D新手,还是追求极致效果的专业设计师,这里都将为您呈现从场景蓝图构建到光影魔法施加的完整技术图谱。我们…

QT Quick(C++)跨平台应用程序项目实战教程 2 — 环境搭建和项目创建

目录 引言 1. 安装Qt开发环境 1.1 下载Qt安装包 1.2 安装Qt 1.3 安装MSVC编译器 2. 创建Qt Quick项目 2.1 创建新项目 2.2 项目结构 2.3 运行项目 3. 理解项目代码 3.1 main.cpp文件 3.2 Main.qml文件 引言 在上一篇文章中,我们介绍了本教程的目标和结…

登山第二十梯:无人机实时自主探索——我是一只小小小鸟

文章目录 一 摘要 二 资源 三 内容 一 摘要 自主探索是无人机 (UAV) 各种应用的基本问题。最近,基于 LiDAR 的探索因其能够生成大规模环境的高精度点云地图而受到广泛关注。虽然点云本身就为导航提供了信息,但许多现有的勘探方…

word插入Mathtype公式居中和自动更新

word插入公式自动更新 前提:安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…

网络层之IP协议

在讨论传输层时, 我们都只讨论了发送方和接收方的问题, 而没有讨论中间的网络形态的问题. 也就是数据包如何从主机传送到主机的? 如图, 主机B发送数据到主机C, 发送报文需要进行路径选择, 主机B-> F-> G-> H-> C-> D -> 主机C 这条路径是如何被选择出来的?…

基于springboot的旅游网站(013)

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理…

人工智能 - 在 Spring Boot 中调用 AnythingLLM+DeepSeek 的知识库获取消息接口

整体逻辑: 自建系统的web UI界面调用接口: 1.SpringBoot接口:/anything/chatMessageAnything 2.调用anythingLLM - 调用知识库deepseek r1 . 部署 AnythingLLM DeepSeek 本地知识库 的环境要求如下: 一、硬件要求 CPU 最低:4核&#x…

体育直播模板nba英超直播欧洲杯直播模板手机自适应

源码名称:体育直播模板nba英超直播欧洲杯直播模板手机自适应帝国cms 7.5模板 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 模板特点: 程序伪静态…

STM32-ARM

一、体系架构 ARM里有37个寄存器ALU算数逻辑单元PC程序计数器:指向哪里执行哪里SP栈指针寄存器LR链接寄存器:保存函数入口地址CPSR(current program status register)当前程序状态寄存器:SOSR(CPSR的备份)MMU(内存管理单元)Cache高速缓冲(iCa…

ripro 主题激活 问题写入授权Token失败,可能无文件写入权限

ripro 主题激活 问题 写入授权Token失败,可能无文件写入权限 找到主题下面的functions.php文件,给其他写入权限。就好了。

计算机网络——通信基础和传输介质

物理层任务:实现相邻节点之间比特(0或1)的传输 到了数据链路层之后,它会以帧为单位,把若干个比特交给物理层,物理层需要把这些比特信息转化成信号,在物理传输媒体上进行传输 通信基础基本概念 信…

python-selenium 爬虫 由易到难

本质 python第三方库 selenium 控制 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动(不容易遇到版本或者兼容性的问题) 驱动下载网址:链接: link 1、实战1 (1)安装 selenium 库 pip install selenium&#…

Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac‘.

What went wrong: Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac’. Could not resolve all files for configuration ‘:path_provider_android:androidJdkImage’. Failed to transform core-for-system-modules.jar to match attributes {…

T113-i开发板的休眠与RTC定时唤醒指南

​​在嵌入式系统设计中,休眠与唤醒技术是优化电源管理、延长设备续航的关键。飞凌嵌入式基于全志T113-i处理器开发设计的OK113i-S开发板提供了两种休眠模式:freeze和mem,以满足不同应用场景下的功耗与恢复速度需求。本文将详细介绍如何让OK1…

基于Spring Boot的公司资产网站的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

基于CVX优化器的储能电池调峰调频算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 原理概述 4.2 CVX工具箱概述 5.完整工程文件 1.课题概述 基于CVX优化器的储能电池调峰调频算法matlab仿真。CVX 是一种用于求解凸优化问题的强大工具。凸优化问题具有良好的数学性质,能…