【问题标题】:How do I pass a GameObject's transform's position to my CG shader?如何将游戏对象的变换位置传递给我的 CG 着色器?
【发布时间】:2014-02-16 03:26:12
【问题描述】:

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

我正在使用一个正常的比例矩阵来乘以每个顶点的位置,但我想让对象出现在同一个位置的中心。如果我可以得到正在渲染的游戏对象的 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;
}

【问题讨论】:

  • 您可以显示任何代码吗?
  • 啊,想知道解决方法的朋友,可以使用renderer.material.SetX来设置制服。

标签: unity3d shader cg


【解决方案1】:

只需定义一个 Vector 类型的 shader property。然后你可以通过在材质上调用SetVector 来更新每一帧的这个属性。

【讨论】:

    【解决方案2】:

    听起来您只想将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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多