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”
- 由着色器投影到球面上的网格(圆心为球体的圆心)
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);