问题标签 [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 投票
0 回答
701 浏览

unity3d - 使用 CG 编程和 Shaderlab 在 Unity 中合并 2 个着色器

我想为 Unity 合并这两个着色器的功能。第一个着色器是添加故障全息图效果的主着色器。第二个着色器正在制作表面纹理闪烁器以增加视觉效果。

如果可能的话,我正在尝试合并我的代码版本,或者允许我在相同材料上实现这两个功能的不同通道。

我已经尝试过 shaderpass 功能,但无法使其工作。

有可能吗?

第一个着色器代码

第二个着色器代码

第三个着色器代码

后备“漫反射”}

0 投票
1 回答
1824 浏览

unity3d - 将整数数组/纹理传递给统一着色器的方法

我正在尝试实现具有强大单元边界的基于单元的地形渲染(就像在像 Transport Tycoon 这样的旧游戏中一样)。为了优化性能,我通过实际游戏地图传递纹理,在其中我尝试为自定义着色器编码单元类型,因此着色器可以查找每个单元的类型并确定在渲染地形时将哪些纹理应用于特定单元网。

以整数类型传递该映射会很方便,因此我可以使用按位运算符屏蔽特定位,并且基本上只在一个字节中传递大量数据。传递浮点数会导致精度丢失,我无法确定在转换为浮点数并返回 int 后是否具有相同的整数。

有没有办法将整数类型的数组(二维数组甚至纹理更好)传递给着色器,或者他们在 API 中没有 SetIntegerArray 是有原因的,比如缺乏与移动 GPU 的兼容性之类的?

0 投票
3 回答
3040 浏览

unity3d - 如何重新计算法线?

我正在尝试编写一个简单的着色器,用正弦波移动所有顶点。

问题是在移动它们之后,法线是错误的,因此没有实时阴影。我搜索了很多,发现我需要使用假邻居重新计算法线。这些实现都不是针对 Unity Shaderlab 的,所以我不能只是复制和粘贴它们,而且我对着色器代码的了解非常基础,所以我无法将我发现的内容转换为我需要的内容。

任何人都可以帮助我在移动顶点后重新计算法线的内容和方法吗?

0 投票
1 回答
1105 浏览

unity3d - Unity 地形引擎如何添加任意数量的着色器通道?

现在我正在做一个项目,该项目涉及将 splatmaps 应用于生成的网格。我正在尝试使用内置的地形着色器来实现这一点,但我遇到了一个涉及“FirstPass”和“AddPass”着色器的问题。

很清楚这些着色器应该如何工作。应用 FirstPass 并处理 4 个纹理和一个控制(splat)纹理。如果用户应用超过 4 个纹理,则 AddPass(与 FirstPass 非常相似)在编译时被“添加”为另一个着色器通道。根据用户对地形应用的纹理数量(每次通过 4 个纹理),添加任意次数的 AddPass。

地形引擎是如何实现这种多通道效果的呢?所需的通行证数量可以在编译时确定,所以我不认为这是不可能的......我只是不知道从这里去哪里。我认为这可能与 FirstPass 底部的 Dependency 属性有关,但我不确定。

如果有人对此有任何见解,请告诉我。为方便起见,我已将Unity 存档中的FirstPassAddPassTerrainEngine.cginc着色器文件上传到 pastebin。

谢谢!

0 投票
0 回答
440 浏览

unity3d - 统一 Z 顺序。我怎样才能将所有精灵放在地上而不是效果?

我在战场上有很多士兵(600+)。所以所有士兵都应该是性能问题的二维精灵。

在此处输入图像描述

正如你可以看到马的脚在地下,所以为了解决这个问题,我关闭了ZWrite地面的着色器。

但是当我关闭ZWrite地面时,另一个问题发生了,一些效果的地下部分被显示出来,这是我不想看到的。在此处输入图像描述

我也尝试修改了士兵着色器的深度偏移,但是在地面上移动士兵似乎很大,而且所有士兵也会生效,这不是我想要的。

那么,我该如何实现呢?让所有精灵士兵都在地上,不显示地下部分的效果?

0 投票
2 回答
975 浏览

unity3d - 在 Unity Shaderlab 中,如何使用 lerp 和 deltaTime 为值设置动画

如何使用自定义标准表面着色器将值动画化为目标值?

例如:

此代码不起作用,但应该演示目标是什么:设置 targetAlpha 时,着色器将淡入该值。

0 投票
1 回答
50 浏览

unity3d - 将连续着色器应用于纹理,同时保持浮动精度

我在 Unity 中有一个渲染纹理,并且正在对其应用连续的着色器,如下所示:

在我的着色器中,我只使用浮点数,但由于输出纹理是 RGBA 32 位,所以输出的颜色值在 8 位上进行量化。

在我的示例中,有没有办法保持中间结果(Tex2、Tex3)的浮点精度,并且只将最终纹理 Tex4 转换为 RGB 32 位?

0 投票
0 回答
101 浏览

unity3d - 基于纹理像素而不是屏幕的 HLSL 光照

在 HLSL 中,如何根据纹理的像素而不是构成对象的像素来计算光照?

换句话说,如果我在 1024x768px 屏幕上渲染 64x64px 纹理,我想计算光照,因为它会影响 64x64px 空间,从而导致锯齿状像素而不是平滑线。

我已经研究了几十个答案,但我不确定如何始终确定片段是否是应该完全点亮的像素的一部分。也许这是错误的方法?

当前实现使用漫反射纹理和法线贴图。它导致在输出中显示为伪影(对角线):

在此处输入图像描述

在此处输入图像描述

注意:它看起来几乎正确的原因是由于法线贴图,这会导致一些相邻像素的法线角度刚好足以照亮某些像素而不是其他像素。

0 投票
1 回答
355 浏览

c# - 将 int16 打包成 fixed2(红+绿)

在 Unity 中,高度图在内部被缩短为 Int16(请注意,仅使用 0-32767)。我想将高度图发送到 GPU,理想情况下只使用 16 位。

似乎最好的方法是将高度图值编码为 RG16 渲染纹理(因为在 Unity 中我不能选择单通道 16 位整数格式),并根据需要进行打包/解包。

这是我发送到 GPU 的高度图纹理(通过 CPU 端 C# 脚本):

我遇到了一个令人困惑的问题,在解压高度图样本时似乎有很大的精度损失。我试过按位方式:

还有一个(可能)时髦的浮点方法:

这两种方法都不会产生与基本事实几乎相同的结果: 我得到了什么

0 投票
1 回答
1965 浏览

unity3d - 用于 AR 应用的 Unity 透明阴影接收平面仅接收阴影而不接收光反射

我正在为 Unity 中的增强现实应用程序开发一个透明阴影接收着色器,它被放入一个平面中,该平面将接收来自点光源或聚光灯的阴影。它工作正常,但是正如您在图像中看到的那样,飞机也接收到光。

输出截图

我正在使用统一 5.6.3p4。请告诉我此脚本中可能存在什么问题,或者我应该在此代码中进行哪些更改以仅接收阴影而不接收平面上的光反射?

着色器脚本如下:

}