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