如何使用现代 OpenGL 为透视投影中的对象绘制正交轴?



我有透视投影的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 分量给出了屏幕空间中必须放置轴的位置。

现在使用此位置使用正交投影渲染轴,无论轴有多远,它都将保持大小。

缺点:使用这种方法时,深度值可能与场景的透视投影部分不兼容。

最新更新