问题标签 [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 回答
213 浏览

unity3d - HLSL (Unity-specific ok, not necessary) 结合 Stencil 和 worldspace “reverse” clipping

我已经构建了一个工作表面着色器(称为“仙境”),它呈现为不可见,除非从相机的角度来看伴随的“lookGlass”着色器与其相交。简单的模板着色器排列。

十分简单。

我可以添加着色器设置来指定一个平面,甚至只是一个最小的世界空间 Z 值,并使用 clip() 仅在该平面的一侧渲染像素......(换句话说,我可以使用它来修剪内容这是 Stencil 允许的。)

我想做的是“通过镜子”在表面上使用模板(以显示镜子内部的几何形状)并始终在它们位于镜子的“我们”一侧时渲染这些表面(始终如果他们在镜子门户的这一侧,请向他们展示)。例如,如果 z<0,则在满足 Stencil Ref 值时进行渲染。如果 z>=0,则无论如何渲染。

现在,在 Unity 中,我可以将两种材质附加到 MeshRenderer 组件(一种带有模板着色器,一种带有“平面截止”着色器)——效果很好。实际上,它非常棒,至少在视觉上是这样。但是,虽然我还没有对它进行基准测试,但我本能地相信,如果有许多对象、相当复杂的几何图形等以这种方式设置,它会极大地影响帧速率。

(我也可以在代码中管理着色器附件,并且只在我期望某些东西过渡时才这样做,但我真的希望从中获得统一的着色器以避免不必要的绘制调用。)

0 投票
1 回答
279 浏览

unity3d - ShaderLab 使用默认的统一天空盒

所有反射示例都使用以下属性设置立方体贴图:

但我想为所有着色器使用“Lighting”中的天空盒。怎么做?

0 投票
0 回答
122 浏览

unity3d - 使穿过雾边界的游戏对象变暗

我使用自定义着色器通过原始图像和材质创建雾。

现在我想使一些穿过雾边界的游戏对象(精灵)变暗。

但我是着色器的菜鸟。我怎么能做到这一点?在手册/教程或一些想法上写下任何链接。

图片为清楚起见:图片 图片

雾着色器:

0 投票
1 回答
161 浏览

opengl - shaderlab中的顶点变形

我对统一的shaderlab很陌生。我试图扭曲顶点,使它们向后推向相机,就像从 45 度角看相机一样。我正在复制游戏中的效果以获得乐趣。是用于效果的代码

我尝试将代码嵌入到着色器脚本中,如下所示:

但是我收到一个错误,指出它无法从 float3 转换为 float4,我不确定它是如何实现的

0 投票
1 回答
1052 浏览

unity3d - 在着色器中获取“数字类型构造函数的参数数量不正确”错误

这几天我一直在学习 Unity 着色器,并决定从 Shadertoy移植这个油着色器。

我收到以下错误:

第 69 行的数字类型构造函数的参数数量不正确(在 glcore 上)

这是着色器代码的相关部分:

rot(p, T / 22.);行是错误所在的位置。有趣的是,当我删除或注释掉这行代码时,着色器会编译并且工作正常。我仍然想知道为什么该行无法编译。

是什么导致了该错误,我该如何解决?

编辑:

正如helium所指出的,float3x3是一个矩阵。

下面是原始的rot函数:

和移植版本:

请注意我是如何替换为的mat2float2x2因为这是 HLSL 中的等效类型。

我相信问题出在float2x2(sc.y,-sc.x,sc);. 执行此操作的适当方法是什么,并且仍然3像原始代码一样使用参数?

0 投票
1 回答
2024 浏览

c# - 在 Shaderlab 中初始化全局变量的问题

我刚刚意识到 Unity 中的全局变量必须在函数中初始化。作为着色器的新手,我不知道我是否以错误的方式执行此操作。

例如,当我定义一个 const 变量时:

然后尝试编写在 frag 函数中使用的代码:

它不起作用。结果我得到一个黑屏,或者预期的结果不会出现。

令人困惑的是,当我在 frag 函数中再次重新初始化全局变量 (PI) 时,我得到了预期的结果。

例如,这是有效的:

然后尝试编写在 frag 函数中使用的代码:

我有这么多不变的全局变量,我无法重新启动它们。

这个问题的一个完整示例是我移植的这个Shadertoy 代码。


此着色器附加到材质,然后使用以下代码附加到相机:

它工作正常,但请注意我必须如何重新初始化PIDEG_TO_RADMAX其他全局变量......如果不这样做,它将无法工作。屏幕只是黑色,这不是第一个导致同样问题的着色器。

为什么会这样?

我是否以错误的方式声明变量?

0 投票
1 回答
4468 浏览

unity3d - 自定义着色器不适用于 Android

我将等离子球着色器从Shadertoy移植到 Unity 作为附加到相机的图像效果。它在编辑器和 Windows 独立版本上运行良好。它不适用于 Android 设备。它在 Android 上闪烁蓝色和黑色图像。

这是 Unity Editor 和 Windows Build 中的样子:

这是它在 Android 上的样子:

移植的着色器代码:


您可以在上面的着色器中找到用于iChannel0输入槽的图像。

我尝试过的事情:

  • 将着色器添加到图形设置中,以便 Unity 在构建过程中将其包含在内。
  • 禁用自动图形 API 并尝试使用 OpenGLES2 和 OpenGLES3。
  • 使用 Android Studio 检查日志。完全没有错误/警告。

这些都没有解决问题,我没有东西可以尝试。

软件和设备信息(如果有帮助):

  • 统一 5.6.0f3
  • 安卓 4.4.2

这用于学习和教育目的,因为我正在学习 GLSL、HLSL、CG/shaderlab 着色器语言。我只想知道为什么移植的着色器在 Android 设备上没有按预期工作。

为什么在Android上闪烁蓝色和黑色图像?

0 投票
1 回答
447 浏览

unity3d - 根据屏幕尺寸正确计算圆最大半径尺寸

我正在尝试画一个圆圈,用红色填充内部,用黑色填充外部。

我想从代码中设置圆圈的大小。以圆圈0的最小尺寸和100最大尺寸100表示圆圈必须覆盖屏幕。

这是代码:

此代码在编辑器上 100% 有效。

Windows 和 Android 版本中存在一个小问题。

问题是当值设置为 时,圆圈并没有完全覆盖屏幕 100% 100。不过,这在编辑器中运行良好。

我认为问题出在这一行:

如何根据设备的屏幕尺寸正确计算圆的最大半径?

那行代码只能在编辑器上正常工作。

0 投票
2 回答
819 浏览

unity3d - 尝试在 Unity 中重现光源 Lara Croft Go

我想要一盏灯投射到我的关卡几何图形的多个平面上,以模仿此视频中的效果:http: //youtube.com/watch?v= vujrxOmh8Jc

我尝试用点光源重新创建它,如下所示: 具有自定义衰减的统一光

但我只在平面上投影,而不是像 Lara Croft 围棋游戏那样在垂直平面上投影: 在此处输入图像描述

对我做错的任何想法表示赞赏。

0 投票
3 回答
2416 浏览

unity3d - 颜色渐变着色器(cg / shaderlab)

我有一个着色器函数,其功能类似于 Blender3D 中的“色带”节点。它将一个介于 0 和 1 之间的浮点数作为输入,并输出一种颜色,该颜色是按指定顺序混合了任意数量的颜色:

blender3D 颜色渐变
blender3D 颜色渐变

这是我的代码:

有用。但它很糟糕,有几个原因:

  1. 渐变中的颜色数量是硬编码的。在 Unity 编辑器中添加它们的列表会好得多。
  2. if/else 语句。我知道这些对性能很糟糕,应该避免。
  3. 颜色数组在函数中声明,这意味着必须为每个片段创建一个新数组(我认为)。

我的主要问题是第一个问题:如何在无需编辑硬编码值的情况下更改渐变中的颜色数量?