惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
CERT Recently Published Vulnerability Notes
C
Cybersecurity and Infrastructure Security Agency CISA
S
Schneier on Security
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cyberwarzone
Cyberwarzone
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
GbyAI
GbyAI
Security Latest
Security Latest
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
C
Cisco Blogs
博客园 - 【当耐特】
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
B
Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
The Last Watchdog
The Last Watchdog
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Project Zero
Project Zero
WordPress大学
WordPress大学
L
LINUX DO - 最新话题
F
Fortinet All Blogs
L
LINUX DO - 热门话题
PCI Perspectives
PCI Perspectives
Simon Willison's Weblog
Simon Willison's Weblog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
MongoDB | Blog
MongoDB | Blog
Latest news
Latest news
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
The Hacker News
The Hacker News
爱范儿
爱范儿
O
OpenAI News
J
Java Code Geeks
T
The Exploit Database - CXSecurity.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More

音视频开发进阶

音视频教程-第三节 音视频教程-第二节 真的,AI 可能就是新时代的信息差 充值 Cursor 之后,工作有了哪些变化?🤔 个人'蒸馏'大模型能做哪些有意思的事情 DeepSeek 大模型在 Mac 上的部署和运行 音视频教程-第一节 【WebRTC 专栏】-- Android 开发集成 WebRTC 库的几种方式 【WebRTC 专栏】-- 在 Mac M1 等系列芯片编译和开发 WebRTC-Android 库 Meta Llama3 大模型在 Mac 上的部署和运行 iOS VideoToolBox 解码 HEVC Open-GOP 视频的问题排查 Flutter 状态管理之 InheritedWidget 使用和分析 用 ChatGPT 回答技术问题怎么样 ? 音视频开发系统入门大致路线 UE 4.27 添加自定义 ShadingModel 用 UE4 虚幻引擎做个捏脸小功能~~ UE4 材质练习 之 凹凸贴图偏移的使用 OpenGL上下文创建以及共享机制 007 | 播放器系列专栏-解析 MP4 文件读取信息 006 | 播放器系列专栏-在 Mac 上查看 MP4 格式信息 干货 | 快速抽取缩略图是怎么练成的? 关于直播、WebRTC、FFmpeg 的那些事 005 | 播放器系列专栏-在 Windows 上查看 MP4 格式信息 将音视频中的花屏、绿屏、黑屏问题一网打尽 关于音视频里面的解码帧率和渲染帧率 004 | 播放器系列专栏-认识MP4视频(下) 003 | 播放器系列专栏-认识MP4视频(上) 入门或者转行音视频,应该要怎么做? H264视频文件如何缩放分辨率 002 | 播放器系列专栏-FFmpeg依赖库的配置 001 | 播放器系列专栏-关于播放器项目的一个小实践 Seek策略以及在有B帧情况下的处理 目前流媒体开发工程师工作内容主要是什么? 一个音视频领域专业问答的小圈子 干货收藏 || Vulkan Game Engine 视频教程 音视频春节假期内卷指南(实操) Vulkan 在 FFmpeg 中的支持 Windows 下 FFmpeg 和 LibX264 的编译和配置 Metal 开发 | 使用 C++ 进行接口调用 音视频开发工作经验分享 || 视频版 FFmpeg 调用 MediaCodec 硬解码到 Surface 上 代码吸猫 | 用 OpenGL 图像渲染的养猫计划 百倍变速--解码到底能不能丢 非参考帧 ?FFmpeg 有话说!!! 老生常谈-FFmpeg 的编译问题轻松搞定 FFmpeg 调用 Android MediaCodec 进行硬解码(附源码) 【WebRTC 专栏】--创建相机预览 Unity Shader 光照基础之 Half Lambert 光照模型 Unity Shader 光照基础之Lambert光照模型 Unity Shader 光照基础内容 Unity Shader 显示一张图片纹理 UnityShader 的基本概念 Unity 物体的基本操作 C++ 模板系列小结07-尾置返回类型 C++ 模板系列小结06-可变参数模板特性 C++ 中的多线程的使用和线程池建设 C++ 模板系列小结05-模板类型作为模板参数 C++ 模板系列小结04-类模板中的成员模板 C++ 模板系列小结03-在模板中指定变量类型 C++ 模板系列小结02-非类型模板参数 C++ 模板系列小结01-函数模板和类模板 从零打造渲染引擎系列01-什么是渲染引擎 iOS开发 - 在 Swift 中去调用 C/C++ 代码 2021 技术新番 - 从零打造渲染引擎系列 iOS 音视频开发的一些基础准备工作 音视频交流群又来啦~~~ 【WebRTC 专栏】WebRTC & Android 开发学习环境搭建~ 【喜大普奔】域名终于备案通过啦 Shader 优化 | OpenGL 绘制网格效果 【音视频连载-011】第二季 FFmpeg 一层一层获取文件信息 KodeLife | Shader 实时编辑预览的强大工具使用实践 推荐几个堪称教科书级别的 Android 音视频入门项目 【音视频连载-010】第二季 FFmpeg 日志打印 【音视频连载-008】基础学习篇-SDL 播放 PCM 音频文件(下) 【音视频连载-007】基础学习篇-SDL 播放 PCM 音频文件(上) 【音视频连载-006】基础学习篇-SDL 播放 YUV 视频文件 【音视频连载-005】基础学习篇-SDL 加载 YUV 文件并显示 【音视频连载-004】基础学习篇-SDL 加载图片并显示 【音视频连载-003】基础学习篇-SDL 消息循环和事件响应 【音视频连载-002】基础学习篇-SDL 创建窗口并显示颜色 【音视频连载-001】基础学习篇- SDL 介绍以及工程配置 LearnOpenGL 源码在 MAC 上的编译与调试 2019 年终总结与回顾 Android NDK 开发的免费技术视频来啦~~ OpenGL 实现视频编辑中的转场效果 OpenGL 实践之贝塞尔曲线绘制 图像库 libjpeg-turbo 编译与实践 图像库 libpng 编译与实践 rust 开发编译 Android 动态库实践 Android NDK 开发 —— 从 Assets 文件夹加载图片并上传纹理 简单易用的图像解码库介绍 —— stb_image 博客图床迁移记 进击的 Vulkan 移动开发之 SwapChain 进击的 Vulkan 移动开发之 Command Buffer 进击的 Vulkan 移动开发之 Instance & Device & Queue 进击的 Vulkan 移动开发(一)之今生前世 Java 显式锁 Lock 与条件队列 C++ 标准容器库小结 MediaCodec 硬编码之相机内容编码成 H264 文件 一文读懂 YUV 的采样与格式 《OpenGL ES 3.x 游戏开发》碰撞检测之 AABB 包围盒
UE4 材质练习系列基础
音视频开发进阶 · 2022-09-10 · via 音视频开发进阶

