0

我正在实现一个简单的顶点着色器来展示位图。定义了 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,但结果不正确。那么,我该怎么做呢?

4

1 回答 1

1

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

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

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

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

vclip = v * worldViewProjection.

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

vclip = vclip / vclip.w; 
于 2013-02-14T19:38:35.417 回答