IBL 是半球积分,不是单光方向
IBL 退化为各向同性(主流游戏做法)
"粗糙度→LOD"的 isotropic cubemap 采样
Unity/Unreal 预滤 cubemap兼容
Filament(Google)提供 anisotropic IBL 近似(方向 roughness)
-
roughness → 控制 D/G(高光形状、尾巴)
-
metallic → 控制 F0(反射能量分配:介质 vs 导体)



偏好的近似公式


做市商(Market Maker)是金融市場中提供流動性的特許機構或個人,透過持續報出特定證券、期貨或加密貨幣的買賣雙向價格,並以自有資金與投資者交易,從中賺取買賣差價(Spread)與流動性激勵獲利。他們確保了市場的活躍與連續性,解決流動性不足的風險。
一个稍微大点的币圈项目,背后基本都会找"庄家式的批发商"来帮它把市场做起来。
这些做市商在干的事,用大白话说就是三件事:
第一,帮你"摆摊"
项目的币刚上线,市场上没人挂单,买的人一冲进来价格就飞,卖的人一砸下来就崩。
做市商就像在交易所里同时挂好"买单"和"卖单",让别人随时都能成交,看起来市场很热闹。
第二,帮你"稳价"
币价不能一天涨十倍又跌九成,否则没人敢玩。
做市商会用资金和算法在中间缓冲,尽量让价格走势平滑一点,不至于太难看。
第三,顺便"赚钱+拿筹码"
他们不是白干的,通常会:
-
吃买卖差价(像外汇点差)
-
拿项目方给的代币奖励
-
甚至提前用折扣拿到一部分币,以后涨了还能赚更多
小币/新币:基本都是项目方提前找做市商谈好,安排流动性
大币/成熟币:更多是市场自发做市,很多机构同时竞争
第一,很多人不是来信故事的,是来赌别人会信
币圈里大部分参与者的逻辑不是:
"这个项目未来会改变世界,所以我投资。"
而是:
"这个叙事如果火了,会有人接盘,我能赚一波。"
所以故事的作用不是"说服你",而是制造一个共同预期:
只要足够多人认为它会涨,它就会涨。
这叫反身性(reflexivity)。
数据来源是什么
URP 的环境反射来源只有两类:
(1) Reflection Probe(反射探针)
Unity 会把 probe 渲染成 cubemap,然后做 mip 链预滤(不同 mip 对应不同粗糙度),运行时按你材质的 perceptual roughness 选 mip 去采样。
(2) Skybox(天空盒)
当场景没有合适 probe,或 probe 混合到远处时,Unity 用环境天空作为 fallback 的环境 cubemap(同样会有预滤版本/或者按管线生成的环境贴图)。
-
"屏蔽关键词 + 彻底干净界面":BlockTube + Unhook。
-
"更强调布局/排布可玩性":BlockTube + TubeMod。
-
"一套扩展尽量全包":Enhancer for YouTube +(必要时再加 BlockTube 做精确关键词屏蔽)。
It's been a long time since I last used my brain
在 IBL 里,环境光的 "D*G/4NoLNoV" 部分已经被预积分/折算进 GlossyEnvironmentReflection 的采样和 LUT(或预过滤 mip)里了,剩下需要按视角调整的主要就是 Fresnel,所以只再乘 F。
- IBL:用预过滤环境贴图 + BRDF 近似,把 D 和 G 的平均效应"打包"进采样结果;因此只保留 F 的角度依赖做最后的权重。