一个专注音视频领域的小圈子

学习 UE4 虚幻引擎的一些练习。

基础概念

使用 UE 创建材质后,默认状态如下图所示,这里面有很多参数设置来决定材质的类型和用途。

创建材质默认状态

右侧是材质连接节点,左侧是材质的相关属性,选择不同的材质着色模型,右侧的连接节点会随之发生变化。

在 UE 文档中,右侧的连接节点称为主材质节点,也是最终的输出节点,负责显示出最后的结果。

主材质节点对外提供了很多输入节点,如图中所示,显示白色的输入表示该输入将影响材质,而显示灰色的输入表示它们对材质没有影响。默认情况下,主材质节点会有一些以灰色显示的输入。

可以将其他节点的输出连接到主材质显示灰色的输入节点上,但是并不会产生任何效果。要有效果的话,需要在左侧的细节面板中调节相关参数才行。

关于主材质节点的更多内容参考这里:

https://docs.unrealengine.com/4.26/zh-CN/RenderingAndGraphics/Materials/HowTo/Main_Material_Node/

主材质节点其实对应了 UE 底层的着色模型,比如默认的着色模型就是 默认光照,也是就 PBR 的 ShadingModel 。材质输入参数中的基础颜色、高光度、粗糙度、Metallic 就是 PBR 实现中 BRDF 相关的参数设置。

另外一些参数设置,比如世界场景位置偏移,就是 UE 在底层实现渲染时提供的额外输入参数了,掌握这些参数可以更好地实现效果。这就类似于 Shadertoy 网站上写着色器效果,这个网站在每个 Shader 中都提供了默认输入,比如鼠标位置、时间等,开发者在着色器中直接用就好了。

