我有透视投影的3D场景。我也可以选择场景中的对象。我需要为所选对象绘制轴。问题是轴不会在透视投影中保存其大小。如果物体远离眼睛(相机),轴也会变小。
如何绘制相同尺寸的轴,无论眼睛(相机)的位置如何?
有两种方法可以实现此目的:
仅着色器方法
查看透视投影时,根据深度的大小变化是由透视划分(将所有分量除以 w)引起的。如果要防止这种情况发生,可以将投影顶点的 x 和 y 坐标乘以 w 坐标,这将抵消透视分。这有点棘手,因为在所有其他转换之前进行更正,但是沿着这条线的东西应该适用于一般情况:
vec4 ndc = MVP * vec4(pos, 1);
float sz = ndc.w;
gl_Position= MVP * vec4(pos.xy * sz, pos.z, 1);
缺点:需要专门的着色器
中央处理器方法
另一种选择是使用正交投影渲染轴,同时计算必须将其放置在 CPU 上的位置。
例如,这可以通过用透视投影投影目标位置来完成,执行透视分割。生成的 x,y 分量给出了屏幕空间中必须放置轴的位置。
现在使用此位置使用正交投影渲染轴,无论轴有多远,它都将保持大小。
缺点:使用这种方法时,深度值可能与场景的透视投影部分不兼容。