OpenGL / GLUT - 项目ModelView坐标到纹理矩阵

时间:2013-06-23 18:41:20

标签: opengl texture-mapping map-projections

有没有办法使用OpenGL或GLUT将模型视图矩阵中的点投影到相关的纹理矩阵中?如果没有,是否有一个常用的库来实现这一目标?我想根据3D空间中的光线投射来修改对象的纹理。

最简单的情况是:

  1. 投射的光线与四边形相交,用单个纹理映射。
  2. 交点被转换为在x和y轴上夹在[0.0,1.0]之间的纹理空间中的值。
  3. 以生成的纹理点的圆角值为中心的3x3像素块设置为alpha值0.(或另一个方便的RGBA值,以达到所需的效果)。
  4. 这里要说明的是使用球体的问题的更复杂版本,粉红色框显示替换的像素。

    我只是在OpenGL中指定用于映射的纹理点,我实际上并不知道如何将像素投影到球体上。基本上我需要与该投影相反,但我不太清楚如何进行数学运算,特别是对于更复杂的形状,如球体或任意凸壳。我假设你可以以某种方式找到构成光线相交的形状的平面多边形,从那里四边形或三角形的反投影将是微不足道的。

    一些方程式,文章和/或示例代码会很好。 Projecting a ray to exture space

2 个答案:

答案 0 :(得分:1)

有几种方法可以完成你想要做的事情:

  1. 通过自己进行模型 - 视图和投影变换矩阵乘法(或者如果您使用的是旧式OpenGL,将世界坐标点投影到规范化设备坐标(NDCs)中,调用gluProject),并执行透视分割步骤。如果使用深度坐标为零,则这将对应于在成像平面处与光线相交。您需要进行的唯一其他校正从NDC(在 x y 中的[-1,1]范围内)映射到纹理空间中结果坐标为2,然后移动.5。

  2. 一起跳过光线跟踪,将纹理作为帧缓冲附件绑定到帧缓冲对象,然后渲染一个大点(或精灵),根据需要修改交集附近的颜色。您可以使用相同的模型视图和投影矩阵,并且(可能)只需要更新视口以匹配纹理分辨率。

答案 1 :(得分:0)

所以我找到了一个有点复杂的解决方案,但是做到了。

对于复杂几何体,您必须确定哪个四边形或三角形相交,并将其用作平面。四边形必须是平面的(显然)。

在尺寸为1x1x0的单位矩阵中绘制一个平面,将纹理映射到与模型几何体相同的点上。

  1. 变换平面,并将每个变换矩阵的逆存储在堆栈中
  2. 找到飞机相交的点
  3. 使用逆矩阵堆栈转换此点,直到它返回到单位矩阵(它应该没有深度(
  4. 通过将点乘以像素数和舍入,将此点从1x1空间转换为像素空间。或者在这里开始你的2D组合逻辑。