如何在Shader属性中定义一个浮点数数组?

11

我想在着色器中定义一个浮点数数组,类似于这样:

Properties
{
    _TilesX ("Tiles X", Int) = 10
    _TilesY ("Tiles Y", Int) = 10

    _TileData1 ("Tile data", Float[]) = {} // THIS!!!

    _Texture1 ("Texture odd", 2D) = "white" {}
    _Texture2 ("Texture even", 2D) = "white" {}
}

我正在尝试创建一个单一的平面,用作网格,并且我想在运行时修改_TileData1以更改图块的Y偏移量。 我正在使用_TilesX和_TilesY从1d数组中获取图块的二维位置。

只是为了明确,我只是想找出如何定义float[]属性类型,因为我在Unity的手册页面或论坛中找不到如何这样做的信息。

2个回答

19

你不能将属性用于float[]。但是你可以将它们用作着色器中的变量,并从脚本中设置:

在你的着色器中:

CGPROGRAM
int _SegmentsCount = 0;
float _Segments[1000];

void surf (Input IN, inout SurfaceOutput o) {
    for (int i = 0; i < _SegmentsCount; i++) {
        // This is obsviously just an example,
        // avoid loops in shaders if you can help it.
    }
}

ENDCG

然后在您的脚本中:

float [] array = new float[] { 0.25f, 0.75f };
material.SetFloatArray("_Segments", array);
material.SetInt("_SegmentsCount", 2);

renderer.material = material;

所以_Segments必须有一个定义好的长度吗?不能在运行时由C#更改吗? - WDUK
1
它可以在您的C#代码中更改。但不能在着色器中更改(因此将其超大到1000并要求传递长度_SegmentsCount)。 - mprivat
一个绝对精彩的答案!谢谢。 - Shadoninja

8

显然不行。

我之前从未见过,所以认为不能,但我想搜索一下,结果看到了这个线程,其中回答问题的人说(重点在于我的加粗部分):

你可以使用 SetFloatArraySetVectorArraySetColorArray 从脚本中设置数组,自从5.4版本起,但你无法在属性中定义一个数组。基本上,这意味着您仍然可以设置值,并将其定义在 CGPROGRAM 块中供使用,但它不会被材质资源序列化或保存,也不会出现在材质编辑器中。这是一个奇怪的遗漏,尤其是因为支持纹理数组作为属性(虽然纹理数组是一种特定类型的纹理采样器,而不是像颜色数组一样的纹理属性数组)。

所以您可以在计算中使用它,但只能通过 MonoBehaviour 脚本修改值(并且需要这样做)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接