问题标签 [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.
unity3d - HLSL (Unity-specific ok, not necessary) 结合 Stencil 和 worldspace “reverse” clipping
我已经构建了一个工作表面着色器(称为“仙境”),它呈现为不可见,除非从相机的角度来看伴随的“lookGlass”着色器与其相交。简单的模板着色器排列。
十分简单。
我可以添加着色器设置来指定一个平面,甚至只是一个最小的世界空间 Z 值,并使用 clip() 仅在该平面的一侧渲染像素......(换句话说,我可以使用它来修剪内容这是 Stencil 允许的。)
我想做的是“通过镜子”在表面上使用模板(以显示镜子内部的几何形状)并始终在它们位于镜子的“我们”一侧时渲染这些表面(始终如果他们在镜子门户的这一侧,请向他们展示)。例如,如果 z<0,则在满足 Stencil Ref 值时进行渲染。如果 z>=0,则无论如何渲染。
现在,在 Unity 中,我可以将两种材质附加到 MeshRenderer 组件(一种带有模板着色器,一种带有“平面截止”着色器)——效果很好。实际上,它非常棒,至少在视觉上是这样。但是,虽然我还没有对它进行基准测试,但我本能地相信,如果有许多对象、相当复杂的几何图形等以这种方式设置,它会极大地影响帧速率。
(我也可以在代码中管理着色器附件,并且只在我期望某些东西过渡时才这样做,但我真的希望从中获得统一的着色器以避免不必要的绘制调用。)
unity3d - ShaderLab 使用默认的统一天空盒
所有反射示例都使用以下属性设置立方体贴图:
但我想为所有着色器使用“Lighting”中的天空盒。怎么做?
unity3d - 使穿过雾边界的游戏对象变暗
我使用自定义着色器通过原始图像和材质创建雾。
现在我想使一些穿过雾边界的游戏对象(精灵)变暗。
但我是着色器的菜鸟。我怎么能做到这一点?在手册/教程或一些想法上写下任何链接。
图片为清楚起见:
雾着色器:
opengl - shaderlab中的顶点变形
我对统一的shaderlab很陌生。我试图扭曲顶点,使它们向后推向相机,就像从 45 度角看相机一样。我正在复制游戏中的效果以获得乐趣。这是用于效果的代码
我尝试将代码嵌入到着色器脚本中,如下所示:
但是我收到一个错误,指出它无法从 float3 转换为 float4,我不确定它是如何实现的
unity3d - 在着色器中获取“数字类型构造函数的参数数量不正确”错误
这几天我一直在学习 Unity 着色器,并决定从 Shadertoy移植这个油着色器。
我收到以下错误:
第 69 行的数字类型构造函数的参数数量不正确(在 glcore 上)
这是着色器代码的相关部分:
该rot(p, T / 22.);
行是错误所在的位置。有趣的是,当我删除或注释掉这行代码时,着色器会编译并且工作正常。我仍然想知道为什么该行无法编译。
是什么导致了该错误,我该如何解决?
编辑:
正如helium所指出的,float3x3
是一个矩阵。
下面是原始的rot函数:
和移植版本:
请注意我是如何替换为的mat2
,float2x2
因为这是 HLSL 中的等效类型。
我相信问题出在float2x2(sc.y,-sc.x,sc);
. 执行此操作的适当方法是什么,并且仍然3
像原始代码一样使用参数?
c# - 在 Shaderlab 中初始化全局变量的问题
我刚刚意识到 Unity 中的全局变量必须在函数中初始化。作为着色器的新手,我不知道我是否以错误的方式执行此操作。
例如,当我定义一个 const 变量时:
然后尝试编写在 frag 函数中使用的代码:
它不起作用。结果我得到一个黑屏,或者预期的结果不会出现。
令人困惑的是,当我在 frag 函数中再次重新初始化全局变量 (PI) 时,我得到了预期的结果。
例如,这是有效的:
然后尝试编写在 frag 函数中使用的代码:
我有这么多不变的全局变量,我无法重新启动它们。
这个问题的一个完整示例是我移植的这个Shadertoy 代码。
此着色器附加到材质,然后使用以下代码附加到相机:
它工作正常,但请注意我必须如何重新初始化PI
、DEG_TO_RAD
和MAX
其他全局变量......如果不这样做,它将无法工作。屏幕只是黑色,这不是第一个导致同样问题的着色器。
为什么会这样?
我是否以错误的方式声明变量?
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上闪烁蓝色和黑色图像?
unity3d - 根据屏幕尺寸正确计算圆最大半径尺寸
我正在尝试画一个圆圈,用红色填充内部,用黑色填充外部。
我想从代码中设置圆圈的大小。以圆圈0
的最小尺寸和100
最大尺寸100
表示圆圈必须覆盖屏幕。
这是代码:
此代码在编辑器上 100% 有效。
Windows 和 Android 版本中存在一个小问题。
问题是当值设置为 时,圆圈并没有完全覆盖屏幕 100% 100
。不过,这在编辑器中运行良好。
我认为问题出在这一行:
如何根据设备的屏幕尺寸正确计算圆的最大半径?
那行代码只能在编辑器上正常工作。
unity3d - 尝试在 Unity 中重现光源 Lara Croft Go
我想要一盏灯投射到我的关卡几何图形的多个平面上,以模仿此视频中的效果:http: //youtube.com/watch?v= vujrxOmh8Jc
但我只在平面上投影,而不是像 Lara Croft 围棋游戏那样在垂直平面上投影:
对我做错的任何想法表示赞赏。