问题标签 [shaderlab]

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.

0 投票
1 回答
49 浏览

unity3d - 如何在 ShaderLab 中缓存通用(所有像素)变量?

假设我有以下着色器:

在上面的代码中,我需要从相关函数中 计算变量的值a(这只是一个泛化示例)。假设这些函数很复杂,并且它们依赖于在每一帧中变化的着色器的其他属性,而不是像素本身。我们知道,每次都为每个像素计算复杂的函数。zcalculateA()calculateZ()

有没有办法“缓存”这些值以避免每次对每个像素进行计算?在每一帧中,它们的值对于所有像素都是相同的。

目前我正在通过在 C# 脚本中设置值来解决问题:

但我更喜欢将着色器和 C# 脚本代码分开。

0 投票
1 回答
561 浏览

unity3d - ShaderLab 偏移未将一个多边形渲染到另一个多边形之上

我有两个着色器,UnlitRGBA 和 TransparentNoOverlap。它们如下:

UnlitRGBA.shaderlab

透明无重叠着色器

我希望使用 UnlitRGBA 的材质始终在 TransparentNoOverlap 上渲染。我会怎么做才能达到这个结果?我尝试将Offset -1, -1或添加Offset 0, -1到 UnlitRGBA。在针对标准表面着色器进行测试时,它运行良好,并且 UnlitRGBA 始终呈现在顶部。但是当使用TransparentNoOverlap 进行渲染时,要么存在z-fighting,要么TransparentNoOverlap 总是渲染在顶部。为什么是这样?我认为这可能与 ZTests 或 ZWrites 有关,但我最终不确定。

对于大型代码示例,我深表歉意...感谢您提供的任何帮助。

雅各布

0 投票
1 回答
772 浏览

unity3d - 如何根据顶点颜色丢弃像素并在 MonoBehaviour 中打开或关闭它?

我编写了一个着色器,它使用网格的顶点颜色,并且还有一个函数可以裁剪蓝色通道中插值顶点颜色大于 0.5 的所有顶点(丢弃所有蓝色顶点)。

我正在尝试创建一个语音命令,允许用户在准备好时调用该函数。但是,在 Microsoft 的混合现实工具包语音输入处理程序中,它只允许我从我正在引用的游戏对象的组件(网格渲染器、网格过滤器、网格碰撞器等)调用函数,而不是对象的着色器或材质。

我怎样才能使语音命令可以调用我在下面共享的“隐藏”功能?

我试图在着色器之外编写“隐藏”功能,但这似乎不起作用。

我希望语音输入处理程序允许我从着色器调用函数,但它没有。

我将 TurnOffContext() 函数放在 Start() 函数中只是为了测试它是否有效。从理论上讲,它应该立即将 _Toggle 属性设置为 1,这应该丢弃所有蓝色像素,但在启动我的应用程序时我仍然看到完整的原始网格。我还尝试不将其放入 Start() 函数中,而仅使用运行 TurnOffContext() 函数的语音命令,但这也不起作用。

这是我的 GameObject 的材质检查器面板的屏幕截图。 https://imgur.com/a/wkVh5Tj

0 投票
1 回答
2567 浏览

unity3d - 如何在运行时使用 MonoBehaviour 设置着色器设置/属性?

我有一个着色器,可以显示网格的顶点颜色,并且能够剪切蓝色的顶点。我希望用户能够在使用应用程序时打开/关闭此设置。

我已经尝试过此处提供的建议Find and change property name in a shader和此处如何根据顶点颜色丢弃像素并在 MonoBehaviour 中打开或关闭它? 但到目前为止,这些都没有为我工作。

我希望这个脚本会导致我的网格的蓝色部分被丢弃,因为在我的着色器片段中我有

具体来说,不起作用的部分是行

正在调用该函数,但它没有按预期将 _Toggle 值设置为 1。

如果我手动将检查器面板中的 _Toggle 设置从 0 更改为 1,则会丢弃网格的蓝色部分,这是预期的结果。我在上面粘贴的脚本应该与手动更改检查器面板中的设置具有相同的结果。

0 投票
1 回答
505 浏览

unity3d - 表面着色器输入结构中的 IN.worldRefl 是什么?

这个问题很简单。我不知道IN.worldRefl代表什么,我看过一些将它与立方体贴图一起使用的教程,但我仍然不知道。

Unity对它的描述很差:

float3 worldRefl -如果表面着色器 不写入 o.Normal ,则包含世界反射向量。

0 投票
2 回答
1458 浏览

unity3d - unity粒子轮廓着色器

我希望为发射立方体网格的粒子系统创建一个无光照着色器,这样每个发射的网格周围都有一个坚硬的黑色轮廓。

这是大纲的通行证(在 Cg 中):

(在此之后是一个简单的传递来渲染网格本身的无光照几何......)

如您所见,我们只是将顶点向外拉伸……但是从什么开始呢?

对于单个立方体网格,着色器完美运行:

应用于单个立方体网格的着色器

但是,当应用于发射立方体网格的粒子系统时,着色器会发生故障:

应用于粒子系统发射立方体的着色器

我的怀疑是这条线从对象v.vertex *= ( 1 + _Outline);中心向外延伸顶点,而不是网格中心。

是否有人对如何解决此问题有替代着色器或见解?

谢谢, 雅各布

0 投票
1 回答
504 浏览

unity3d - 为什么我不能在 Unity ShaderLab 的循环中使用 tex2D?

我正在尝试做类似的事情

它记录了一个错误Shader error in 'Unlit/CustomParallax': unable to unroll loop, loop does not appear to terminate in a timely manner (1024 iterations) at line 76 (on metal) 所以现在我有两个选择,一个是添加 [unroll(100)] 以限制循环时间,另一个是使用 tex2Dlod 而不是 tex2D。

我很好奇为什么会这样?

此外,为什么 tex2Dlod 可以循环使用?

0 投票
1 回答
1169 浏览

c# - 如何在 Unity 中创建一个可以显示由许多小图像组成的纹理的着色器

所以我想做的是从一个 SQL 表中加载卫星图像并将它们包裹在一个球体周围以创建一个地球。我知道我已经加载了覆盖的图像,我只是不确定如何让我的着色器以正确的方向显示图像。

我去过 Unity 论坛并从 Unity Docs中查看了这段代码。

使用链接的着色器代码和我在论坛上收到的帮助,这是我最终得到的代码:

使用它,我的材料看起来像这样: 平面和球体上的扭曲纹理

这是我用来加载 SQL 图像的代码:

在 SQL 表中,x 和 y 确定图块的位置,z 确定缩放级别。我现在只使用一个缩放级别。

很抱歉链接整个着色器类,但我对着色器不是很有经验,所以我不太清楚问题出在哪里。

0 投票
1 回答
262 浏览

unity3d - 如何使用着色器在网格上映射字母?

我正在尝试创建一个允许在网格上映射文本的着色器。如何水平对齐每个字符?目前,它们都相互重叠。

目前看起来像这样:

当前结果

使用的纹理:

质地

0 投票
0 回答
786 浏览

unity3d - 如何旋转立方体贴图?

我目前正在 Unity 中开发一些反射着色器。我对着色器完全是新手。我发现了一篇关于立方体贴图旋转的文章。我已经完成了一些实现,但似乎无法正常工作。我在顶点着色器中旋转了立方体贴图,仅正常旋转。
我怎样才能达到这种效果?