我想在我的着色器中定义一个浮点数组,如下所示:
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的手册页或论坛中找到如何执行此操作。< / p>
答案 0 :(得分:3)
我不这么认为,因为我从来没有见过它,但我想我会去搜索一下我跑过this thread那里回答问题的人说这个(强调我的):
您可以使用
SetFloatArray
,SetVectorArray
和SetColorArray
从5.4开始设置数组,但您无法在属性中定义数组。基本上这意味着您仍然可以设置值并将其定义在要使用的CGPROGRAM块中,但它不会被材料属性序列化 /保存或显示在材质编辑器中。这是一个奇怪的遗漏,特别是因为纹理数组被支持为属性(尽管纹理数组是特定类型的纹理采样器,而不是像颜色数组那样的纹理属性数组)。
因此,您可以在计算中使用它,但您只能通过MonoBehaviour脚本修改该值(并且需要)。
答案 1 :(得分:2)
您无法使用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;