OpenGL/GLUT-将模型视图坐标投影到纹理矩阵

OpenGL/GLUT-将模型视图坐标投影到纹理矩阵,opengl,texture-mapping,map-projections,Opengl,Texture Mapping,Map Projections,有没有一种方法可以使用OpenGL或GLUT将点从模型视图矩阵投影到关联的纹理矩阵中?如果没有,是否有一个常用的库可以实现这一点?我想根据3D空间中的光线投射修改对象的纹理 最简单的情况是: 将投射与四边形相交的光线,并使用单个纹理进行贴图 交点将转换为x轴和y轴上夹在[0.0,1.0]之间的纹理空间中的值 围绕结果纹理点的舍入值为中心的3x3像素面片设置为0的alpha值(或另一个方便的RGBA值,以获得所需效果) 为了说明这是一个更复杂的问题,使用一个球体,粉红色框显示替换的像素 我只是在O

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

最简单的情况是:

  • 将投射与四边形相交的光线,并使用单个纹理进行贴图
  • 交点将转换为x轴和y轴上夹在[0.0,1.0]之间的纹理空间中的值
  • 围绕结果纹理点的舍入值为中心的3x3像素面片设置为0的alpha值(或另一个方便的RGBA值,以获得所需效果)
  • 为了说明这是一个更复杂的问题,使用一个球体,粉红色框显示替换的像素

    我只是在OpenGL中指定贴图的纹理点,实际上我不知道像素是如何投影到球体上的。基本上,我需要求投影的倒数,但我不太知道如何计算,特别是在更复杂的形状上,比如球体或任意凸包。我假设你可以找到一个平面多边形,它构成了光线相交的形状,从那里可以得到四边形或三角形的逆投影

    一些方程式、文章和/或示例代码会很好。

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

  • 通过自己执行模型视图和投影变换矩阵乘法,将世界坐标点投影到标准化设备坐标(NDC)中(或者如果使用老式OpenGL,请调用
    gluProject
    ),然后执行透视分割步骤。如果使用的深度坐标为零,这将对应于光线在成像平面处相交。你唯一需要做的另一项修正是将NDC(x和y的范围在[-1,1]内)映射到纹理空间,方法是将生成的坐标除以2,然后移动0.5

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


  • 所以我找到了一个有点复杂的解决方案,但确实有效

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

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

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

  • 所以,也许我不完全理解这个解释,但听起来好像你想让我把世界空间坐标投影到屏幕空间,也许我只是个傻瓜,但我真的不明白这与将世界空间投影到UV贴图纹理有什么关系。我能理解我试图解决的问题是,只是在一点上画画映射,但它不是,它正在绘制到模型上。@awebie:还有另一种方法:用颜色对纹理的UV坐标进行编码。在2通道纹理中使用每个通道超过12位的格式,或者在R和G通道中使用256模的数字,并在B通道中对每个通道8位纹理的商进行编码。渲染图像使用相同的转换,但转换为FBO。然后读回帧缓冲区,这将为您提供从帧缓冲区像素到纹理坐标的直接映射。