将模型空间向量转换为剪辑空间

时间:2013-02-13 01:50:29

标签: 3d stage3d

我正在实现一个简单的顶点着色器来广告位图。定义了4个顶点,并且每个顶点着色器使用相应的UV,结合位图宽度/高度除以视口宽度/高度,来修改剪辑空间位置。很典型的东西,这里有一些存根代码:

    // Project positions to clip space.
    float4 clipPosition = vertexPosition * objectToClipSpaceTransform;

    // Get constants.
    float2 viewPort = float2(props[0], props[1]);
    float2 spriteSize = float2(props[2], props[3]);

    // Calculate window offset.
    float2 windowOffset;
    windowOffset.x = (vertexUV.x - 0.5) * spriteSize.x;
    //neg because V increases down, but Y in clip-space increases up
    windowOffset.y = -(vertexUV.y - 0.5) * spriteSize.y;  
    windowOffset /= viewPort;

    clipPosition.xy += windowOffset * clipPosition.w * 2.0;

    // Output shifted vertex.
    vertexClipPosition = clipPosition;

我想要做的是,在世界空间中定义的向量方向上偏移位图,其大小是固定数量的像素。这里棘手的部分是如何将世界空间矢量转换为剪辑空间。我尝试使用没有转换组件的objectToClipSpaceTransform,但结果不正确。那么,我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

要将世界空间矢量转换为剪辑空间,请乘以worldViewProjection变换,并将最终矢量除以其w分量。

确保原始向量的第四个分量为0非常重要,因为0用于方向向量,1用于位置向量。

所以如果你的向量是v =(x,y,z,0)

然后(假设行主矩阵)得到的矢量是

vclip = v * worldViewProjection.

最后一步称为均匀分裂,如果投影是透视的,这很重要。您需要将新矢量除以其第4个分量 即:

vclip = vclip / vclip.w;