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

时间:2018-04-19 10:29:11

标签: opengl projection perspective orthographic

我有透视投影的3D场景。我也可以在场景中选择一个对象。我需要为选定的对象绘制轴。问题是轴不能在透视投影中保存它们的大小。如果物体远离眼睛(相机),轴也会变小。

无论眼睛(相机)的位置如何,如何绘制相同尺寸的轴?

1 个答案:

答案 0 :(得分:1)

有两种方法可以实现这一目标:

仅限着色器

当观察透视投影时,根据深度的尺寸变化是由透视分割(将所有分量除以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分量给出了必须放置轴的屏幕空间中的位置。

现在使用此位置渲染具有正交投影的轴,无论轴有多远,都会保持尺寸。

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