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

コルパ*_*クセイ 4 shader unity-game-engine

我想在我的着色器中定义一个浮点数组,如下所示:

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" {}
}
Run Code Online (Sandbox Code Playgroud)

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

明确一点,float[]由于我在Unity的手册页或论坛上找不到该属性的类型,因此我只想了解如何定义该属性的类型。

Dra*_*18s 7

显然不是。

我不这么认为,因为我从未见过它,但我想我会四处搜索一下,然后我偶然发现了回答问题的人说的这个帖子(强调我的):

从5.4 开始,您可以从脚本中使用SetFloatArraySetVectorArray和设置数组SetColorArray但不能在属性中定义数组。基本上这意味着您仍然可以设置该值并将其定义在要使用的 CGPROGRAM 块中,但它不会被材质资产序列化/保存或显示在材质编辑器中。这是一个奇怪的遗漏,特别是因为支持纹理数组作为属性(尽管纹理数组是一种特定类型的纹理采样器,而不是像颜色数组这样的纹理属性数组)。

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


mpr*_*vat 5

您不能将属性用于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
Run Code Online (Sandbox Code Playgroud)

然后在您的脚本中:

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

renderer.material = material;
Run Code Online (Sandbox Code Playgroud)