Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 着色器中的统一相对方向_C#_Unity3d_Matrix_Geometry_Shader - Fatal编程技术网

C# 着色器中的统一相对方向

C# 着色器中的统一相对方向,c#,unity3d,matrix,geometry,shader,C#,Unity3d,Matrix,Geometry,Shader,我有一个场景与: 一个空的游戏对象,让我们称之为“Center” 由着色器投影到球面上的网格(圆心为球体的圆心) 它很好用。 我尝试添加基于3dnoise的中心->顶点(我们称之为“方向””)。 它也很好用。 现在我尝试使用相同的3D噪波,基于方向,但相对于中心方向。Unity有一个名为transform.WorldToLocalMatrix的功能(在C#中工作得很好),但由于在Unity着色器中无法将矩阵作为属性传递,因此我将其作为四个分开的*Vector4*s传递: void Updat

我有一个场景与:

  • 一个空的游戏对象,让我们称之为“Center
  • 由着色器投影到球面上的网格(圆心为球体的圆心)
它很好用。 我尝试添加基于3dnoise的中心->顶点(我们称之为“方向””)。 它也很好用。 现在我尝试使用相同的3D噪波,基于方向,但相对于中心方向。Unity有一个名为transform.WorldToLocalMatrix的功能(在C#中工作得很好),但由于在Unity着色器中无法将矩阵作为属性传递,因此我将其作为四个分开的*Vector4*s传递:

void Update() {
    terrainMaterial.SetVector("_Center", transform.position);
    terrainMaterial.SetVector("_Matrix1", new Vector4(transform.worldToLocalMatrix.m00, transform.worldToLocalMatrix.m01, transform.worldToLocalMatrix.m02, 0.0f));
    terrainMaterial.SetVector("_Matrix2", new Vector4(transform.worldToLocalMatrix.m10, transform.worldToLocalMatrix.m11, transform.worldToLocalMatrix.m12, 0.0f));
    terrainMaterial.SetVector("_Matrix3", new Vector4(transform.worldToLocalMatrix.m20, transform.worldToLocalMatrix.m21, transform.worldToLocalMatrix.m22, 0.0f));
    terrainMaterial.SetVector("_Matrix4", new Vector4(0.0f, 0.0f, 0.0f, 0.0f));
}
然后,在着色器中:

Shader "Custom/testShader"
{ 性质 { _颜色(“颜色”,颜色)=(1,1,1,1) _MainTex(“反照率(RGB)”,2D)=“白色”{} _光泽度(“平滑度”,范围(0,1))=0.5 _金属(“金属”,范围(0,1))=0.0

我一点也不明白的是…在不改变任何其他内容的情况下,这行代码可以工作:

direction = _Center + normalize(direction) * (_Radius + snoise(direction * _Scale) * _Height);
这个没有:

direction = _Center + normalize(direction) * (_Radius + snoise(local_direction * _Scale) * _Height);

知道我做错了什么吗?

解决:

通过SetMatrix()传递WorldToLocalMatrix是可以的,但是在着色器中拆分它并重建它是不起作用的。我很困惑

direction = _Center + normalize(direction) * (_Radius + snoise(local_direction * _Scale) * _Height);