如何使用现代 OpenGL 在透视投影中绘制对象的正交轴?
How to draw ortho axes for object in perspective projection using modern OpenGL?
我有透视投影的 3D 场景。我也可以 select 现场的一个对象。我需要为 selected 对象绘制坐标轴。问题是轴不会在透视投影中保存它们的大小。如果物体远离眼睛(相机),轴也会变小。
如何绘制与眼睛(相机)位置无关的相同大小的坐标轴?
有两种方法可以实现:
仅着色器方法
看透视投影时,尺寸随深度的变化是由透视划分(将所有分量除以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接近
另一种选择是使用正交投影渲染轴,同时计算它必须放置在 CPU 上的位置。
例如,这可以通过使用透视投影投影目标位置来完成,执行透视划分。生成的 x,y 分量给出屏幕中的位置-space 必须放置轴的位置。
现在使用此位置渲染具有正交投影的轴,无论轴有多远都将保持尺寸不变。
缺点:使用这种方法深度值可能与场景的透视投影部分不兼容。
我有透视投影的 3D 场景。我也可以 select 现场的一个对象。我需要为 selected 对象绘制坐标轴。问题是轴不会在透视投影中保存它们的大小。如果物体远离眼睛(相机),轴也会变小。
如何绘制与眼睛(相机)位置无关的相同大小的坐标轴?
有两种方法可以实现:
仅着色器方法
看透视投影时,尺寸随深度的变化是由透视划分(将所有分量除以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接近
另一种选择是使用正交投影渲染轴,同时计算它必须放置在 CPU 上的位置。
例如,这可以通过使用透视投影投影目标位置来完成,执行透视划分。生成的 x,y 分量给出屏幕中的位置-space 必须放置轴的位置。
现在使用此位置渲染具有正交投影的轴,无论轴有多远都将保持尺寸不变。
缺点:使用这种方法深度值可能与场景的透视投影部分不兼容。