我想使用GL_LINE_STRIP
绘制一个棱台。这些棱台的顶点坐标是什么?我有模型视图和投影矩阵。是否可以在着色器本身使用这些矩阵来计算坐标?
我想使用GL_LINE_STRIP
绘制一个棱台。这些棱台的顶点坐标是什么?我有模型视图和投影矩阵。是否可以在着色器本身使用这些矩阵来计算坐标?
如果你想要获取视锥体角落的世界空间坐标,你只需要将8个角点从NDC空间投影回世界空间即可(NDC空间中每个维度都从-1到1,因此角点很容易枚举)。但是不要忘记必须通过w
进行除法:
c_world = inverse(projection * view) * vec4(c_ncd, 1);
c_world = c_world*1.0/c_world.w;
虽然我用的是GLSL语法写的,但这只是伪代码。你可以在着色器中完成,但这意味着必须多次计算(取决于将此放入哪个着色器阶段)。通常,在CPU上预先计算反转矩阵至少要快得多。
vec4 (clip_space.xyz / clip_space.w, 1.0 / clip_space.w)
)都是由 -1 和 1 的某种组合构成的。对于三个维度,你需要使用 2^3 = 8 种由 -1 和 1 组成的组合来找到 NDC 中的所有角落。一旦找到这些角落,就将其乘以逆投影矩阵以转换到裁剪空间,再乘以逆视图矩阵以转换到世界空间(这可以合并为单个步骤,如 derhass 所演示的)。顺便说一下,通过 w
的除法产生了截锥体形状,如果不除以 w
,则得到的是一个立方体。 - Andon M. Coleman