我正在实现一个简单的顶点着色器来广告位图。定义了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,但结果不正确。那么,我该怎么做呢?
答案 0 :(得分:0)
要将世界空间矢量转换为剪辑空间,请乘以worldViewProjection变换,并将最终矢量除以其w分量。
确保原始向量的第四个分量为0非常重要,因为0用于方向向量,1用于位置向量。
所以如果你的向量是v =(x,y,z,0)
然后(假设行主矩阵)得到的矢量是
vclip = v * worldViewProjection.
最后一步称为均匀分裂,如果投影是透视的,这很重要。您需要将新矢量除以其第4个分量 即:
vclip = vclip / vclip.w;