UE 中提供了多种着色模型,除了默认光照之外,还有如下:

着色模型

关于着色模型更多内容参考这里:

https://docs.unrealengine.com/4.27/zh-CN/RenderingAndGraphics/Materials/MaterialProperties/LightingModels/

接下来会尝试创建一个简单的材质:

材质创建

快捷键使用

想要更快的创建材质,很重要的技巧就是使用快捷键。

使用快捷键的一般操作都是先在键盘按住对应的字母,然后使用鼠标在蓝图中点击要放置的位置。

常量创建:

数字键 1、2、3、4 分别对应 1、2、3、4 维的常量,如下图所示:

运算操作:

快捷键 A、M、D 分别对应于加法、乘法、除法,如下图所示:

纹理操作:

快捷键 T、U 分别对应于贴图节点、UV 坐标节点,如下图所示:

除此之外,还有其他不少快捷键,就不一一列举了。

基础材质

如下所示,创建了一个简单的红砖材质,贴上了颜色、高光、粗糙度、法线、AO 等贴图。

并且把用到的纹理贴图都参数化了,同时增加了一个对 UV 的调整,可以改变 UV 采样的范围。

这是一个很简单的材质,在着色模型不变的情况下,改变的是最终连接到主材质输入节点前的结果,很多的工作都是在输入节点前做的,这也是能积累大量经验的地方,需要不断地打怪升级,目前就做个简单示例。

材质函数

在 UE 蓝图中还提供材质函数,类似于编程语言中的函数封装,可以将一些通用计算放到材质函数中去。

比如上图示例中将 UV 坐标乘以常数的操作就可以放到材质函数中去,如下图所示:

不是所有类型的参数都可以作为材质函数的输入,仅有如下的几种类型:

点击鼠标右键然后搜索 FunctionInputFunctionOutput 可以添加输入和输出节点,添加输入节点后去修改输入的类型就可以接收不同参数了,而输出节点没有修改参数类型的地方,由最终计算得到具体类型。

除了自己创建的材质函数之外,UE 还自带了不少材质函数可以使用。

具体链接可以参考这里:

https://docs.unrealengine.com/4.26/zh-CN/RenderingAndGraphics/Materials/Functions/Reference/

这些材质函数涉及到数学运算、纹理操作、图像调整、粒子效果等多个方面。

材质参数集合

材质参数集合类似于全局变量,它是一个用来存储任何标量参数和矢量参数集合的资源。可以在多个蓝图中引入相同的材质参数集合,这样一旦修改材质参数集合中的变量,所有的材质实例都会起作用。而创建单独的材质实例,修改参数后只能在该材质实例上起作用,无法改变其他材质实例。

创建材质参数集合如下所示:

创建了多个参数,但是在使用时一次只能使用一个,因为只有一个输出节点:

在材质参数集合的细节面板中要选择当前用到的参数具体是哪个,否则是识别不到参数的。

最后在关卡中,直接对材质参数集合中的变量进行修改就可以实现改变材质的结果了,不需要在材质实例中修改。

材质分层

得益于材质函数的功能,可以将材质函数作为一个完整的材质层,这时候材质函数的输出不再是计算后的单一节点了,而是完整的材质属性列表。

通过 MakeMaterialAttributes 节点创建一个材质属性列表,这列表里面包括了颜色、高光、粗糙度等各种属性,基本上和主材质节点中的属性一样了,如下所示:

可以直接把创建的材质中的节点全部复制过来,让这个材质函数自身闭环作为一个材质层,然后通过 BreakMaterialAttributes 节点再把这些属性拆分,一个一个的赋值给主材质节点。

这里只用到了一层材质,如果有多个材质函数构造的材质层,每层都有相同的属性,这时候就需要对这些属性进行混合操作,在 UE 中提供了很多 MatLayerBlend_xxxx 类似的函数进行各种混合操作。

除了混合之外,还可以对材质层做选择操作,在一定条件下选择相应的材质层。

以上就是关于材质的基本操作总结,还有很多精细的操作后续慢慢摸索了。

渲染管线

最后,完成材质创建并且赋给了对应的模型后,可以通过 profilegpu 命令查看当前的渲染管线。

关于渲染管线的更多内容,后续再慢慢学习 UE 的源码了!!!

原创文章,转载请注明来源:    UE4 材质练习系列基础