Every time this moment arrives---no, precisely at this moment---indeed, I was once a consumable, I consumed all of this, I praised these as beauty, and my heart found solace... This is not what I want. What I want has always been there, right before my eyes, but it is truly fragile. It is so hard for me to protect it, truly hard, hard, hard... I always think it will be easily trampled, and in fact, I know it is so. Therefore, I must become harder than anyone else, hard enough to make all sources that harm it stop entirely. Wowaka, Hachi---whoever it is, they are more worthy of "respect," because they better understand how difficult it is to create something. I cannot know what is in their minds, and I absolutely cannot know. Celebrities deserve respect not for their skills, but for their respective "源" (gen, origin/source), their hearts that protect their own "源." I do not know anyone's "源" is, this has nothing to do with class, but those who have done something are obviously more likely to respect their own "源."
No one knows what I am saying, but that is not important. What matters is that I know what I am saying, and I know I must abandon my own mind to participate in a bunch of things I think "if I don't participate in this, I'll probably die easily." Such things are really too difficult; just thinking about them pulls at my brain so much.
If you do not actively communicate, the world will also set your identity. You must cross this matter. I must place some bombs by my ears. Without enduring such pressure, you have no right to say you are protecting your source---you have no right to say it. You are just using your own stupidity to constantly find new directions, yet you have not joined this participation.
You know this is a bomb, I must admit this is a bomb for me, but I still have to do it, because in a situation where everything is chaotic, only I can find my own unique anchor. If you now abandon your own source, the source that is constantly hurt, in the end you will be ashamed of it, ashamed of it---a good counter-question: Do you want to be ashamed of your own soul? Your answer is no, but two bombs, one in your environment, one in your goal. You absolutely cannot place yourself in an environment without bombs, nor can you choose the bomb point of the goal just to avoid the current bomb. You must have your own source power; when protecting the source, only the source will give you the answer.
If I am to be judged, I must be a delusional patient. This is the bomb beside the source. How about that? If this is the bomb beside the source, will you still approach it? Will you still say you want to protect it?
In this light, doing nothing, judging and discussing these celebrities---isn't that the easiest thing for you? Then just do that, go look at the big picture, continue to watch.

在 vertex shader 里不能用隐式 LOD 采样(它需要屏幕导数),只能用显式 LOD。
- 法线贴图存的是"方向"(切线空间的单位向量)。
- "强度"不是贴图本身固定给出的标量,而是你通过 NormalScale 在解码时人为整体的放大或缩小这个方向的偏移。
所以法线贴图本质上只描述方向;如果你想要"沿方向的强度/高度",那是 高度图/位移图 的范畴,不是法线贴图。
简单说:
- 法线贴图:方向(旋转表面),不包含真实的"位移高度"。
- 位移/高度图:提供沿法线方向的位移强度。
你现在用法线贴图去做位移,视觉上容易"破碎",就是因为法线贴图不是为位移设计的。
- UnpackNormal:标准法线贴图解码(不带强度缩放)。
- UnpackNormalScale:标准解码 + 强度缩放。
- UnpackNormalmapRGorAG / UnpackNormalmapRGorAGScale:用于法线存到 RG/AG 的压缩格式(常见于 DXT5nm/BC5)。
如果你的法线贴图是 Normal Map 类型 ,UnpackNormalScale 通常是对的;
如果你贴图是 非 normal map 格式(比如直接存 XYZ/切线法线到 RGB),那就可能需要自己手动解码。
没有光照模型时法线图基本"看不出来"。
法线图只是改变表面法线方向,本身不改变颜色;只有在光照计算(比如 N·L、镜面高光)里,法线变化才会转化成明暗变化。
如果你想在不做完整光照的情况下"可视化"法线效果,可以直接输出法线颜色(N*0.5+0.5)或用一个固定光源做简单 N·L。

https://docs.blender.org/manual/en/latest/modeling/modifiers/generate/weld.html

blender 修改器是从上往下
Weld,会影响法线贴图的正确性,而且风险取决于你 Weld 的程度。
If, in circumstances where feasible actions are constrained, one must elect---opting for the suboptimal alternative, given the abundance of straightforward substitutive efficacies---how then can such selection not be deemed a form of ingenuity?
Bake 的数据来源是什么?
Bake 的数据来源取决于你 Bake 的类型。
但可以统一成一句话:
Bake 的数据来自"源对象 Source",输出写入"目标对象 Target"的 UV。
最经典结构:
High Poly(源) → 采样 → Low Poly(目标UV) → 写入贴图
映射关系:投影方式(Raycast/Cage)
Bake 必须回答:
Source 上的点如何对应到 Target 的 texel?
常见方式:
-
Ray Distance
-
Cage Mesh
-
Front/Rear Ray Offset
法线贴图 Bake后改顶点法线会炸
Tangent recalculation mismatch
什么叫"基底"(Base Shading Basis)?
在 Tangent Space Normal Map 工作流里,最终表面法线不是贴图单独决定的,而是:
Final Normal = Vertex Normal(基底) + Normal Map(偏移)
什么叫 Tangent Recalculation Mismatch?
法线贴图(Tangent Space Normal)并不是"直接替换法线"。
它存的是:
在切线空间(TBN frame)里,表面法线相对于顶点法线的偏移量。
也就是:
-
Normal Map = ΔN(局部偏移)
-
顶点法线 N + Tangent/Bitangent 决定如何解释 ΔN

Normal Map 必须和 Bake 时的 TBN 完全一致。


