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

问题描述 投票:0回答:3

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

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 数组中获取图块的 2d 位置。

需要明确的是,我只是想了解如何定义

float[]
的属性类型,因为我在 Unity 的手册页或论坛上找不到如何执行此操作。

unity-game-engine shader
3个回答
20
投票

您不能使用

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;

8
投票

显然不是。

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

从 5.4 开始,您可以使用

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

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

需要)。


0
投票
您可以使用

ComputeBuffer 在 C# 中设置浮点数组。

ComputeShader 程序通常需要读取任意数据并将其写入内存缓冲区。 ComputeBuffer 类正是用于此目的 - 您可以从脚本代码创建和填充它们,并在计算着色器或常规着色器中使用它们。

示例可以在 GitHub 上找到,例如,在这个

音频波形着色器中。

© www.soinside.com 2019 - 2024. All rights reserved.