diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..8004877 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,10 @@ +{ + "MD033": { + "allowed_elements": [ + "nobr", + "sup", + "font" + ] + }, + "MD013": false +} diff --git a/content/AI/Stable Difussion/index.md b/content/AI/Stable Difussion/index.md new file mode 100644 index 0000000..5bc8280 --- /dev/null +++ b/content/AI/Stable Difussion/index.md @@ -0,0 +1,58 @@ +# Stable Difussion + +## 云盘部署 + +[AI 绘画神器 Stable Diffusion 基础教程](https://zhuanlan.zhihu.com/p/617971918) +[Stable Diffusion云端部署攻略](https://www.uisdc.com/stable-diffusion-2) +[https://github.com/camenduru/stable-diffusion-webui-colab](https://github.com/camenduru/stable-diffusion-webui-colab) + +## 插件 + +[汉化插件](https://github.com/VinsonLaro/stable-diffusion-webui-chinese) + +- 安装中文扩展插件:点击 Extensions 选择 Install from URL,输入 ,点击 Install,并重启 WebUI +- 切换到中文模式:在 Settings 面板中,将 User interface 中的 Localization 设置成 Chinese 中文模式,重启 WebUI 即可切换到中文界面 + +[Prompt 中文输入](https://github.com/butaixianran/Stable-Diffusion-Webui-Prompt-Translator) + +- 下载提示词中文扩展插件: ,将项目作为 zip 文件下载,解压后放到 stable-diffusion-webui/extensions 目录中,重启 WebUI +- 调用百度翻译 API:去 api.fanyi.baidu.com 申请一个免费 API Key,并将翻译服务开通。在管理控制台的开发者信息页中确认 APP ID 和 密钥 +- 在 Stable Diffusion WebUI 的 Prompt Translator 面板中,选择百度翻译引擎,并将申请的 APP ID 和 密钥填写进去,点击保存 +- 使用:在 Stable Diffusion WebUI 页面顶部会出现一个翻译工具栏,我们在提示词输入框中输入中文,点击工具栏中的翻译就能自动把提示词替换成英文 + +## 参数说明 + +- Sampling Method:取样的方法,会影响照片产生的细节 +- Sampling Steps:取样次数,次数越高,花费的时间越久,细节当然也越好 +- Restore faces:修正脸部问题 +- Hires.fix:修正高取样的情况下,背景变得很奇怪的状况 +- Width:图片的宽度 +- Height:图片的高度 +- Batch count:生成几张图 +- Batch size:同时算几张图片 +- CFG Scale:要 AI 多么听从你的指令去生成图,这个值越低的话,生成图可能不一定会照你的要求,但可能会有惊喜 +- Seed:种子值,可以看作是随意值,在同样的参数下,这个值不同就会产生不同的样子 + +## Prompt 语法技巧 + +Prompt 提示词可以分为 4 段式结构:画质画风 + 画面主体 + 画面细节 + 风格参考 + +- 画面画风:主要是大模型或 LoRA 模型的 Tag、正向画质词、画作类型等 +- 画面主体:画面核心内容、主体人/事/物/景、主体特征/动作等 +- 画面细节:场景细节、人物细节、环境灯光、画面构图等 +- 风格参考:艺术风格、渲染器、Embedding Tag 等 + +### 提示词语法 + +- 提示词排序:越前面的词汇越受 AI 重视,重要事物的提示词放前面 +- 增强/减弱:(提示词:权重数值),默认 1,大于 1 加强,低于 1 减弱。如 (doctor:1.3) +- 混合:提示词 | 提示词,实现多个要素混合,如 [red|blue] hair 红蓝色头发混合 +- <+> 和 AND:用于连接短提示词,AND 两端要加空格 +- 分步渲染:[提示词 A:提示词 B:数值],先按提示词 A 生成,在设定的数值后朝提示词 B 变化。如[dog:cat:30] 前 30 步画狗后面的画猫,[dog:cat:0.9] 前面 90%画狗后面 10%画猫 +- 正向提示词:masterpiece, best quality 等画质词,用于提升画面质量 +- 反向提示词:nsfw, bad hands, missing fingers……, 用于不想在画面中出现的内容 +- Emoji:支持 emoji,如 😍 形容表情,🖐 修饰手 + +### 常用提示词举例 + +![images](../images/prompt_word_examples.jpeg) diff --git a/content/AI/images/prompt_word_examples.jpeg b/content/AI/images/prompt_word_examples.jpeg new file mode 100644 index 0000000..4c6ba4f Binary files /dev/null and b/content/AI/images/prompt_word_examples.jpeg differ diff --git a/content/english/stableDiffusionPrompt.md b/content/english/stableDiffusionPrompt.md new file mode 100644 index 0000000..07d9886 --- /dev/null +++ b/content/english/stableDiffusionPrompt.md @@ -0,0 +1,41 @@ +# Stable Diffusion prompt + +| english | translate | sentence | +| --- | ---- | ------ | +| **2023-05-04** | Stable Diffusion | +| Stable | 稳定的,稳固,安定 | +| Diffusion | 扩散,漫射 | +| positive image quality | 正向画质 | +| Masterpiece | 杰作,名著 | +| Vivid Colors | 鲜艳的色彩 | +| Details | 细节修饰 | +| sharp focus | 锐利的焦点 | +| matte | 哑光的 | +| ultrawide shot | 超广角镜头 | +| low angle | 低角度 | +| up close portraits of | 近距离肖像 | +| cinematic | 电影般的 | +| bokeh | 背景虚化 | +| ambient light | 环境灯光 | +| dreamatic lighting | 梦幻般的 | +| uplight | 聚光灯 | +| volumetric lighting | 体积照明 | +| mood lighting | 情绪照明 | +| bright | 明亮的 | +| soft illumination | 柔和的照明 | +| rays of shimmering light | 闪烁的光芒 | +| studio lighting | 工作室照明 | +| style rendering | 风格渲染 | +| portraits | 人像 | +| landscape | 景观,风景,山水 | +| anime | 日本动画片 | +| illustration | 插图,例证,插画 | +| concept art | 艺术概念 | +| realism | 现实主义 | +| watercolor painting | 水彩绘画 | +| cyberpunk | 赛博朋克 | +| wash painting | 水墨画 | +| trending on artstaion | | +| blender | 搅拌机,混合器 | +| zbrush | 刷子 | +| octan render | | diff --git a/content/english/studyWords.md b/content/english/studyWords.md index 299270d..ed56911 100644 --- a/content/english/studyWords.md +++ b/content/english/studyWords.md @@ -126,44 +126,22 @@ | hardware | 硬件,铁器,金属制品 | | accelerated | 加速,促进 | | allocation | 分配 | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | -| | | +| **2023-04-21** | | +| artificial | 人造的,虚假 | +| intelligence | 智力,情报 | +| occupational | 职业的 | +| prompt | 迅速的,提示,促使 | +| tutorial | 教程 | +| erroneously | | I found that there was an instance of VS Code open that was erroneously not shown on my dock | +| postponed | | postponed the restart | +| remained | | +| encounter | 遇到,遭,领教 | +| master | 主,硕士,大师,掌握 | +| piece | 片,一块,部分 | +| Vivid | 生动,传神,活泼 | +| ultra | 过度的,极端主义者 | +| concept | 概念,学说 | +| illumination | 照明,光照,照亮 | | | | | | | | | | diff --git a/content/git/base.md b/content/git/base.md index 1a5bf66..d3c1ddb 100644 --- a/content/git/base.md +++ b/content/git/base.md @@ -1,28 +1,36 @@ ## git 初始化配置 + 1. 生成ssh秘钥,打开git终端,执行`ssh-keygen -t rsa -C "邮箱"`,执行成功,切换到~/.ssh目录下,复制id_rsa.pub内容 2. 进入gitlab|github的settings -> SSH and GPG keys,点击add ssh key,这一步等于说你把公钥放到了Github上进行托管 3. 全局配置git用户名和邮箱 + ```shell git config --global user.name "XXX" git config --global user.password "XXX@XX.com" ``` ### git工作区域和流程 + Workspace:工作区,就是平时进行开发改动的地方,是当前看到的最新的内容,在开发的过程也就是对工作区的操作 Index:暂存区,当执行`git add`命令后,工作区的文件就会被移入暂存区,暂存区标记了当前工作区中的那些内容是被git管理的,当完成某个需求或者功能后需要提交代码,第一步就是通过`git add` 先提交到暂存区 Repository:本地仓库,位于自己的本地电脑上,通过`git commit`提交暂存区的内容,会进入本地仓库 Remote:远程仓库,用来托管代码的服务器,远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改,本地仓库修改完代码后通过`git push`命令同步代码到远程仓库 ### 基本操作 + #### git add + 添加文件到暂存区 + ```sh # 添加某个文件到暂存区,后面可以跟多个文件,空格区分 git add xxx # 添加当前更改的所有文件到暂存区 git add . ``` + #### git commit + ```sh # 提交暂存的更改,会新开编辑器进行编辑 git commit @@ -33,23 +41,31 @@ git commit -am # 对最近一次的提交信息进行修改,此操作会修改commit的hash值 git commit --amend ``` + #### git pull + ```sh # 从远程仓库拉取代码合并到本地,可简写为git pull 等同于 git fetch && git merge git pull <远程主机名> <远程分支名>:<本地分支名> # 使用rebase的模式进行合并 git pull --rebase <远程主机名> <远程分支名>:<本地分支名> ``` + #### git fetch + 与`git pull`不同的是`git fetch`操作仅仅只会拉取远程的更改,不会自动进行merge操作,对你当前代码没有影响 + ```sh # 获取远程仓库特定分支的更新 git fetch <远程主机名> <分支名> # 获取远程仓库所有分支的更新 git fetch --all ``` + #### git push + #### git branch + ```sh 当一个分支被推送并合并到远程分支后,-d 才会本地删除该分支。如果一个分支还没有被推送或者合并,那么可以使用-D强制删除它 # 新建本地分支,但不切换 diff --git a/content/relex/Thinkinglevel.md b/content/relex/Thinkinglevel.md index 1f8f13e..ba2eaf4 100644 --- a/content/relex/Thinkinglevel.md +++ b/content/relex/Thinkinglevel.md @@ -1,6 +1,11 @@ +# 思维方式 + 按思维方式。人分六层,思维层级不一样,成就也就不一样,但是思维层面不是一成不变的,了解了思维层级,逐渐的改变思维模式,利用成功的思维方式思考问题,会有不一样的效果 +## 层级介绍 + ### 第一层,初级环境层思维模式。关注外界因素 + - 别名:怨妇 - 理解层次:环境 - 思考模式:都是他们的错 @@ -10,7 +15,9 @@ 问题发生时,这样的人不会认为是【自己的问题】,会认为【这是环境的问题】,他们解决问题的方式,不是积极从自身找问题,而是【换个环境】。 可想而知,这是徒劳的。 + ### 第二层 行为,做事从自身找原因,关注为什么(行动派) + - 别名:行动派 - 理解层次:行为 - 思考模式:我还不够努力 @@ -29,6 +36,7 @@ 所以成功学、心灵鸡汤只告诉人努力,而没有告诉方法,被人摒弃也是在所难免的事。 ### 第三层 技术能力层,信念价值,做事找方法,关注如何做 + - 别名:战术家 - 理解层次:能力 - 思考模式:方法总比问题多 @@ -39,18 +47,23 @@ 比如男女朋友关系不好,那么应该是我的沟通能力有问题,所以要学习一下;下属关系不好,应该是我的管理能力有问题,所以报一个MBA。 【战术家】拥有强大的学习能力和应用能力,可以很好的解决问题,他们既有【行动层的努力】,又有【能力层的思维】,这样的人在社会中处于【中上层】,在公司中都能做到【中上层管理岗位】。 + ### 第四层 战略层,信念价值层,这个层次的人开始有自己的信念 + - 别名:战略家 - 理解层次:信念/价值/规条 - 思考模式:什么才是最重要的 在这个层面,有自己的主张,知道自己要做什么,多方位发现问题,关注问题,不会按照任何外界思想行动, 有自己的价值观,做任何事情关注的是,什么对自己是重要的,自己想要的到底是什么,所以他从来不盲目做事,他不会把注意力分散,不会盲目跟风,心里有自己坚守的东西,认准了就去做,不管别人说什么。咬住青山不放松。成者王侯败者贼。 ### 第五层 身份层 自我定位,认清自己定位(我是谁) + - 别名:觉醒 - 理解层次:身份 - 思考模式: 这一层体现的是我们最基础的核心价值与使命,通过自我认同确定整体目标(使命),主要回答我是谁的问题。 你要成为哪方面的人才就需要培养自己在这个领域的能力,能力想清楚后,看需要具体做什么?拆解成一个个具体的行动,然后稳扎稳打逐步就实现它。 + ### 第六层 精神层 我为这个世界带来什么,让一部分人因为我而怎样 + - 别名:领袖/伟人 - 理解层次:精神/使命 - 思考模式:人活着就是为了改变世界 diff --git a/content/three/base.md b/content/three/base.md index 129d580..68b39f5 100644 --- a/content/three/base.md +++ b/content/three/base.md @@ -1,3 +1,5 @@ +# Three3D + ## 3D引擎基本知识 ### 场景(scene) diff --git a/content/unity/UGUI.md b/content/unity/UGUI.md index 1692b45..15f574a 100644 --- a/content/unity/UGUI.md +++ b/content/unity/UGUI.md @@ -1,12 +1,19 @@ -### UGUI +# UGUI + Unity 图形用户界面 Unity Graphical User Interface 界面显示系统 + - 布局系统 (Rect Transform) (Layout Group) - 事件机制 鼠标指针类、拖拽类、点选类、输入类 -- 执行效能 +- 执行效能 + +## UGUI组件 + ### 基础控件 + #### Canvas画布 + - 简介:画布,绘制UI元素的载体,所有UI元素必须在Canvas之下,UI元素的绘制顺序依赖于层次面板中的顺序 -- Render Mode 渲染方式 +- Render Mode 渲染方式 - Screen Space-Overlay 覆盖模式: - UI元素将绘制在其他元素之前,且绘制过程独立于场景元素和摄像机设置,画布尺寸由屏幕大小和分辨率决定 - Pixel Perfect 完美像素:若勾选,则会锐化屏幕显示效果 @@ -18,42 +25,56 @@ Unity 图形用户界面 Unity Graphical User Interface 界面显示系统 - Plane Distance 平面与摄像机的距离 - 应用:3d物体遮盖UI、特效显示在UI前面 - World Space 世界空间模式:画布渲染于世界空间,与场景中的其他3D物体性质相同 + #### Image + - 图片转sprite Inspector面板 ```Texture Type```属性选择 ```Sprite (2D and UI)``` - Image Type - Simple 简单 - Sliced 切割 - Tiled 平铺 - Filled 填充 + #### Text + - 富文本语法 - ```粗体``` - ```斜体``` - ```字号``` - ```颜色``` - 图文混排 + #### Button + - Interactable 是否可交互 - Transition - None - Color Tint 可配置各种交互下按钮颜色 - Sprite Swap 可配置多张图片 - Animation 可提供自定义按钮动画 -#### Toggle + +#### Toggle + - Is On 属性 判断复选框有没有选中 + #### Slider + - Interactable 是否可交互 - Min Value - Max Value -- Value +- Value + #### Scrollbar 滚动条 #### Rect Transform + 派生自Transform,在UGUI控件上替代原有的变换组件,表示一个可容纳UI元素的矩形 + - 属性 - Pos 控件轴心点相对于自身锚点的位置 - Anchor 锚点:UI元素的4个顶点与锚点的间距保持不变,锚点总是相对于父级,不能超越父物体范围; 表示点 PosX PosY Width Height;表示拉伸 Left Right Top Bottom - Pivot 轴心点:移动、旋转与缩放都围绕轴心点发生变化,0,0为左下顶点,1,1为右上顶点 + ```C# // 当锚点不分开时,数值可以理解为UI宽高 // 物体大小 - 锚点间距 @@ -63,17 +84,23 @@ Unity 图形用户界面 Unity Graphical User Interface 界面显示系统 ``` #### 事件数据 + - BaseEventData 事件数据类的父类,其中包括EventSystem、InputModule和当前选中GameObject的引用 - AxisEventData 滚轮事件数据,只记录滚动的方向数据 - PointerEventData 点位事件数据,包括当前位置,滑动距离,点击时间以及不同状态下GameObject的引用 + #### 事件输入 + 输入检测模块规定了对事件的处理逻辑和细节,比如处理鼠标点击时间、拖拽和移动等 其中TouchInputModule主要是面向触摸平台和移动设备的输入检测模块 standaloneInputModule主要是面向标准鼠标键盘的 + #### 事件检测 + #### 事件调度 + 事件逻辑处理模块的主要逻辑都集中在EventSystem类中 EventInterfaces类、EventTrigger类、EventTriggerType类定义了事件回调函数,ExecuteEvents类编写了所有执行事件的回调接口 @@ -81,26 +108,30 @@ EventInterfaces类、EventTrigger类、EventTriggerType类定义了事件回调 EventSystem主要逻辑基本上都在处理由射线碰撞检测后引起的各类事件。比如,判断事件是否成立,若成立,则发起事件回调,若不成立,则继续轮询检查,等待事件的发生 EventSystem类是事件处理模块中唯一继承MonoBehavior类并在Update帧循环中做轮询的 + #### UI模块 ### 优化原理 + - 在界面中默认一张图片一个Draw Calls - 同一张图片多次显示仍然为一个Draw Calls - #### UGUI层级关系 + 1. Unity3d中的渲染顺序如下: 不同的Camera的Depth 相同Camera下的不同SortingLayer 相同SortingLayer下的不同Z轴/Order in Layer + 2. 改变控件之间的层级关系 -- 同一canvas下: + 同一canvas下: 改变控件transform的SiblingIndex, transform.GetSiblingIndex(); transform.SetSiblingIndex(int index); //index值越大,越后渲染,层级越大,越显示在前面 -- 不同Canvas下: - 设置Canvas下的Sort Order //Sort Order值越大,越后渲染,层级越大,越显示在前面 + 不同Canvas下: 设置Canvas下的Sort Order //Sort Order值越大,越后渲染,层级越大,越显示在前面 + 3. Transform.SetSiblingIndex() 设置规则 + - SiblingIndex 从0开始依次向后增加1 - 设置 SiblingIndex 时,如果设置的索引>当前索引,原有索引上的元素至当前元素之下的元素一律向上移动(索引-1),就是把下面的通通上移使得目标索引位置空出,然后放入自己 - 设置 SiblingIndex 时,如果设置的索引<当前索引,原有索引上的元素至当前元素之上的元素一律向下移动(索引+1),就是把上面的通通下移使得目标索引位置空出,然后放入自己 @@ -108,6 +139,7 @@ EventSystem类是事件处理模块中唯一继承MonoBehavior类并在Update帧 - 新加元素,索引一律为 ChildCount-1, 也就是最后一个 #### 动态改变 UI 层级渲染 + - SetAsFirstSibling 是设置为最先渲染的,即会被后渲染的挡住 - SetAsLastSibling 是设置为最后渲染的,即会挡住比他先渲染的 - SetSiblingIndex(index) 设置层级,从0开始到childcount -1 diff --git a/content/unity/URP.md b/content/unity/URP.md index 3ee5985..91fa8b0 100644 --- a/content/unity/URP.md +++ b/content/unity/URP.md @@ -1,4 +1,5 @@ -### URP优化unity +# URP优化unity + - 管理光照Managing your Lighting - 光探头Light Probes - 反射探头Reflection Probes diff --git a/content/unity/UnityEditor.md b/content/unity/UnityEditor.md index afb9594..04bcf8b 100644 --- a/content/unity/UnityEditor.md +++ b/content/unity/UnityEditor.md @@ -1,6 +1,7 @@ -## UnityEditor API +# UnityEditor API + +## 自定义unity编辑器顶部菜单 -### 自定义unity编辑器顶部菜单 ```C# using UnityEditor; diff --git a/content/unity/animation.md b/content/unity/animation.md index d8424ab..4c34175 100644 --- a/content/unity/animation.md +++ b/content/unity/animation.md @@ -1,8 +1,14 @@ +# Aniamtion&Animator相关 + +## Aniamtion + ### 创建动画片段 + - 为物体添加Animation组件 - 在动画视图中创建片段 -### 旧版动画API +## 旧版动画API + - bool isPlay = animation.isPlaying; - bool isPlay = animation.isPlaying("动画名); - animation.Play("动画名"); @@ -13,8 +19,22 @@ - animation["动画名"].length; - animation["动画名"].time; -### 新版动画 +## 新版动画 // 当前片段的播放进度[0,1] 0为起点 1为终点 // 判断动画是否播放完 if ((animatorInfo.normalizedTime > 0.99f) && (animatorInfo.IsName("动画片段名"))) + +## Animator + +- Controller +- Avatar 人形动画(如果没有使用Avatar,animator组件会严格按照动画片段里记录的path执行动画) +- Apply Root Motion(动画的位移应用到游戏对象上,就需要勾选) +- Update Mode(动画刷新模式,重新计算每个骨骼节点的位置、转向和缩放的数值) + - normal 指和帧率同步(Update方法同步刷新) + - Animate Physic 指与物理引擎同步(Fixed Update同步刷新) + - Unscale Time (和normal一样,Update方法同步刷新,与normal不同的是会忽略当前的时间标尺time scale,所谓时间标识就是整个游戏的运行速度比例) +- Culling Mode(剔除模式) + - Always Aniamte(不剔除) + - Cull Update Transforms(如果该游戏对象并没有被摄像机看到,animator还是会计算当前的动画状态,和Always Animate没有区别,但是会剔除诸如IK之类的) + - Cull Complately (完全停止动画,等被看到时重新播放动画) diff --git a/content/unity/ase/index.md b/content/unity/ase/index.md new file mode 100644 index 0000000..e69de29 diff --git a/content/unity/feature/frameRateSetting.md b/content/unity/feature/frameRateSetting.md new file mode 100644 index 0000000..09fe9c2 --- /dev/null +++ b/content/unity/feature/frameRateSetting.md @@ -0,0 +1,116 @@ +# Unity 帧率设置 + +## 设置帧率 + +通过代码来限定游戏帧率 + +```C# +Application.targetFrameRate = -1; +``` + +设置为-1标识不限定帧率,一般情况在手机游戏中限定帧率为30 + +```C# +Application.targetFrameRate = 30; +``` + +但是把这个代码添加到工程之后,在Unity中运行起来发现没有起作用,[官网](https://docs.unity3d.com/2021.3/Documentation/ScriptReference/Application-targetFrameRate.html)这么解释 + +```md +指示游戏尝试以指定的帧率渲染。 +默认的targetFrameRate是一个特殊值-1,表示游戏应以平台的默认帧率渲染。此默认速率取决于平台: + +- 在独立平台上,默认帧率是可实现的最大帧率。 +- 在移动平台上,由于需要节省电池电量,默认帧率小于可实现的最大帧率。移动平台上的默认帧率通常为每秒30帧。 +- 所有移动平台可实现的最大帧率都有固定上限,这等于屏幕的刷新率(60Hz=60fps,40Hz=40fps,…)。Screen.currentResolution包含屏幕刷新率。 +- 此外,所有移动平台都只能在VBlank上显示帧。因此,应将targetFrameRate设置为-1,或是等于屏幕刷新率的值,或是刷新率除以一个整数。否则,生成的帧率始终小于targetFrameRate。注意:如果将targetFrameRate设置为刷新率除以一个整数,则整数除法得到的有效fps与将QualitySettings.vSyncCount设置为相同整数值时相同。 +- iOS会忽略QualitySettings.vSyncCount设置。相反,设备会在帧准备就绪之后的第一个可能VBlank上显示帧,应用程序会实现 targetFrameRate。 +- 在[WebGL](https://forum.unity.com/threads/targetframerate-not-working-in-2021-3-1-lts-webgl.1281161/)上,默认值允许浏览器选择帧率来匹配其渲染循环时序,这通常会产生最平滑的效果。只有当您想要限制WebGL上的CPU使用率时,才建议使用非默认值。 +使用VR时,Unity将使用SDK指定的目标帧率并忽略游戏指定的值。 +设置targetFrameRate不保证会实现帧率。由于平台规格不同,帧率可能会出现波动,或者由于设备速度太慢,游戏可能无法达到帧率。 +此外,如果设置了QualitySettings.vSyncCount属性,将忽略targetFrameRate,而游戏将使用vSyncCount和平台的默认渲染率来确定目标帧率。例如,如果平台的默认渲染速率为每秒60帧且vSyncCount设置为2,则游戏将以每秒30帧为目标。 +在编辑器中,targetFrameRate仅影响Game视图。不会影响其他编辑器窗口。 +``` + +大致总结 + +- Application.targetFrameRate是用来让游戏以指定的帧率运行,如果设置为-1就让游戏以最快的速度运行。 +- 但是这个设定会垂直同步影响。 +- 如果设置了垂直同步,那么就会抛弃这个设定 而根据屏幕硬件的刷新速度来运行。 +- 如果设置了垂直同步为1,那么就是60帧。 +- 如果设置了为2,那么就是30帧。 + +## 测试和显示帧率 + +### 显示帧率 + +```C# +public class FPSCounter : MonoBehaviour +{ + /// + /// 更新显示帧率的时间间隔 + /// + private readonly float m_updateTime = 0.5f; + /// 帧数 + private int my_frames = 0; + + private int preFrameCount = 0; + + public int mHighValue = 30; // 高于这个值显示mHighColor文字 + public int mLowValue = 20; // 低于这个值显示mLowColor文字 + // 显示帧率的Text组件 + public Text mTxtFrameCount; + + // 文字颜色预设 + public Color mHighColor; + public Color mMidColor; + public Color mLowColor; + + void OnEnabled() + { + StartCoroutine("UpdateCounter"); + } + + void OnDisabled() + { + StopCoroutine("UpdateCounter"); + } + + protected IEnumerator UpdateCounter() + { + while(true) + { + var previousUpdateTime = Time.unscaledTime; + var previousUpdateFrames = Time.frameCount; + + while (Time.unscaledTime < previousUpdateTime + updateInterval) + { + yield return null; + } + float newValue = 0f; + var timeElapsed = Time.unscaledTime - previousUpdateTime; + var framesChanged = Time.frameCount - previousUpdateFrames; + newValue = framesChanged / timeElapsed; + UpdateValue(newValue); + } + } + + private void UpdateValue(float value) + { + if (mTxtFrameCount == null) + return; + int roundedValue = (int)value; + + if (roundedValue != preFrameCount) + { + if (roundedValue <= mLowValue) + mTxtFrameCount.color = mLowColor; + else if (roundedValue < mHighValue) + mTxtFrameCount.color = mMidColor; + else + mTxtFrameCount.color = mHighColor; + mTxtFrameCount.text = $"{roundedValue.ToString()} FPS"; + } + } +} +``` diff --git a/content/unity/frame/design.md b/content/unity/frame/design.md new file mode 100644 index 0000000..4f859cd --- /dev/null +++ b/content/unity/frame/design.md @@ -0,0 +1,65 @@ +# 游戏设计 + +## 逻辑与表现的分离 + +### 分离做法 + +1. 定义“纯粹的逻辑类”。 +基本职责:对游戏对象的“逻辑值”进行定义、存储和计算。 +关键要素:只关心逻辑数据,不考虑表现问题。(如同在没有表现能力的服务端写代码)。 + 不用继承Monobehaviour(Unity中)、不在任何系统自带的组件上存取逻辑值。 + 可在逻辑运算的特定的位置抛出数据变更事件。 + 或在数据操作完成后回调到 Controller。 +举例说明:如定义、存储和计算 “变换相关的坐标、旋转、缩放”、“战斗属性相关的“生命、法力”等。 + +2. 定义“纯粹的表现类”。 +基本职责:根据逻辑类中的数据,对物体进行实际显示更新。 +关键要素:持有 实际的游戏物体(GameObject)。(获得游戏物体的对象引用) + 持有或可访问对应的逻辑类。(可获得对应逻辑类的数据内容) + 可监听逻辑类中的数据变更事件,并以此对要表现的游戏对象及其子对象做显示更新(观察模式单向弱依赖)。 + 或由 Controller 类控制,“可选地” 对实际物体进行操作。 + +如:逻辑数据上的位移变化较粗糙,但修改实际物体时,可对Transform组件上的值进行直接赋值或平滑插值。 + +实际开发中,这两个类其实是可以合并为一个类的,只是要注意保持这种单向弱依赖的处理的方式。 + +### 分离意义 + +1. 清晰高效的交互模型 +可以认为:所有的逻辑类共同组成了一个 在客户端内部的、独立完整的 “个人数据服务器”。对外,负责与真正的服务器同步(交换更新)数据;对内,通过事件驱动表现显示。 +逻辑与表现的分离,可以让彼此有不同的 “心跳频率”,通常,为了减少客户端与服务器之间收发消息的次数。“逻辑类中的数据同步频率” 要远低于 “表现刷新频率”。表现时,通过在逻辑值之间插值,仍然可以让显示平滑,可做到让玩家毫无察觉。 +2. 安全可靠的数据模型 +所有数据都在逻辑类中显式定义,不会存储在任何系统组件上。 +所以,能够避免“意想不到的被修改”(比如被一些tween类插件意外修改)。 +能够避免使用浮点数,这也是帧同步实现的重点之一。 +3. 可拆卸的表现逻辑 +始终保持 “表现” 单向弱依赖于 “逻辑”,所以, +能够随意销毁任何显示中的游戏物体(GameObject)而不影响逻辑运算(逻辑类一直存在,只是干掉了类似观察者的东西)。对于“按视野显示游戏物体,分质量(高低模、不同图片压缩品质)显示游戏物体” 这样的性能优化需求,可以处理的得心应手 + +### 分离方案 + +1. MVC模式:在Unity中,可以使用MVC(Model-View-Controller)模式来分离逻辑层和表现层。Model包含游戏数据和业务逻辑,Controller处理用户输入和在Model和View之间传递数据,View负责显示数据。使用MVC模式可以使代码更加可维护和可扩展,同时也可以提高重用性 +2. ECS架构:ECS(Entity-Component-System)是一种对逻辑层和表现层进行分离的架构。在ECS架构中,游戏对象被分解为诸如Transform、Renderer和Physics等组件。逻辑层使用系统来对这些组件进行操作,表现层使用组件来渲染游戏对象。使用ECS架构可以提高游戏性能和可维护性。 +3. 观察者模式:使用观察者模式,逻辑层和表现层可以通过事件机制进行通信。逻辑层可以向表现层发布事件,表现层可以订阅事件并响应。使用观察者模式可以使代码更加松耦合,同时也可以提高可扩展性。 + +#### ECS架构 + +ECS(Entity-Component-System)架构是一种将游戏对象分解为实体、组件和系统的设计模式,用于分离游戏对象的逻辑和渲染。每个实体都由多个组件组成,每个组件都包含游戏对象的一部分数据和行为。系统则用于处理组件,例如更新位置、处理输入、渲染等。 + +具体来说,ECS架构的核心是: + +1. 实体:实体是游戏对象的抽象,每个实体都由一组组件组成。实体本身不包含任何逻辑或数据。 + +2. 组件:组件是实体的一部分,它包含了游戏对象的数据和行为。例如,Transform组件包含了游戏对象的位置、旋转和缩放等信息,Renderer组件包含了游戏对象的渲染信息。 + +3. 系统:系统是用于处理组件的逻辑模块,它可以更新组件的状态、处理输入、渲染等。系统通过访问组件来实现对实体的控制。 + +使用ECS架构可以带来多方面的好处,包括: + +1. 更高的性能:ECS架构是一种数据驱动的设计模式,它避免了基于继承的面向对象设计模式中的多态开销。由于组件是数据,系统可以对组件进行批量处理,从而提高性能。 + +2. 更好的可维护性:ECS架构可以分离游戏对象的逻辑和渲染,使代码更加清晰和易于维护。 + +3. 更好的可重用性:ECS架构的组件是可以被重用的,它们可以被应用于多个实体和系统中,从而提高代码的可重用性。 + +总之,ECS架构是一种非常有用的设计模式,特别是对于需要处理大量游戏对象的游戏来说,它可以提高游戏的性能和可维护性。 diff --git a/content/unity/particle/index.md b/content/unity/particle/index.md new file mode 100644 index 0000000..bd31ca4 --- /dev/null +++ b/content/unity/particle/index.md @@ -0,0 +1,52 @@ +# Particle System 粒子系统 + +## 说明 + +用于模拟一些流动的,没有形状的物质;如:液体,烟雾,火焰,爆炸,魔法效果等 + +## 模块 + +- 一个主模块 Main Module (基础参数) +- 22个子模块(扩展参数) 默认启用了 Emission/Shape/Renderer 三个模块 + +### 主模块 + +- Start Color 颜色(可设置两个值,表示两个值之间取值) +- Start Speed 速度 +- Start Size 大小 +- Duration 周期 粒子系统工作时长 +- Lopping 循环 +- Prewarm 预热 是否先内部预热一个周期 +- Start Lifetime 粒子的生命时长(存在时间),默认5s +- Simulation Space 模拟空间 + - Local 本地空间(以粒子发生器为中心 火焰的尾巴) + - World 世界空间(使用世界坐标系 泡泡枪) +- Max Particles 一个粒子系统最多多少个粒子(默认1000) + +### 子模块 + +#### Emission 发射的频率 + +- 匀速发射 + - Rate over Time 时间匀速 以1s时间,发射N个粒子 + - Rate over Distance 距离匀速 每前进1m,发射N个粒子,针对运动的物体 +- 爆发式发射 + - Bursts + - Time 爆发发生的时间 + - Count 爆出多少个粒子 + - Cycles/Interval 爆炸次数、间隔 + - Probability 爆炸可能的概率,0表示不会爆炸 + +#### Shape 粒子发生器的形状 + +#### Renderer 粒子的显示 + +- Render Mode + - Billboard 由粒子系统控制的小纸片,总是面向摄像机 + - Stretched Billboard 拉伸 + - Horizontal Billboard + - Vertical Billboard + - Mesh + - None + +#### Size Over Lifetime diff --git a/content/unity/particle/resources.md b/content/unity/particle/resources.md new file mode 100644 index 0000000..e69de29 diff --git a/content/unity/resource-package.md b/content/unity/resource-package.md index d8838e4..09236ab 100644 --- a/content/unity/resource-package.md +++ b/content/unity/resource-package.md @@ -1,4 +1,8 @@ -### unity3d商店资源包 +# unity第三方包或store商店 + +## unity3d商店资源包 + +### 场景资源 - [Viking Village URP](https://assetstore.unity.com/packages/essentials/tutorial-projects/viking-village-urp-29140) - [Flooded Grounds](https://assetstore.unity.com/packages/3d/environments/flooded-grounds-48529) @@ -26,20 +30,25 @@ - FPS武器资源包 - 包含4个武器,一个瞄准镜和一个烟雾手榴弹 +### 粒子特效系统 + +- [40 多种真实效果,适用于所有类型的战争游戏!](https://assetstore.unity.com/packages/vfx/particles/war-fx-5669) +- [火、爆炸、冰、溶解等其他精美特效](https://assetstore.unity.com/packages/vfx/particles/particle-pack-127325) + +## unity 工具库 -### unity 工具库 - [UnityURPToonLitShaderExample](https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample) - 卡通着色器包 - [URP-UniVrm](https://github.com/EvelynGameDev/URP-UniVrm) - vrm 转换为unity中可以使用的资源 +## 人物动作库和制作人物 -### 人物动作库和制作人物 - [mixamo](https://www.mixamo.com/) 动画库 - [vroid](https://vroid.com/en/studio) 快速制作角色 +## unity 具体场景DEMO -### unity 具体场景DEMO - [MobileDrawMeshInstancedIndirectExample](https://github.com/ColinLeung-NiloCat/UnityURP-MobileDrawMeshInstancedIndirectExample) - 移动端绘制网格实例化间接示例 diff --git a/content/unity/shader/Surface Shader.md b/content/unity/shader/Surface Shader.md new file mode 100644 index 0000000..e6bfb8b --- /dev/null +++ b/content/unity/shader/Surface Shader.md @@ -0,0 +1,73 @@ +# Surface Shader + +## 表面着色器 +表面着色器包含4个函数 +- 顶点变换函数 +- 表面着色函数 +- 光照模型 +- 最终颜色修改函数 +表面着色器最终会被编译为一个复杂的顶点着色程序 + +### 定义入口函数 +#pragma surface 入口函数名称 光照模型 [Options] +1. surface后面跟表面着色器的入口函数 surf(Input IN, inout SurfaceOutput o); +2. 光照模型 + - 内置的lambert(漫反射光照) BlinnPhong(高光光照) + - 自定义光照: 名字为Name + - half4 Lighting(SurfaceOutput s, half3 lightDir, half aten); + - half4 Lighting(SurfaceOutput s, half3 lightDir, half3 viewDir, half aten); + - half4 Lighting(SurfaceOutput s, half4 light); +3. 可选参数 vertex: name 入口函数 + - void(inout appdata_full v) 只需要改顶点着色器中的输入顶点数据 + - half4(inout appdata_full v, out Input o) 修改输入顶点数据,以及为表面着色器传递数据 +4. 可选参数 finalcolor: name 最终颜色修改函数 + - void(Input IN, SurfaceOutput o, inout fixed4 color) +5. 其他可选参数 + 1: alpha: Alpha 混合模式,用户半透明着色器; + 2: alphatest:varirableName Alpha测试模式,用户透明镂空着色器 + 3: exclude path:prepass 使用指定的渲染路径 + 4: addshadow: 添加阴影投射器和集合通道; + 5: dualforward:将双重光照贴图用于正向渲染路径中; + 6: fullforwardshadows 在正想渲染路径中支持的所有的阴影类型 + 7: decal: add 附加印花着色器: + 8: decal: blend 附加半透明印花着色器:9: softvegetation 使用表面着色器,仅在Soft Vegetation 开启时被渲染;10:noambient 不使用任何光照 + 11: novertexlights 在正向渲染中不适用球面调和光照或逐点光照12: nolightmap 在这个着色器上禁用光照贴图: + 13: nodirlightmap 在这个着色器上禁用方向光照贴图 + 14: noforwardadd 禁用正向渲染添加通道: + 15: approxview: 对于有需要的着色器,逐顶点而不是逐像素计算规范化视线方向 + 16: halfasview: 将半方向传递到光照函数中。 + +#### 表面入口函数Input IN结构附加数据 +Input 必须包含着色器所需要的纹理坐标 uv + 纹理名字;如果使用第二张纹理 uv2 + 纹理名字 + +附加数据 +1. float3 viewDir 试图防线 +2. float4 color 每个顶点的颜色插值 +3. float4 screenPos 屏幕空间中的位置 +4. float3 worldPos 世界坐标空间 +5. float3 worldRef1 世界空间中的反射向量 +6. float3 worldNormal 世界空间的法线向量 +7. float3 worldRef1; INTERNAL_DATA 世界坐标反射向量,但必须表面着色写入o.Normal参数 +8. float3 worldNormal; INTERNAL_DATA 世界坐标法线向量,但必须表面着色写入o.Normal参数 + +#### SurfaceOutput 结构体 +SurfaceOutput +1. half3 Albedo 漫反射 +2. half3 Normal 法线 +3. half3 Emission 自发光 +4. half Specular 镜面反射系数 +5. half Gloss 关泽系数 +6. half Alpha 透明度系数 +SurfaceOutputStandard +7. half Smoothness 0-粗糙 1-光滑 +8. half Metallic 0-非金属 1-金属 + +SurfaceOutputStandardSpecular +1. fixed3 Albedo +2. fixed3 Specular +3. fixed3 Normal +4. half3 Emission +5. half Smoothness +6. half Occlusion // 遮挡(默认1) +7. fixed Alpha + diff --git a/content/unity/shader/index.md b/content/unity/shader/index.md new file mode 100644 index 0000000..586848e --- /dev/null +++ b/content/unity/shader/index.md @@ -0,0 +1,151 @@ +# Shader + +## 概述 + +1. Shader是给GPU执行的程序,着色器 +2. 着色器是运行在图形处理单元上,让开发人员直接操作图形硬件渲染功能 +3. UV动画,水,雾等特效,用着色器开发出来性能和效果好 +4. 渲染流水线,模型投影,定点着色 +5. shader一般有:固定管线着色器,顶点片元着色器, 表面着色器 + +## GPU管道流水线 + +顶点初始化 - 顶点shader - Tellellation曲面化 - 几何shader - 裁剪、投影 - 三角形遍历 - 片元着色shader - 输出 + +## 分类 + +1. HLSL语言,通过Direct3D编写的着色器程序,只能在Direct3D里面使用 +2. Cg语言 NVIDIA和微软合作的语言,Direct3D和Opengl都支持 +3. GLSL语言。支持OpenGL上编写Shader程序 + +unity使用shaderlab来进行着色程序的编写,对不同平台进行编译,重点支持Cg语言; + +## 语法基础 + +Shader "name" { // shader的名字 + [Properties] // 定义一些属性,定义在这里的属性都会在属性查看器里面显示 + Subshaders: {...} // 子着色器列表,一个shader必须有一个子着色器 + [Fallback] // 如果子着色器显卡都不支持,降级处理即Fallback操作 +} + +### Properties + +1. name{"display name", type} = value; +name 指的是属性的名字 +display name 是在属性检查器的名字 +type 这个属性的类型 +value 这个属性的默认值 +2. 类型 +Float,Int,Color(num, num, num, num), Vector(4维向量),Range(start, end) +2D: 2D纹理属性 +Rect: 矩形纹理属性 +Cube:立方体纹理属性 +3D:3D纹理属性 +例如: name{"display name", 2D} = "name" {options} +3. Options: 纹理属性选项 +TextGen:纹理生成模式,纹理自动生成纹理坐标的模式,顶点shader会忽略这个选项 +ObjectLinear,EyeLinear,SphereMap,CubeReflect CubeNormal +LightmapMod:光照贴图模式,如果设置这个选项,纹理会被渲染器的光线贴图影响 +举例:_Range("range value", Range(0, 1)) = 0.3; +_Color("color", Color) = (1, 1, 1, 1); +_MainTex("Albedo", Cube) = "skybox" {TextGen CubeReflect}; // 定义一个立方体贴图纹理属性 + +### SubShader + +1. Subshader{[Tags], [CommonState], Pass{} } 由标签Tags、通用状态、通道泪飙组成 +2. Subshader渲染的时候,将优先渲染一个被每个通道所定义的对象 +3. 通道的类型: RegularPass,UsePass,GrabPass +4. 在通道中定义状态同时对整个子着色器可见,那么所有的通道可以共享状态 + +SubShader { + Tags {"Queue", "Transparent"} + Pass { + Lighting Off // 关闭光照 + ... + } +} + +#### Tags + +标签类型 + +- Queue 队列标签 +- RenderType 渲染类型 +- DisableBatching 禁用批处理 +- ForceNoShadowCasting 强制不投阴影 +- IgnoreProjecttor 忽略投影 +- CanUseSpriteAtlas 使用精灵图集 +- PreviewType 预览类型 + +#### Pass通道 + +基础语法 +Pass {[Name and Tags] [RenderSetup] [Texture Setup]} + +##### RegularPass + +- Lighting 光照 +- Material(材质块) 定义一个使用定点光照管线的材质 +- ColorMaterial 颜色集 计算定点光照时使用顶点颜色 +- SeparateSpecular 开光状态 开启或关闭顶点光照相关的镜面高光颜色 On/Off +- Color 设置定点关照关闭时所使用的颜色 +- Fog 雾 +- AlphaTest Alpha测试 +- ZTest 深度测试模式 +- ZWrite 深度写模式 +- Blend 混合模式 SourceBlendMode DestBlendMode AlphaSourcesBlendMode AlphaDstBlendMode +- ColorMask 颜色遮罩 设置颜色遮罩,颜色值可以由RGB或A或0或R,G,B,A的组合,设置0关闭所有的颜色通道渲染 +- Offset 偏移因子,设置深度偏移 + +##### 特殊通道 + +- UsePass 插入所有来自其他着色器的给定名字的通道; UsePass "Shader/Name"; UsePass "Specular/BASE" 插入Specular中为BASE的通道 +- GrabPass 一种特殊的通道,捕获物体所在的位置的屏幕的内容,并写入一个纹理中,这个纹理能被用于后续通道中完成一些高级图像特效,后续通道可以使用 _GrabTexture进行访问 + +#### Fallback 降级 + +定义在所有着色器之后,如果没有任何子着色器能运行,则降级 +Fallback "NAME" +Fallback Off; + +### 基本类型表达式 + +- 浮点类型 float half double +- 整数类型 int +- 定点数 fixed来高效处理小数 +- bool 逻辑类型 +- sampler* 纹理对象句柄 sampler/1D/2D/3D/CUBE/RECT +- 内置向量数据类型 float4 +- 内置矩阵数据类型 float1×1 float2×3 float4×3 float4×4 +- 数组类型 float a[10] +- 语义绑定 float4 a : POSITION + +#### 结构体 + +struct name {} + +### 标准内置函数 + +- abs(num) 绝对值 +- 三角函数 +- cross(a, b) 两个向量求叉积 +- determinant(M) 矩阵得行列式 +- dot(a, b) 点积 +- floor 向下取整 +- lerp(a, b, f) 线性插值 +- log2 基于2为底的x的对数 +- mul(m, n) 矩阵×矩阵 矩阵×向量 +- power(x, y) x的y次方 +- radians(x) 角度转弧度 +- reflect(v, n) v关于法线n的反射向量 +- round(x) 靠近取整 +- tex2D(smaple, x) 二维纹理查找 +- tex3Dproj(sample, x) 投影三维纹理查找 +- texCUBE 立方体贴图纹理查找 + +### Unity自带函数 + +1. #include "UnityCG.cginc" +2. TRANSFORM_TEX:根据定点的纹理坐标,计算出对应的纹理的真正的UV坐标 +3. 使用属性的变量:在shader里面需要使用属性变量还需要在shader中定义一下这个变量的类型和名字,名字要保持一致 +4. 外部修改shader的编辑器上的参数值 diff --git a/content/unity/shader/shader_lod.md b/content/unity/shader/shader_lod.md new file mode 100644 index 0000000..561ba69 --- /dev/null +++ b/content/unity/shader/shader_lod.md @@ -0,0 +1,33 @@ +# Shader 中的 LOD + +## LOD + +- LOD (Level of Detail) 根据LOD来设置使用不同版本的shander +- 着色器中每个SubShader对应一个LOD值,只有第一个小于等于LOD值得SubShader才会被执行 +- 每个shader中最多只有一个SubShader被使用 +- 通过 Shader.maximumLOD 来设置最大得LOD值 +- 设置全局的LOD值,Shader.globalMaximumLOD +- unity中着色器LOD等级有: + - VertexLit kind of shaders 100 + - Decal, Reflective VertexLit 150 + - Diffuse 200 + - Bumped, Specular 300 + - BumpedSpecular 400 + - Paralax 500 + - Paralax Specular 600 + +## 渲染队列 + +### 渲染队列可选标签 + +1. Background 背景,对应的值为1000 +2. Geometry(default) 几何体对应的值为2000,这个队列是默认的渲染队列,大多数不透明的物体 +3. AlphaTest Alpha测试。对应值为2450,alpha测试的几何体使用这种队列,它是独立于Geometry的队列,它可以再所有固体对象绘制后更有效的渲染采用alpha测试的对象 +4. Transparent 透明 值为3000 这个渲染队列再Geometry被渲染,采用从后向前的次序;任何有alpha混合的对象都在这个队列里面渲染 +5. Overlay 覆盖对应的值为4000,这个渲染队列是最后渲染的物体 + +### Unity渲染模式 + +普通物体从前向后渲染,Alpha从后向前渲染 + +渲染队列的数值决定Unity在渲染场景物体时的先后顺序,关闭深度测试的情况下 diff --git a/content/unity/shader/unityshader.md b/content/unity/shader/unityshader.md new file mode 100644 index 0000000..1e7d721 --- /dev/null +++ b/content/unity/shader/unityshader.md @@ -0,0 +1,29 @@ +# Unity Shader + +## 普通Unity项目内提供的Shader类型 +- 标准表面着色器(Standard Surface Shader) +- 非光照着色器 (Unlit Shader) +- 图像效果着色器 (Image Effect Shader) +- 计算着色器 (Compute Shader) +- 光线追踪着色器 (Ray Tracing Shader) + +### 标准表面着色器 +如果我们像创建一个与光线交互的着色器,有两个选项 +- 使用无光照着色器,并添加允许再材质上进行光线渲染的数学函数 +- 或使用标准表面着色器,该着色器具有基本的照明模型 + +### 非光照着色器 +非光照着色器是指基本颜色模型,通常是我们用来创建效果的基础结构 +这种类型的程序,非常适合低端硬件 + +### 图像效果着色器 +其结构与非光照着色器非常相似,图像特效主要用于内置RP中后处理效果,并需要C#中的函数 OnRenderImage + +### 计算着色器 +这种类型的程序以在显卡上运行为特点,却位于正常的渲染管线之外,其结构与先前提到的着色器非常不同 +与普通着色器不同,他的扩展名为 '.comoute', 编程语言为HLSL + +### 光线追踪着色器 +光线追踪着色器是一种扩展名为 .raytrace 的实验性程序类型,他允许GPU进行光线追踪处理,我们可以使用这种类型的程序来替换用于光线投射处理算法的 '.compute' 类型的着色器 + +## URP或HDRP Unity项目中会有 Shader Graph diff --git a/content/unity/texture&light&material.md b/content/unity/texture&light&material.md index b1a09ab..7ed120e 100644 --- a/content/unity/texture&light&material.md +++ b/content/unity/texture&light&material.md @@ -1,17 +1,21 @@ # 图形和渲染 ## 贴图 + ### 数据格式 + - 压缩 让包体更小,但加载更慢 - 非压缩 加载更快,包体较大 ### 文件格式 + - Tga 32位 有8位Alpha通道 - Png 压缩格式,有透明色 - Jpg 压缩格式,无半透 - DXT 有不同的压缩格式 ### 压缩格式 + - DXTC - ETC - ASTC @@ -19,46 +23,71 @@ ### 纹理映射 ### Mipmap + - 如果场景有纵深,mipMap可让远处贴图看着不花(这是由多个贴图像素投影到同一个屏幕像素上造成的) - 可以提高渲染性能 ### 优化 + - 可使用24位色(无半透)的就不要使用32位 - 可使用压缩格式(3D物体)的就不要使用非压缩格式 - 颜色简单的可使用索引色 ## 灯光 + ### 动态光照 + 针对运动的物体或者光源,实时变化的光照 + ### 静态光照 + LightMap 预先烘焙好的,运行时不会再变得光照 + ### 光源类型 + - 点光(PointLight) 灯泡效果 - 方向光(DirectionLight) 太阳光效果 - 聚光灯(SpotLight) 舞台上聚光灯效果 - 全局光/环境光(AmbientLight) 照亮整个场景,无方向(或者说来自四面八方) - 区域光 - 体积光 + ### 自发光 + ### 光线追踪 + 反射 + ### 光影 + 可增加画面光影真实感 作用:环境光遮蔽(Ambient Occlusion) 全局光照(Global Illumination) + ### 优化 + 尽量减少同时激活的动态光源的数量以提高渲染性能 ## 材质 + ### 作用 + 是用来影响物体表现的,比如光照在物体上的表现 ### 类型 + #### Diffuse + 光源和物体面片的直接光照计算 + #### Normal Map + 表现物体表面的反光 + #### Specular + - 高光颜色可以表现在某个方向反射的入射光线多少,高光反映在您的眼睛与反射的入射光线的防线对齐的时候是最亮的,所以高光是根据视图进行变化的 - 法线也会影响高光,因为他会影响反射的光源方向。高光强度在您的眼睛和反射的入射光线或光泽程度,非常高的高光强度可以表现如镜面一般的程度,而低强度可以表现比较粗糙的表面 + #### Bump Map + 表现物体表面的凹凸感