TBN Frame 是什么?
TBN Frame 指的是模型表面每个顶点(或像素)上的一组局部坐标轴:
-
T = Tangent(切线,UV 的 U 方向)
-
B = Bitangent(副切线,UV 的 V 方向)
-
N = Normal(法线,表面垂直方向)
它们组成一个正交基:
TBN=[T,B,N]TBN = [T, B, N]TBN=[T,B,N]
这就是所谓的:
Tangent Space Basis(切线空间坐标系)
Bake 时使用的 TBN 不是"统一的",而是 bake 工具根据低模的顶点分裂状态、UV seam、平滑组、切线算法生成的。
Unity 里如果重新计算 tangents,就会导致 mismatch。
顶点数据从来不是"统一的",因为顶点在渲染管线里会被分裂。
低模的一个"逻辑顶点"在 GPU 上可能对应多个"渲染顶点":
-
UV seam 分裂
-
Hard edge 分裂
-
Vertex color 分裂
-
Skin weight 分裂
这些都会导致:
同一个位置会生成多个 tangent frame

MikkTSpace 的目标是:
-
给定相同的 mesh 拓扑 + UV + 法线
-
不同软件计算出来的 tangents 一致
它统一的是:
tangent 生成算法
但它不能保证:
-
Unity 不重算
-
seam 分裂规则一致
-
顶点法线基底一致
-
导入后拓扑不变
所以 mismatch 仍然存在。
眼部沿相机方向位移 + 半透明材质的"眼透"效果,本质上是一个 View-dependent 的顶点/片元空间作弊,它发生在 Vertex Shader → Depth/Sorting → Transparent Pass 这一段。
你能控制渲染 Pass 的顺序吗?
在 Unity 里可以控制,但有硬限制:
(1)Opaque 的顺序:基本不可控(由深度预排序决定)
(2)Transparent 的顺序:可以控制(但不会写深度)半透明眼睛材质一定会进入 Transparent Queue(3000)
透明物体默认不写深度,所以外突 mesh 会产生排序错误和穿插问题。
深度写入发生在 Rasterization 后:
Z=Projection(VertexPosition)


多个对象导出(两个 mesh 或 mesh+armature)
结构变成:
RootNode
├─ Mesh_A
└─ Mesh_B
Unity 导入后:
-
会生成一个额外的父节点
-
子对象各自保留 Transform
正确导出一套骨骼控制的角色需要选什么?
必须同时选:
-
Armature(骨架对象)
-
所有绑定到它的 Mesh(Body/Eye/Hair/Cloth)
导出结构:
Character_Root
├─ Armature
├─ Body_Mesh
├─ Eye_Mesh
└─ Hair_Mesh
Unity 才会生成:
-
SkinnedMeshRenderer
-
正确绑定 bones
-
动画可用
也就是说骨骼只能一整套的导出,不存在一点一点的部分导出,,是个整体。mesh如果有就会贴上去在unity里加上对应的组件,
在blender里创建的fbx名字可以看做是根节点,
模型导入后的 Tangent(切线)与场景里的父子层级关系(Transform Parent/Child)没有直接关系。
如果你不在 fragment 使用 normal map:
-
法线扰动不会进入 BRDF
-
视觉上等于没用
-
贴图是高频信号
-
顶点数远少于像素数
-
顶点阶段采样会被插值平滑掉
有个非常在意的地方.就是在顶点里采样法线贴图到底会有多好的效果,这个细微的地方真的很有深入的空间,但是目前我就简单留着吧,先不管这些了。
目前管的是Tangent的问题,目前的法线贴图用在unityshader里出现的,大块加黑的效果,
Attribute 输入并不是"随便填一个变量名",它对应的是 网格上已经存在的某个数据层(Field / Attribute Layer)。
不是"每个顶点一定有值",而是取决于这个 Attribute 的 Domain(作用域)。
Geometry Nodes 里所谓 Attribute,就是:
Mesh 数据上存在的 Named Attribute(命名属性层)
你圈出来的:
-
position
-
material_index
-
sharp_face
-
smoothnormalWS
-
UV0
这些都是网格自带或你创建的属性层。
所以在节点里输入 Attribute 名称时:
-
填
"UV0"就会读取 UV0 数据 -
填
"material_index"就会读取材质索引 -
填
"smoothnormalWS"就会读取你存的法线向量
这就是"一一对应"。
"每个顶点都各有值"吗?
不一定。
Attribute 的核心不是"每顶点",而是:
每个几何元素(Element)都有一个值
Blender 属性有 Domain(域),决定它附着在哪种元素上。
3. Attribute 的 Domain 类型(非常关键)
Blender 中常见 Domain:
| Domain | 元素 | 数量级 | 典型用途 |
|---|---|---|---|
| Vertex(点) | 顶点 | 顶点数 | 权重、位移、mask |
| Edge(边) | 边 | 边数 | crease、sharp |
| Face(面) | 面 | 面数 | material index |
| Face Corner(角) | loop(每面每顶点) | 面×顶点 | UV、Split Normal |
| Instance(实例) | 每个实例 | 实例数 | scattering |
所以你的问题"每个顶点都有值吗"要看 Domain。
UV0 采样一张控制贴图 → 提取某个通道作为 mask → 用 ramp 做阈值/平滑 → 用 switch 决定是否启用 → 输出给描边宽度或描边材质选择。

wk,没有这个描边整个档次都掉下来了,好奇怪
Shader Editor 显示的材质 = 当前"Active Object"的"Active Material Slot"
而不是:
-
你在某个 Modifier 里引用的材质
-
你在节点组输入里填的材质
-
你点击的任意 Material 数据块
Modifier 里引用了一个不在该 Mesh 材质槽里的材质时,Blender 本体通常还能显示,但导出、实例化、Unity 导入时会产生不可控的材质丢失或 Slot 重排问题。
Blender 内部逻辑:
Modifier 的材质字段是一个"Material datablock pointer"
它可以直接指向任意材质数据块:
-
不要求存在于 Slot
-
不要求在对象上可见
所以在 Blender viewport:
-
Modifier 生成的几何仍然能正确显示 outline/shadow proxy
-
因为 Blender 渲染时允许直接引用材质 datablock
所以你在 Blender 看起来不会出事。
但真正的问题在于:导出(FBX/GLTF)时
FBX/GLTF 的规则是:
Mesh 只能导出它 Material Slot 列表里的材质
Slot 外的材质不会被写入
因此:
Modifier 生成的面如果使用了 Slot 外材质:
导出时会发生:
-
材质被丢弃
-
材质 index 被替换成 Slot0
-
Unity 导入时出现材质错位
又想到一个好点子,不对,,不是覆写,而是叠加混合,,混合的话就不算是不透明物体了,好像不怎么对,对同一个区域 同时用上两个材质,先走材质1然后走材质2,
Unity MeshRenderer/SkinnedMeshRenderer 的材质系统是严格的:
-
SubMesh 0 → Material Slot 0
-
SubMesh 1 → Material Slot 1
如果导出时 Modifier 引入了额外材质但 Slot 没包含:
Unity 会:
- 自动补一个空材质槽(Missing)
头发内部多一层黑壳
或投影异常厚
Set Material 的作用非常明确:和传统 Mesh 编辑模式下"分块使用 Material(Assign Material Slot)"的区别非常关键,属于"静态拓扑分配" vs "程序化属性分配"。
...
不改变原模型外观的前提下,生成一个"透明但参与阴影计算"的替身网格
... ...
可扩展:Renderer Feature / ScriptableRenderPass 是你最常插入自定义 pass 的位置
自定义点不同:Custom Pass(HDRP Custom Pass API)是主要扩展入口,不同于 URP 的 Renderer Feature
-
HLSL 插值修饰符(nointerpolation / noperspective / centroid / sample)在三者里本质一致,因为最终都走同一套编译链(HLSLcc/DXC 等)和 GPU 语义。
-
差异主要在"你能在哪里写、怎么接入":
-
URP:ShaderLab + HLSL(Shader Graph 的 Custom Function 也行),渲染扩展用 Renderer Feature/Pass。
-
HDRP:Shader Graph + HDRP 的材质系统更强,但很多底层特性(尤其材质/光照)被框得更紧;扩展渲染用 Custom Pass。
-
补齐一整套现代引擎渲染管线的基础设施。它不是"写几个 Pass"这么简单,而是一组互相耦合的子系统。
Frame Graph / Render Graph 级别的资源管理
现代管线不是"直接画到屏幕",而是:
-
多个中间 RT(GBuffer、Depth、Normal、Motion、SSAO...)
-
多次读写
-
生命周期管理与别名复用
你需要处理:
-
RT 分配、重用、降分辨率链
-
Load/Store 策略(tile GPU 非常敏感)
-
MSAA resolve
-
HDR buffer 与 tonemap 前后格式
URP/HDRP 都有自己的 RTHandle/RenderGraph,你自写 SRP 就要自己管。
