问题标签 [shader-graph]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unity3d - Unity3D - 如何在使用 Shader Graph 制作的着色器中关闭“接收阴影”?
与默认 URP 着色器不同,自定义 Shader Graph 着色器不附带“接收阴影”复选框,如您在此处看到的。如何在我的着色器上禁用阴影接收?或者,关闭使用我的着色器的任何材质/对象上的阴影接收
unity3d - 尝试在 PBR 着色器图中设置顶点法线时 Unity vs_4_0 指令错误
我正在尝试使用 Universal Render Pipeline 的 PBR Shader Graph 创建海洋 PBR 着色器,但是当我尝试在 master 中分配法线时,它会引发错误:
表达式断言失败:'0 == m_CurrentBufferBindMask[kUnityPerDraw]' UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
和
无法将表达式映射到第 132 行的 vs_4_0 指令集(在 d3d11 上)
计算出的法线是使用变换节点上的方向模式变换到对象空间的全局法线。
这是我当前的着色器图:
“WaveNoise”节点是一个自定义子图着色器,它使用堆叠的正弦波和余弦波从位置输出波高。
这是 PBR 主节点的配置:
我正在使用两个主节点,但活动的一个是 PBR,我放置了一个 Unlit Master 来测试是否发生相同的错误,在我的测试中这没有发生。不知道有没有人也有这个问题。
unity3d - 在着色器图中访问二级纹理法线贴图?
我正在使用 Unity 2020.1.3f1 的 URP,以及新的 2D 渲染器系统。截至目前,我的对象在内置的“Sprite-Lit-Default”材质和具有自定义构建的像素轮廓着色器的材质之间发生变化,详细信息如下:https ://danielilett.com/2020-04-27- tut5-6-urp-2d-大纲/
这很好用,但我最近在我的精灵中添加了灯光和法线贴图,作为导入设置中的辅助纹理。默认光照纹理在显示法线贴图时没有问题,但是当我尝试修改我的着色器图以包含法线贴图时,它不会像精灵纹理那样在 _MainTex 设置为参考时导入。
我试过 _NormalMap(这是导入器中二级纹理的名称!)以及 _NormalTex,但它总是最终不导入法线贴图。我什至尝试将 _MainTex 更改为 Texture2D,但鉴于这不断引发错误,我认为这不是正确的方法。(这个要具体。)
我在这里错过了什么吗?我可以在网上找到的所有教程都只显示人们通过检查器将法线贴图拖入,但这种材料将被许多不同的精灵使用,所以这似乎......违反直觉。
最重要的是,默认材质/着色器对此没有任何问题,所以我觉得我要么遗漏了一些东西,要么我最终不得不对我的精灵进行编码以通过代码而不是动画师来更改材质,只是为了这个小而烦人的怪癖..
(编辑)因此,对于遇到相同问题的其他任何人,对此进行更新。我设法找到了shadergraph文档的一部分,这似乎是唯一谈论这个的部分:
需要将 MainTex 的引用命名为 _MainTex 来渲染 Sprite。还建议将 Mask 的引用命名为 _MaskTex,将 Normal 命名为 _NormalMap,以匹配此包中使用的 Shader 输入。
所以从我收集到的信息来看,_MainTex 是 ShaderGraph 中唯一自动的。经过一整天的查找教程后,我注意到它们中的每一个都只是将法线贴图和额外纹理设置为默认纹理,因此无需手动分配它们就可以显示出来。
我认为这可以通过手写着色器实现,但我决定在手绘精灵轮廓上使用简单的无光照着色图,显示在主对象的单独游戏对象上。我不会将此作为答案发布,以防其他人将来找到解决方案,因为这不是......在我看来真的是一个解决方案。
unity3d - 实现接触着色器,为接触点上的对象着色
在 VR 的一个场景中,我正在尝试使用着色器图实现着色器,在我的手与立方体的每个接触点处,立方体都会得到一个简单的红点。
我的想法是创建一个纹理,在其中更改相关顶点的颜色,然后将其应用于立方体,但我没有找到任何方法将纹理应用于立方体。然后我尝试直接用“VertexColor”节点修改顶点,但我不知道它是如何工作的,文档对我来说不是很清楚。
我也考虑过使用贴花,但我使用的是 URP,Unity 不支持投影仪,因此更喜欢使用着色器。
因此,如果有人可以提供任何帮助,我将非常高兴。
unity3d - URP Shader Graph 着色器时间节点在某些情况下不起作用
我有几个着色器使用时间节点为我的手机游戏设置某些 UI 元素的动画。在某些情况下(我无法重现),着色器将停留在特定时间而不是动画。
例如,光泽着色器可能会卡在中间光泽。
需要注意的一些重要事项:
Time.timeScale
为 1 - 我所有使用缩放增量时间的补间都正常工作- 当这种情况发生时,所有使用活动场景中时间节点的着色器将“及时冻结”
- 这只在实际的 Android 设备上重现(iOS 未经测试)
- 在所述着色器中影响时间的所有参数都是正的有效数字
- 没有错误或警告
- 当我从主菜单场景过渡到游戏场景时,基于时间的着色器将正常工作 - 当我回到主场景时,它会再次重现(显然它是专门在那里的东西)
- 使用 URP 和 Shader Graph 7.5.1 在 Unity 2019.4.11f1 上运行,但它也确实在旧版本的 Unity/URP 中重现
unity3d - 从 Unity 着色器图中获取/设置时间值
我用以下节点创建了一个脉动闪亮的效果:
我有一个介于 0 和 1 之间的振荡值,但问题是该值可能从 0 和 1 之间的任何值开始,具体取决于时间值。
我试图找出一种可以在着色器之外获取该值的方法,以便脚本可以将属性设置为偏移:
着色器最终得到:
这将确保脉动从 0 开始。
另一种可能性是在着色器模拟中创建一个增加的vector1:
但是着色器图可以防止节点循环。
我可以在脚本中执行此操作并将其传递给着色器属性,但如果有办法将其全部保存在着色器中。
unity3d - 如何从动画剪辑中淡出场景中的对象?
我在 Unity 中有一个带有动画资产的场景。动画资源是一种自定义预制效果,其中嵌套了多个动画对象。资源循环运行,所有对象都使用 shadergraph 分配一个 PBR 着色器。一些资产最终会消失,而另一些资产则会消失。我可以通过禁用对象来控制对象何时在时间线上消失。但其他人需要逐渐消失。我怀疑我可以通过在动画剪辑中的特定时间点更改 PBR 着色图材质的 alpha 来淡出这些对象。谁能建议有关如何淡出对象的过程或教程链接,从动画剪辑中的特定时间点开始,并设置对象完全不可见时所需的持续时间?
unity3d - Unity Shader Graph, UV Map decomposition to use as opacity gradient
I'm still trying to learn how Unity Shader graph works but I hit a wall.
I'm getting the UV map, which I know ranges from 0 to 1 in the red channel and 0 to 1 in the green channel.
I'm extracting the red channel to blend two textures together but red channels looks weird.
As you can see, if I apply a contrast node, the line separating black and white is WAY to the left. I expected it to be right in the middle. I thought this could be a contrast gotcha but as you can see in the blend node, it shows more of the second texture than the first one.
In the preview node, you can see it has way more white values than black values
What I wanted was to blend the two textures equaly from each side and control the blend (opacity contrast) with a number, with "0" being totally blended and "1" being not blended at all (left side = tex1 and right side = tex2)