在着色器图中访问二级纹理法线贴图?

Posted

技术标签:

【中文标题】在着色器图中访问二级纹理法线贴图?【英文标题】:Accessing a secondary texture normal map in shader graph? 【发布时间】:2020-09-10 02:17:38 【问题描述】:

我正在使用 Unity 2020.1.3f1 的 URP,以及新的 2D 渲染器系统。 截至目前,我的对象在内置的“Sprite-Lit-Default”材质和带有自定义构建的像素轮廓着色器的材质之间发生变化,详细信息如下:https://danielilett.com/2020-04-27-tut5-6-urp-2d-outlines/

这很好用,但我最近在我的精灵中添加了灯光和法线贴图,作为导入设置中的辅助纹理。默认光照纹理在显示法线贴图时没有问题,但是当我尝试修改我的着色器图以包含法线贴图时,它不会像将 _MainTex 设置为参考时的精灵纹理那样导入。

我已经尝试过 _NormalMap(这是导入器中二级纹理的名称!)以及 _NormalTex,但它总是最终无法导入法线贴图。我什至尝试将 _MainTex 更改为 Texture2D,但鉴于这不断引发错误,我认为这不是正确的方法。 (这个要具体。)

Error assigning 2D texture to 2DArray texture property '_MainTex': Dimensions must match
UnityEditor.EditorApplication:Internal_CallUpdateFunctions()

我在这里遗漏了什么吗?我可以在网上找到的所有教程都只显示人们通过检查器将法线贴图拖入,但这种材质将被许多不同的精灵使用,所以这似乎......违反直觉。

最重要的是,默认材质/着色器对此没有任何问题,所以我觉得我要么遗漏了一些东西,要么我最终不得不编写我的精灵来通过代码更改材质,而不是动画师,只是为了这个小而烦人的怪癖..

Blackboard Properties, and nodes. This just goes into the normals input.

Inspector panel showing the missing normal map slot.

And the Secondary Textures in case I somehow misnamed it, why not?

(编辑) 因此,对于遇到相同问题的其他任何人,对此进行更新。 我设法找到了shadergraph 文档的section,这似乎是唯一谈论这个的部分:

需要将 MainTex 的引用命名为 _MainTex 才能渲染 Sprite。还建议将 Mask 的引用命名为 _MaskTex,将 Normal 命名为 _NormalMap,以匹配此包中使用的 Shader 输入。

因此,据我所知,_MainTex 是 ShaderGraph 中唯一自动的。 经过一整天的查找教程后,我注意到它们中的每一个都只是将法线贴图和额外纹理设置为默认纹理,这样它们就会显示出来,而无需手动分配。

我认为这可以通过手写着色器实现,但我决定在手绘精灵轮廓上使用简单的无光照着色器图,显示在主对象的单独游戏对象上。 我不会将此作为答案发布,以防其他人将来找到解决方案,因为这不是......在我看来真的是一个解决方案。

【问题讨论】:

【参考方案1】:

我不知道您是否已经解决了这个问题,但我会尝试回答,因为我遇到了同样的问题。创建一个新的 Texture2D 节点,将其转换为属性,并将引用作为 _NormalMap,将其正常连接到示例纹理 2D 节点,然后将其插入 sprite lit master。现在进入精灵编辑器,将法线贴图指定为次要纹理,并确保名称与着色器中的名称相同,_NormalMap(或其他名称,只要相同)。这目前对我有用,着色器图通过引用自动检测法线贴图纹理。下面附上一些图像来帮助和角色精灵的最终结果,它使用了我从教程中挑选的自定义着色器并添加了法线贴图。 Shader GraphSprite EditorSprite Editor 2Normal Map result

【讨论】:

以上是关于在着色器图中访问二级纹理法线贴图?的主要内容,如果未能解决你的问题,请参考以下文章

Unity shader - 如何根据纹理贴图生成法线贴图

使用 WIC 将法线贴图保存为 16 位纹理

什么是从纹理创建法线贴图背后的逻辑?

具有多个着色器程序的 OpenGL 多纹理

切线空间法线贴图 - 着色器完整性检查

计算机图形学-纹理的应用,环境贴图凹凸贴图法线贴图位移贴图