如何将GameObject的变换位置传递给我的CG着色器?

时间:2014-02-16 03:26:13

标签: unity3d shader cg

所以我正在制作一个顶点着色器,使GameObject看起来像是在不断缩小/扩展(脉动?)。

我使用正常的比例矩阵来乘以每个顶点的位置,但我想让对象看起来居中在同一个位置。如果我能得到正在渲染的gameObject的transform.position,我知道我能够保持中心位置不变。

那么我如何在CG着色器中访问gameobject的位置?

或者我是否错误地解决了这个问题?

vertexOut vert(vertexIn v)
{
    vertexOut o;

    o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
    o.pos2 = mul(UNITY_MATRIX_MVP,v.vertex);


    float scaleVal = sin(_Time.y*10)/8 + 1.0;
    float4x4 scaleMat = float4x4(
    scaleVal,   0, 0, 0,
    0,  scaleVal, 0, 0,
    0,  0, 1, 0,
    0, 0, 0, 1);

    o.pos = mul(scaleMat,o.pos);
    return o;
}

2 个答案:

答案 0 :(得分:3)

只需定义 Vector 类型的shader property即可。然后,您可以通过调用材料上的SetVector来更新每个框架上的此属性。

答案 1 :(得分:0)

听起来像您只想将v.vertex乘以scaleMat。像这样:

vertexOut vert(vertexIn v)
{
    vertexOut o;

    o.pos2 = mul(UNITY_MATRIX_MVP,v.vertex);

    float scaleVal = sin(_Time.y*10)/8 + 1.0;
    float4x4 scaleMat = float4x4(
    scaleVal,   0, 0, 0,
    0,  scaleVal, 0, 0,
    0,  0, 1, 0,
    0, 0, 0, 1);

    o.pos = mul(UNITY_MATRIX_MVP, mul(scaleMat, v.vertex));
    return o;
}

当然,这可能与您想要的行为有所不同,具体取决于您希望网格在旋转下的行为。

不过,要回答实际发布的问题,您可以通过将原点转换为世界空间来找出变换在顶点着色器中的直接位置:

mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz