如何将游戏对象的变换位置传递给我的 CG 着色器?



所以我正在制作一个顶点着色器,使游戏对象看起来像是在不断缩小/膨胀(脉动?

我使用正态比例矩阵将每个顶点的位置相乘,但我想使对象保持在同一位置的中心显示。如果我能得到正在渲染的游戏对象的 transform.position,我知道我将能够保持中心位置不变。

那么,如何访问游戏对象在CG着色器中的位置呢?

还是我错误地处理了这个问题?

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;
}

只需定义 Vector 类型的着色器属性即可。然后,您可以通过在材质上调用 SetVector 来更新每个帧上的此属性。

听起来你只是想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

最新更新