🧠 blender为什么不用 M 或 T?
键位 | 含义 | 为什么没选 |
---|---|---|
M |
Move?其实被用作「Move to Collection」等功能 | 不符合历史定义,而且功能太多了 |
T |
Transform? 但 transform 是一个总称(含移动、旋转、缩放) | T 被用来打开工具栏(Tool Shelf) |
Blender 设计理念是 直接映射操作行为 而非语义缩写,所以:
"我抓住物体(Grab)→ 然后移动" 这个动作 =
G
重启blender删除0的使用数据
动,这是特效
不是拿骨骼k的,特效拿骨骼去k---大材小用
丝袜的网格就不能是边缘清晰了
Alpha Cutout(又称 Alpha Test)
这些都是适合使用 Alpha Cutout 的典型场景:
镂空金属:例如铁丝网、铁门,alpha map 控制哪部分镂空。
裙摆边缘:卡通风格中经常用来表现轻飘飘的剪裁边。
特定风格下的头发:如二次元发卡、刘海尖等,边缘清晰,直接裁切。
树叶:一整片叶子贴图中,有 alpha 图表现叶子形状,用裁切来剔除空白区域。
卡通渲染特效:比如一些光环、魔法阵边缘清晰的效果。
边缘效果太实:
没有平滑渐变的边缘,会像“锯齿状”。
在一些软材质(如羽毛、烟雾)上不适合,看起来太硬。
移动端性能较差:
因为
clip()
或discard
会造成分支跳转,GPU 不能批量并行执行,会增加性能压力(尤其 tile-based mobile GPU)。
Alpha Blend(左):使用
alpha blend
,像素不直接裁掉,而是混合透明度,边缘更自然,但排序问题严重。Alpha Test / Cutout(右):边缘硬,树叶清晰,没有叠加透明问题,适合植物类。
摄像机可以设置rendertype,改看到的物体材质的rendertype
当做形式,但特效相关
ab,如果是 Blend One OneMinusSrcAlpha
如果改成 Blend SrcAlpha OneMinusSrcAlpha
结果上预先再乘以一个alpha,所以会显得忘里面再吃一点,更加暗一点
视频里更明显
名称 | 意义 |
---|---|
Zero |
(0,0,0,0),相当于完全不参与混合 |
One |
(1,1,1,1),完全参与 |
SrcAlpha |
当前像素的 Alpha 值,用于控制透明度 |
OneMinusSrcAlpha |
1 - Alpha,常用于背景保留比例 |
DstColor |
目标颜色参与混合 |
OneMinusDstColor |
背景颜色的反向 |
SrcAlphaSaturate |
min(alpha, 1-alpha) ,用于特殊自遮挡 |
名称 | 含义 |
---|---|
Add |
默认,Src + Dst |
Subtract |
Src - Dst |
ReverseSubtract |
Dst - Src |
Min / Max |
分别取颜色的最小值/最大值 |
Multiply |
乘法混合,变暗 |
Screen |
滤色,提亮 |
Overlay |
叠加,亮中有暗、暗中有亮 |
ColorDodge / ColorBurn |
高光/暗化模式 |
HardLight / SoftLight |
硬光/柔光(Photoshop同名混合模式) |
Difference / Exclusion |
差值、排除,主要用于特效或滤镜 |
HSLHue/Saturation/... |
高级 HSL 模式,需要扩展 OpenGL 支持 |
// 标准透明混合
Blend SrcAlpha OneMinusSrcAlpha// 累加发光效果
Blend One One// 全部替代原始颜色
Blend One Zero
右边要用到c#里面的知识
最终颜色=Src∗DstColor+Dst∗(1−DstColor)
每个通道是 逐个分量(component-wise)参与混合的,四个值完全独立。
Unity 和 OpenGL 中颜色混合不是单值计算,而是对 RGBA 每个分量 独立混合,DstColor
代表的是 (Rd, Gd, Bd, Ad)
,参与逐分量乘法。
Shader 变量是否占用内存?:会占用,但很少
就像普通编程语言(如 C/C++)一样,Shader 中局部变量在函数作用域内会占据寄存器或临时存储空间,但函数执行结束后这些空间就被释放。它不会叠加占用内存,只会复用。
🧪 Blend 配置选择建议
使用场景 | Blend 设置 | 说明 |
---|---|---|
❌ 没有预乘 | Blend SrcAlpha OneMinusSrcAlpha |
Unity 默认 |
✅ 预乘了 alpha | Blend One OneMinusSrcAlpha |
更干净,无边缘污染 |
实际在做特效的时候很多图都是预乘的
特效是,是拽特效库里面的图,里面的图有带alpha,有不带alpha的
所以需要根据这种复杂的情况做不同的shader
颜色预乘(Premultiplied Alpha)不是为了让颜色“变”,而是为了让混合公式更简洁、更正确。
RGB = 原始RGB × Alpha
这确实让颜色变得“看起来更浅”,但这不是为了视觉效果,而是为了更安全和高效的混合。
预乘的真实目的:
目的 | 说明 |
---|---|
✅ 避免边缘污染 | 没预乘时,Alpha 为 0 的区域 RGB 仍保留原始颜色,可能在边缘混出错误色(常见于羽化、贴图压缩) |
✅ 简化混合公式 | 使用 Blend One OneMinusSrcAlpha ,跳过 shader 中手动 rgb * alpha 的步骤,提高效率 |
✅ 提高性能 | 在某些 GPU 中预乘图像可以加速合成处理,尤其是在后期特效、大量粒子系统中 |
贴图一个羽毛的边缘处,Alpha 为 0,但 RGB 仍是蓝色。
✅ 未预乘:这时候羽毛周围是透明蓝 → 混合会出现蓝边。
✅ 预乘:这时候羽毛周围 RGB = 0 → 混合干净无色。
即使 alpha 是 0,那些 RGB 信息仍然参与混合计算,只是最后你“看不到”而已,但它们影响了结果。
假设羽毛边缘处贴图颜色如下:
RGB = (0.0, 0.0, 1.0) // 蓝色
A = 0.0 // 完全透明
outColor.rgb = Src.rgb * Src.a + Dst.rgb * (1 - Src.a)
= (0.0, 0.0, 1.0) * 0.0 + Dst.rgb * 1.0
= Dst.rgb
看起来没事对吧?但是如果:
贴图有压缩(如 DXT、BCn),蓝边可能“泄露”到 Alpha 不为 0 的区域
有MSAA、模糊、滤波、颜色拉伸等,RGB 会被周围像素采样
这时候这个“透明蓝”的 RGB 值就污染进来了
👉 所以虽然当前像素是 A=0,但它的 RGB 会影响附近的混合区域。
PR(Pull Request) 是什么?
Pull Request(简称 PR) 是 GitHub(以及其他 Git 托管平台)中用于提议更改代码的机制。
你可以理解为:
“我 fork 或 checkout 了项目,在某个分支上修改了代码,现在我想合并回主项目,请大家审核我的代码。”
在 PR 页面上你可以看到:
哪些 PR 是 Open(未合并)
哪些是 Merged(已合并)
PR 的内容改了哪些文件、增加/删除了哪些代码
设置里的general
Branch Format(自动创建分支的命名模板)
当你让 Codex 帮你在 GitHub 上做代码修改、创建 Pull Request 时,它可能会自动为你创建分支(branch)。
这个设置决定它用什么格式来命名这些分支。
ta-fix/{feature}-{date}
就能生成 ta-fix/alpha-blend-fix-2025-07-08 这样的分支名。
设置里的environment
当你让 Codex 执行代码(比如测试脚本、自动安装依赖、运行构建任务等)时,它在什么系统环境下运行、如何准备运行环境、是否联网等。
Container image(容器镜像)
这是你代码执行时用的基础系统环境,类似虚拟机的“操作系统”。
你选择的是
universal
,它是基于 Ubuntu 24.04 的通用镜像,已经预装了很多常见工具(如 Python、Node.js、Git、curl、pip 等)。点旁边的 Preinstalled packages 可以查看这个环境自带了哪些依赖。
💡 **理解类比:**你可以把它当成“你租给 Codex 用的一台电脑”,这就是装的系统。
Environment variables(环境变量)
这里可以设置运行代码时注入的环境变量,常用于:
设置路径(如
PATH=/custom/bin
)提供构建标志(如
BUILD_ENV=debug
)控制行为(如
USE_GPU=false
)
🚫 默认不需要设置,除非你知道项目某些部分依赖这些变量。
Secrets(机密变量)
这里可以添加一些不应该暴露在代码里的敏感信息,如:
API token(比如 GitHub Token)
密码、私钥路径
Codex 会在运行环境中注入这些 secret,但不会在输出中显示出来(防泄漏)
📌 适合你之后部署 Web 项目或要访问私有资源时使用。
“Network access is always enabled for this step.”
意思是 这一段 setup 脚本始终可以联网执行,哪怕你在其他地方关闭了 Codex 的联网权限。
所以你需要确保 setup 脚本不会拉取恶意代码或安装危险依赖,尤其是在使用第三方仓库或插件时。
这里的Test和Createpr是干什么的
这整个过程
步骤 | 意义 |
---|---|
✅ Codex 生成了脚本 | 写入了 SimpleLogger.cs |
✅ 自动跑了 git status |
检查是否准备好纳入提交 |
✅ 输出干净 | 说明文件被正确追踪,没有遗漏 |
✅ 可以点击 “Create PR” | 正式发起 Pull Request,推送到 GitHub 上 |
Create PR
按钮 —— 是 创建 GitHub Pull Request 的快捷入口
你点这个按钮,就是:
将 Codex 生成的更改(在右侧 Diff 面板中可见)作为一次 Pull Request(合并请求)提交到你的 GitHub 仓库。
也就是:你允许 Codex 把这次代码更改作为“一个功能或补丁”正式提交,并进入 GitHub 的协作工作流。
现在尝试Createpr
跳转到view视图里面
xxxxx
我的建议还是去好好玩几遍 https://编辑learngitbranching.js.org/?locale=zh_CN git 游戏, 理解一下 git 的底层逻辑, 不然以后你碰到 git 问题真的挺恶心的. 如果你真的把版本控制弄的一团糟, https://ohshitgit.com/ 是你的解药.
----
结论是codex速度太慢,稍微又熟悉了一下github
xxxxx
浮点精度问题,噪声图和maintex相互交错,所以需要frac
UV 被扰动后超出了 [0,1] 范围
uv += noise; // noise 可能是 [-1, 1],扰动后 uv > 1
精度,超出的部分没东西采样,就透明
frac(x)
会保留 x
的小数部分,相当于将 UV 强制 wrap 到 [0,1) 区间
frac(0.25)
→0.25
frac(1.001)
→0.001
frac(-0.3)
→0.7
(因为 floor(-0.3) = -1, 所以 -0.3 - (-1) = 0.7)
和 mod(x, 1.0)
的区别?
frac(x)
和mod(x, 1.0)
类似,但frac
更快,且语义专为 [0,1) wrap 设计注意:对于负数时,
frac
总是返回正数,而mod
会根据语言/平台返回正负不定(GLSL 的 mod 和 HLSL 的 mod 表现不同)
系统时间留到非常非常久了
如果在多个 DCC 软件中只做简单建模(正方体、雕刻等),导出的 FBX 是否可以完全统一?
又是哪些额外因素会导致 FBX 不再一致?
❌ 骨骼、权重、动画等内容 —— 不能保证完全通用
功能项 | FBX 是否支持 | 不同 DCC 软件是否能一致解析 | 原因说明 |
---|---|---|---|
✅ 网格结构 | ✔️ 完全支持 | ✔️ 一致(标准几何体) | 顶点、面、UV、法线都定义明确 |
⚠ 法线切线 | ✔️ 支持 | ⚠️ 有时自动重算或丢失 | 依赖导出选项与导入默认设置 |
❌ 骨骼结构 | ✔️ 支持 | ❌ 节点坐标系/绑定姿态不同 | rest pose / joint orientation 差异 |
❌ 绑定权重 | ✔️ 支持 | ❌ 权重精度/归一化方式差异 | 有时需要重刷或重新绑定 |
❌ 动画轨迹 | ✔️ 支持 | ❌ 曲线解码方式不同 | 有些软件用自定义控制器 |
❌ Blendshape | ✔️ 支持 | ❌ 命名方式、存储策略不一 | Maya vs Blender 表达方式不同 |
只包含模型构建(Mesh)本身的 FBX 文件,是可以做到几乎完全通用的,即:
几何体(顶点、边、面)
UV 坐标
顶点法线(如正确导出)
基本贴图路径(漫反射贴图)
这些内容在主流 DCC 软件(如 Blender、Maya、3ds Max、ZBrush、Unity、Unreal)之间是可交换、可解析、可正确导入的。
xxxx
lerp(a, b, t)
中的 t 超出 [0, 1] 时,结果仍然会被正常计算,且可能为负数。不会自动 clamp。
如果你想确保 t
限制在 0 ~ 1 范围内,需要手动加 saturate(t)
:
lerp(a, b, saturate(t)); // 只在 0~1 内插值
噪声图单通道,扭曲图是三维的
两个通道控制uv的扭曲方向,blue通道保存噪声图
remap是希望可以往正负两个方向去偏移,所以
图存0~1,然后需要变成正负方向remap,-0.5,再乘2
变成-1~1
noise图里面的数字的含义是,对需要影响的图的影响权重,独立则不会产生任何意义
噪声图的值 ≠ 意义,而是意义来源于你如何使用它
举例:
用法场景 | 噪声值代表的意义 |
---|---|
UV扰动(flow map) | 像素值代表扰动的方向或偏移量 |
溶解遮罩(dissolve) | 像素值作为某一阈值的比较,控制显示区域 |
光照扰动(Fresnel mask) | 像素值作为 Fresnel 效果叠加因子 |
透明度扰动(你现在的 GhostWarp) | 像素值参与透明度计算,改变渲染效果 |
随机颜色混合、分布、特效参数控制 | 像素值控制混合比、颜色选择或变化速率等 |
half noise = lerp(1.0, var_WarpTex.b * 2.0, _NoiseInt);
opacity = baseAlpha * noise;
此时:
var_WarpTex.b 是噪声图中的每个像素值
它的作用是:“让 opacity 按不同像素位置产生扰动”
如果你注释掉这句,用常量 1.0 代替 noise,那噪声图再存在也毫无意义
return float4(-1.0, 0.5, 2.0, 1.0);
在不同平台中你会看到:
条件 | 最终显示颜色 |
---|---|
普通 8bit 屏幕输出(LDR) | 黑+中绿+纯白 → 实际为 (0.0, 0.5, 1.0) |
使用 HDR Camera + Bloom 后处理 | 可能看到泛光或亮度异常 |
自定义 RenderTexture 输出 | 保留完整 float,结果依赖后续处理 |
你看到的结果是混合误用的副作用,不是设计内的“反色效果”
它并不稳定,也不跨平台,在移动端、低配机或 Vulkan/Metal 下可能直接变黑或完全透明。
总结:蓝色 → 变橙黄 是合理的,原因如下:
步骤 | 解释 |
---|---|
蓝色 × -1 | 得到负蓝(0, 0, -1) |
作为 Src.rgb 参与混合 | 变成 +1.0 + 背景*2 (超亮 + 冲突) |
背景叠加高亮蓝 | Gamma 曲线 + Bloom 推向橙黄方向 |
显示器 clamp & tonemap | 导致白泛、橙斑、颜色错觉 |
之后的课程加上背景扭曲
对于一个像素来说,当 UV 被放大(乘以大于 1 的数),会导致其在纹理空间中“移动得更快”,从而在屏幕空间中采样到更密集、更细小、更重复的图案;而“差别变小”,是因为单位屏幕距离内采样的纹理跨度更小、变化频率更高,导致整体趋于细节压缩。
官方建议把uv拿float去存储
对啊,这些都是变量啊,为什么一定要按照标准来,这里也只是介绍了方法去使用uv
这个Ghost的逻辑写的,导致wrap强度调整还会移位MainTex
xxxxx
这种就简单做个河流,做个小池塘
xxxx
直接使用offset里面的值去改变流动
UnityObjectToClipPos (v.vertex)
is required because every vertex shader must output the vertex position in clip-space (the value carrying the semantic SV_POSITION
). If the GPU doesn’t receive that clip-space position for each vertex, it cannot:
Clip triangles against the view frustum.
Homogeneously divide the coordinates to produce normalized device coordinates (NDC).
Rasterize the triangles into fragments and interpolate any other varyings you send (UVs, colors, normals, etc.).
Is the generated o.pos
value “used”?
By the GPU pipeline: absolutely—rasterization depends on it.
By your own code: you rarely sample it directly in the fragment shader, but any macro that needs screen position, depth, or fog will consume it (e.g.
COMPUTE_SCREEN_POS
,TRANSFER_SHADOW
in Unity shaders).If you omit or write an incorrect
SV_POSITION
, the mesh won’t appear or will be clipped incorrectly, even if all other varyings are perfect.
观察空间 VS(View Space):float4
- 定义:以相机为原点的坐标空间。(ps:观察空间与屏幕空间不一样,观察空间是一个三维空间,屏幕空间是二维空间)。
https://zhuanlan.zhihu.com/p/505030222
Unity 渲染流水线变换矩阵详细讲解_哔哩哔哩_bilibili
【教程】技术美术入门:渲染管线概述_哔哩哔哩_bilibili
近大远小的效果,根据near和far压扁模型,展现正常图片 效果
只是把模型进行了一个变形的处理
灰色部分都是硬件去处理的,不能控制
视椎体剔除,是针对一整个 模型的
投影矩阵本身不能“删除”物体,它只负责把视野内的空间投影成 Clip 空间值。
真正进行“剔除”的是 GPU 固定功能管线,对 Clip 空间做裁剪规则判断。
控制是否参与“裁剪空间剔除”(GPU自动)
这是 GPU 光栅化阶段默认的行为,但你间接可控:
控制方式 | 控制对象 | 举例与说明 |
---|---|---|
✅ 修改 Projection Matrix |
控制裁剪区域范围 | 例如:加大FOV、拉远近平面,Clip空间容纳更多 |
✅ 改变传入顶点位置 | 你自己修改了 vertex shader 输出的 SV_POSITION |
比如“假装”物体在视野内,让它不被裁剪 |
⚠️ 不推荐:强行输出视野外点 | 可以让视野外物体被“拉回屏幕” | 但这会造成视觉错位或崩溃,不常见 |
总结:你无法关掉裁剪机制本身(除非你完全重写渲染流程),但你可以通过“改变投影矩阵”或“修改传入坐标”间接绕过。
SRP 不能取消的:
固定流程阶段 | 是否可控 | 原因说明 |
---|---|---|
Clip Space 裁剪(裁剪坐标超出 -w~w) | ❌ 不可控 | 这是 GPU 固定的光栅化前流程,无法在 SRP 级别关闭 |
Homogeneous divide(齐次除法) | ❌ 不可控 | 这是 GPU 自动做的投影机制 |
深度测试、Z-buffer 写入(除非你禁用) | 部分可控 | 你可以关掉 ZTest,但不能移除整个深度机制本身 |
透视除法之后,转(标准化设备坐标) NDC在通过顺逆时针剔除了背面的三角面之后
就要进入屏幕空间(转换成屏幕的1920x1080)这样的形式
这个过程里只拿xy坐标,z坐标后面有更重要的事
TRANSFORM_TEX
是 Unity Shader 中一个非常常用的宏函数,主要用于对 纹理坐标(UV)进行缩放和平移变换
#define TRANSFORM_TEX(tex, name) (tex.xy * name##_ST.xy + name##_ST.zw)
- frac(_Time.x * _ScreenTex_ST.zw)
减法是移动的标配
screenUV *= originDist
的行为不总是视觉合理
它是用物体离相机距离
Z
来缩放屏幕 UV但这个“锁大小”是假设物体平行于摄像机投影面
⚠️ 如果模型不是正对相机(比如有角度),这个缩放会导致视觉失真或纹理漂移
tex2D(_ScreenTex, i.screenUV)
里的screenUV
可以大于 [0, 1] 吗?如果超出范围会发生什么?
答案是:
✅ 可以大于 0~1,关键取决于纹理的 Wrap Mode(环绕模式)
默认行为(Unity中多数纹理默认是 Repeat):
i.screenUV 范围 |
tex2D 的采样行为 |
说明 |
---|---|---|
0 ~ 1 | 纹理正常采样 | 落在贴图内部 |
>1 或 <0 | 取决于贴图导入设置中的 Wrap Mode | 会发生重复、拉伸、或边缘值钉死等现象 |
贴图方向完全取决于模型的 UV 展开方式,与世界空间的 XZ 无直接对应关系,而与模型局部坐标系中顶点的 UV 映射有关。
也就是说平面的uv是有问题的,不要信
可以信的,只要你可以位移,和你可以放缩整体
tiling很大,超出了0到1的范围,但此时的offset是相对于原uv0到1的移动手段,而移动是是整体,所以offset独立于tiling的密铺
return uv.r
也就是说左边的uv为1,和物体的坐标系相反,这个plane的uv是这样映射的
直接整个都是反的,靠
posVS.z
是当前 顶点位置
v.vertex
转换到 View Space 后的 Z 值即:这个点 相对于摄像机的前后距离
注意:在 Unity 中,Z 轴朝向是负的,所以:
posVS.z < 0
→ 在摄像机前面(正常可见)
posVS.z > 0
→ 在摄像机后面(看不到)
originDist
是 模型原点
(0, 0, 0)
转换到 View Space 后的 Z 值也就是:整个物体中心(模型局部坐标系原点)离摄像机的 Z 距离
这通常作为一个“基准深度”或“单位深度参考”。
o.screenUV = posVS.xy / posVS.z;
👉 这是在 View Space 里直接除以 Z,没有转换成 Clip Space。
这样也可以吗?为什么?
可以,但只是近似模拟透视投影效果,不是完整的标准投影流
这个写法是 一种“自定义构造屏幕投影UV”的简便方式,在不使用完整 MVP(Model-View-Projection)变换的情况下,模拟投影缩放效果,常见于早期或者低开销 Shader。
但注意:这种方式是“非线性近似”的
项目 | posVS.xy / posVS.z |
正规 clipPos.xy / clipPos.w |
---|---|---|
精度 | 低,不能精准对应屏幕像素 | 高,严格按照投影矩阵压缩 |
投影适配性 | 固定 FOV + 固定 NearFar 才能稳定使用 | 任意 FOV、透视矩阵都支持 |
视觉表现 | 可用于模拟投影、屏幕UV、雷达图、波纹等 | 准确用于屏幕UV、GrabPass、遮罩、溶解等 |
你现在这种写法是合法的,特别适用于:
没有 GrabPass,但想要制作“贴屏特效”
只需要视觉感受类似透视缩放,不追求像素精确投影
效果贴在 Plane、Quad 上,或者用在扰动类 FX 中(水波、能量、雷达)
阶段 | 名称 | 作用 |
---|---|---|
View Space | 相机视角下的真实空间,仍是“物理单位”(米) | 有透视锥体结构,Z 越大越远 |
Clip Space | 被投影矩阵拉伸成四维“正方锥” | 进行裁剪、透视除法前的空间 |
NDC Space | 经过除法后压成了长方体([-1, 1]^3) | 屏幕映射前的标准单位坐标 |
除以了view space下的z,
解决了一个问题,不会畸变了,但带来 了一个问题,就是现在不会随着远近而变化这张 贴图了
接着就解决近大远小的效果
不要用顶点的距离,因为这里除一下再乘一下还是回去之前的效果--依然畸变
在 Unity 内置渲染管线 中可以这样GrabPass (虽然不推荐大规模使用)
在 URP / HDRP 中,GrabPass 被弃用,但提供了更高效更明确的替代方案
URP:
_CameraOpaqueTexture
(你要在管线设置中开启)手动 Blit + 设置 RenderTexture 给 Shader
使用
CommandBuffer.Blit
将屏幕渲染缓存下来
Blend 是“当前像素缓冲区中的颜色”
它只能访问:当前正在写入的目标像素点的颜色
这通常是:Framebuffer 中该像素的已有颜色(上一层 pass 或物体渲染后的结果)
操作由 GPU 的渲染硬件自动进行,不允许你手动读取或修改,只能通过 blend 参数控制混合方式:
Blend SrcAlpha OneMinusSrcAlpha
💡 你只能控制颜色怎么混,但不能读它的内容,也不能改它对应哪块区域。
GrabPass 是“整张屏幕截图的纹理”
它会在渲染这个物体前,把整个屏幕内容渲染成一张纹理(RT)
然后你可以在 Shader 中任意采样任意位置的屏幕内容:
tex2Dproj(_BGTex, grabPos);
可以采样的区域不仅限于当前像素点,可以扭曲、扰动、偏移等操作
在 tex2Dproj(_BGTex, grabPos)
中,使用 proj
(投影采样)而不是常规 tex2D()
,是因为 GrabPass 返回的是屏幕空间坐标中的一个齐次坐标(Homogeneous Coordinate),也就是一个 clip space / projection space 的值,带有 w 分量,它必须被还原成 2D UV。
函数 | 传入参数 | 会不会自动除以 .w |
典型用途 |
---|---|---|---|
tex2D() |
float2 uv |
❌ 不会 | 普通 UV 贴图 |
tex2Dproj() |
float4 uvwq |
✅ 会除以 .w |
投影纹理 / GrabPass 的屏幕坐标 |
一小时入门URP:从渲染原理到艺术馆制作_哔哩哔哩_bilibili
xxxxx
针对网格的shapekey
GrabPass
提供的是屏幕图像,但这个图像的采样坐标来自 裁剪空间(Clip Space) 的输出 SV_POSITION
。
o.grabPos = ComputeGrabScreenPos(o.pos); // 背景纹理采样坐标
的意义非常关键:它将顶点的裁剪空间坐标 o.pos 映射成可以用于采样 GrabPass 背景纹理的坐标,并且保留为 float4,供后续 tex2Dproj() 做透视除法使用。
越不透明,越能折射效果
是合理性的编排