我正在使用通用渲染管道在 Unity 中编写 2D 游戏,以便我可以利用其自动照明。我编写了一个着色器,它已经使用了一些实例化属性,例如自定义颜色和伤害级别,并且这些效果很好。
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(half, _Injury)
UNITY_DEFINE_INSTANCED_PROP(half4, _Custom1)
UNITY_DEFINE_INSTANCED_PROP(half4, _Custom2)
UNITY_INSTANCING_BUFFER_END(Props)
接下来我想做的是允许与着色器关联的某些纹理也成为实例化属性,以便我可以根据具体情况更改它们。这些是辅助纹理,用于向各种服装添加自定义图案,而无需制作大量替代纹理。
问题是,我找不到任何关于如何将纹理声明为实例化属性的参考。我非常确定这应该是可能的,因为
MaterialPropertiesBlock
类有一个 SetTexture
函数,其格式与用于设置浮点值的函数类似,但我找不到任何示例来说明如何操作。
谁能告诉我这个过程吗?即使只是实例化属性的正确声明也会有所帮助,因为我尝试了几种不同的方法,它们都会给出非常神秘的错误。
再次,经过大约一个小时的努力,我在此处发布问题后几分钟内就找到了答案。这正在成为一种习惯。那好吧。显然,正确的形式让我困惑,因为正确的类名不是 2D(它出现在着色器属性部分中),也不是 Text(C# 代码中出现的),也不是 TEXTURE2D(出现在将它们定义为变量的宏中的),但是
Texture2D
。
只有纹理本身需要位于实例化属性部分中。采样器应该以通常的方式创建。
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(Texture2D, _PatternMask)
UNITY_INSTANCING_BUFFER_END(Props)
SAMPLER(sampler_PatternMask);