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

unity3d - 将 XNA Shader 通道、混合和剔除模式移植到 Unity shaderlab

我不得不将 XNA 着色器移植到 Unity 的着色器中,并想验证我是否正确地执行了此操作。

Pass1使用 alpha 混合的部分,如SrcBlend,DestBlend和 set's cull to none 是我要确保我做对的唯一地方。

这是 XNA 着色器版本:

这是我制作的 Unity Shaderlab 端口:

它似乎在 Unity 中运行良好,但这与 Unity 中的等效通道设置完全相同吗?如果不是,则需要进行哪些更改才能获得确切的等效性。

0 投票
2 回答
586 浏览

unity3d - 我的表面着色器中是否需要三角形信息?

更新

主要问题是:如何将三角形的世界空间顶点位置传递给 Unity 着色器中的表面着色器。正如评论中提到的,可能可以从几何着色器中传递它们。但是我在某处读到,实现自定义几何着色器会覆盖 Unitys 逻辑以计算阴影等。我将在 Input 结构中添加三角形信息。但在我改变我的网格生成逻辑之前,我想知道这是否可行。对于这个解决方案,三角形的顶点位置对于三角形中的每个像素都必须是恒定的,并且不能被插值。

这是原始问题:

我正在为三角形网格编写表面着色器。我为每个顶点设置了一个带有纹理 ID 的自定义顶点属性。现在我希望表面着色器应用纹理,如下图所示。(注意每种颜色代表一种纹理) 在此处输入图像描述

在表面着色器中,我需要定义三角形的 3 个顶点及其纹理 ID。此外,我需要定位我正在绘制的像素。

  1. 如果所有纹理 ID 都相同,我会为所有像素选择此纹理。
  2. 如果一个或两个纹理 id 不同,我会计算到三角形顶点的像素距离并选择下一张图像中看到的纹理: 在此处输入图像描述

表面着色器需要知道像素三角形。有了这个逻辑,我应该得到我正在寻找的阴影。我正在以编程方式创建我的网格,因此我可以将三角形顶点及其纹理 ID 添加为顶点属性并将其传递给表面着色器。

但我不确定这对于表面/顶点着色器的工作方式是否可行。顶点和像素之间是否存在关系以获取我的自定义三角形信息?有没有更好的方法来做到这一点?

我正在为我的着色器使用 Unitys ShaderLab。

0 投票
1 回答
2319 浏览

c# - 在 Unity 中实现 Fur with Shells 技术

我正在尝试使用Shells 技术在 Unity 中实现毛皮。Fins 技术被故意省略,因为我希望它在低端手机(主要是 Android 设备)上运行,并且需要OpenGL ES 3.0及更高版本,而Shells 技术只需要OpenGL ES 2.0

有一个基于 XNA 的 Shell 技术示例,我尝试将其移植到 Unity 中,但没有成功。是 XNA 项目的文章。

XNA着色器:

控制着色器的XNA C# 脚本:




我小心地将着色器和控制脚本逐行移植到 Unity。

移植的Unity着色器:

控制着色器的移植Unity C# 脚本:

Unity的移植VertexPositionNormalTexture结构

移植的 Unity 工作无法正常工作。没有贝壳,输出图像是平坦的。

这是XNA中的预期结果(工作正常):

在此处输入图像描述

但这就是我在Unity中看到的(没有 shell):

在此处输入图像描述

最终图像应该如下图所示,但我无法继续进行移植工作,因为基本实现在 Unity中无法正常工作。

在此处输入图像描述

我的脚本公共变量设置:

在此处输入图像描述

为什么移植的 Unity 结果是平的?我错过了什么吗?

编辑:

Leo提到了可能的背面问题,因为 Unity 使用左手坐标系,而 XNA 使用右手坐标系。

我翻转了UnitZ()值并尝试反转网格顶点,但屏幕上没有任何内容。这不太可能是问题所在。

0 投票
2 回答
6414 浏览

unity3d - 如何将 uv 坐标转换为世界空间?

我正在尝试实现着色器。它将与 Unity LineRenderer 一起使用。着色器将有噪声,滚动超时相对于纹理坐标。例如平行于纹理的 uv 空间的 x 轴。我有一个实现,但我不知道如何在 vert 函数中获取相对于纹理 uv 的方向(考虑纹理旋转)。我只有一个世界空间相对的滚动。

主要问题 - 如何将 uv 坐标(例如 (0, 0) 或 (1, 0))转换为世界空间?

这是我的着色器:

噪声库在这里得到:https ://forum.unity.com/threads/2d-3d-4d-optimised-perlin-noise-cg-hlsl-library-cginc.218372/#post-2445598 。请帮我。

0 投票
0 回答
5026 浏览

unity3d - 如何在着色器中获取纹理大小?

我正在尝试为 LineRenderer(Unity 组件)实现着色器。我需要在片段着色器中为 x 轴获取 0 到 1 的值,这意味着在局部纹理坐标中的位置(0 表示纹理左侧的像素,1 表示右侧边框)。

正如文档所说,_MainTex_TexelSize包含有关纹理大小的信息并_MainTex_ST包含有关平铺的信息。所以看起来很简单。我需要乘法uv.x(_MainTex_TexelSize.z * _MainTex_ST.x)

有我的着色器:

但是这个着色器没有像我预期的那样工作。

它的样子

我正在尝试在运行时调试此着色器,但得到奇怪的结果。Texel 大小和平铺容量变量具有1值。

着色器调试。

所以我需要你的帮助。我究竟做错了什么?有没有其他方法可以LineRenderer在 Unity 中获取纹理大小?

0 投票
1 回答
713 浏览

c# - 将 Unity 游戏中的资源转储到文件中

我正在尝试创建一个函数,将 Unity 游戏中的每个资源数据转储到文件中,并能够从当前加载的场景中转储屏幕上的视频、音频、脚本名称和图像。

当我试图对纹理和矩阵、向量和 int 值和浮点数等着色器数据做同样的事情时,我被卡住了。我知道我可以通过函数获得这些阵型Material.GetXXX

例如,我目前可以Texture从标准着色器中获取主着色器,该着色器的纹理类型属性命名_MainTex为:

问题是我需要知道属性的名称以及它是哪种类型,例如 Texture、Matrix、Float、Color 等,然后才能在运行时获取它们的值

我希望项目中有许多来自第三方来源的着色器,手动检查每个着色器、复制它们的属性名称和类型以便获取数据会很复杂。

有没有办法获取着色器属性和使用Material.GetXXX函数检索其值所需的类型?如果这是不可能的,有没有办法单独转储着色器数据?

注意

这不是保存功能,我不是在寻找保存和加载游戏状态的方法。这是一个用于分析和解决 Unity 游戏故障的插件。

0 投票
1 回答
58 浏览

unity3d - 保存场景时着色器的奇怪行为

我为我的一类人编写了一个自定义编辑器脚本,以便在任何颜色值发生变化时为材质设置颜色,这使我可以选择在旅途中预览颜色。

该脚本运行良好,但是当我保存场景时,发生了一些奇怪的事情。所有的颜色都会变成一些奇怪的默认值并保持这种状态,直到我点击对象本身,然后它会更新为我之前选择的正确颜色。

这是我保存场景之前精灵的样子:

保存场景之前的精灵

这是我保存场景后的样子:

保存场景后的精灵

正如我所提到的,在我单击游戏对象后,精灵会更新为之前保存的颜色。

这是自定义编辑器脚本的代码:

编辑:

我已经尝试过 SonicBlue22 的解决方案,但问题仍然存在。我摆弄了脚本,我认为问题可能出在着色器本身,因为它不保留脚本分配给它的值。

这是着色器代码:

}

我将颜色值直接分配给矩阵,如下所示:

ColorMatrix生成的属性在哪里Matrix4x4

有谁知道如何使颜色在着色器中持久存在?

0 投票
1 回答
604 浏览

unity3d - 将顶点数据相乘会导致轮廓不均匀(shaderlab unity3d)

我在 Unity3D 的着色器实验室中创建了一个简单的轮廓着色器,其中包含两个通道:一个通过沿顶点法线乘以顶点信息来放大对象,另一个通过绘制对象的常规(基本通道)版本。问题出在大纲传递的代码中:

_OutlineWidth_OutlineColor分别属于范围和颜色类型。我已经将此着色器应用于以编程方式创建的几个“类似四联牌”的网格。结果是这样的(点击链接):

图一 图二

如您所见,创建了轮廓,但轮廓沿对象外边缘的宽度不均匀。沿着其中一个面,轮廓较大 - 沿着距离形状中心最远的面较大。对于非凸形状,问题被放大了;轮廓甚至可能根本不包含形状:

图三

我知道这是由于顶点位置相对于形状的中心,并且该线v.vertex.xyz *= _OutlineWidth仅将该位置乘以一个常数(使其远离对象的中心)。如何修改我的代码,以便轮廓像素的计算独立于形状的中心并与对象的真实轮廓保持完整性?

0 投票
1 回答
4120 浏览

c# - 如何从 SpriteAtlas 获取原始纹理以在着色器中用作 alpha 蒙版?

我有一个问题,我需要帮助来解决它。

我尝试通过自定义着色器和附加纹理作为蒙版动态着色精灵的某些部分。这不是问题,我很容易解决。

屏幕以便更好地理解:

在此处输入图像描述

这是真正的实现,这张图片的颜色混合是通过着色器、精灵和蒙版实现的。

但是我被迫使用地图集来节省 RAM,因为必须同时加载许多精灵(每个不同单元的 3 个状态和 5 个方向)。这是引起问题的原因。当我尝试在编辑模式下(通过使用 ExecuteInEditMode)执行此操作时,一切正常。但是当我按下“播放”按钮时,一切都崩溃了。

它的样子:

在此处输入图像描述

据我了解,问题是当我按下“播放”时,地图集就建立了。所以当我从中得到精灵时,我会成功地得到它。但是当我尝试从 Sprite 获取纹理以将其设置为 Shader 时,我得到了很大的纹理(完整的图集)。着色器对这张纸上的实际位置一无所知,因为像素需要着色。

所以我的问题是:如何从精灵中获取“小”纹理以将其设置为着色器?

我如何将“蒙版”设置为着色器:

一些着色器的部分:

0 投票
1 回答
80 浏览

c# - 有没有办法确保一个对象总是显示在另一个对象之上而没有重叠?

如下图所示,我对头像上的衣服有一些问题

图 1

大多数人会建议我在建模软件中简单地将裤子从身体上拉开,这很好,直到它与其他衣服相结合

图 2

我现在可以把衬衫从裤子上拉开,但我有很多不同的衣服,检查/调整每件衣服似乎不是要走的路。

最好尝试应用某种分层系统。

谁能建议我如何实现这样的系统或如何实现我的目标?

我已经考虑过尝试使用着色器来做到这一点,但没有运气达到我想要得到的结果(但我承认我不是 Shaderlab/CG 专家)

我还尝试将化身分成不同的部分并用服装网格替换它们,但这仍然存在服装相互可见的问题。

我希望最好有某种系统,我可以在其中对每件衣服进行分层,以便无论它们以正确的顺序彼此叠加显示,而不会出现任何重叠。