码迷,mamicode.com
首页 > 移动开发 > 详细

Projective Texture Mapping

时间:2020-10-18 16:25:50      阅读:30      评论:0      收藏:0      [点我收藏+]

标签:转换   形状   技术   rap   oge   坐标   reflect   活性   视锥   

Introduction

  投影纹理映射(Projective texture mapping)是Segal [3]描述的一种纹理映射方法,它允许将纹理图像像幻灯片投影机一样投影(projected)到场景上。 图1显示了projspot演示的一些示例屏幕快照,可在NVIDIA OpenGL SDK中获得。 投影纹理贴图可用于多种照明技术,包括阴影贴图[4]。 本文档提供了一些背景知识,并介绍了OpenGL中投影纹理映射所涉及的步骤。

技术图片

 

图1.将两个笑脸纹理投射到场景上的不同视图。

 

   投影纹理映射既指将纹理坐标分配给顶点的方式,又指对图元进行栅格化期间计算它们的方式。 我们通常将纹理映射视为“将纹理图像应用到基元上”,尽管确实如此,但数学运算却比大多数人想象的要多。 如果您曾经编写过自己的光栅化程序,并且支持mipmap过滤,透视校正,投影纹理贴图,那么您无疑会意识到其中涉及的许多细微问题。 我们将首先讨论在栅格化过程中计算纹理坐标的方式,然后我们将讨论将纹理坐标分配给顶点的方法。 我们在这里不讨论过滤,但是NVIDIA开发人员网站上有一篇有关各向异性过滤的论文,为该主题提供了很好的介绍。

栅格化详细信息 Rasterization Details

  在执行投影纹理贴图时,我们使用同质纹理坐标或投影空间中的坐标。 在执行非投影纹理贴图时,我们使用真实纹理坐标或真实空间中的坐标。 对于投影2D纹理映射,将3分量齐次坐标(s,t,q)插值到基元上,然后在每个片段处,将插值的齐次坐标投影到实际的2D纹理坐标(s / q,t / q),以索引到纹理图像。 对于非投影2D纹理映射,将2分量实坐标(s,t)内插到图元上,并直接用于索引到纹理图像中。
  图2中的图像说明了投影空间中的插值与实际空间中的插值之间的区别。 在投影空间中,两个三角形具有相同的屏幕空间坐标梯度,但是在实际空间中这是不可能的。 这些图像是通过qcoord演示生成的,该演示可在NVIDIA OpenGL SDK中获得。

技术图片

 

 

 图2。这些图像说明了(a)投影空间和(b)实空间中的插值。

  关于图2中图像的一个重要说明是,几何形状是与图像平面平行的梯形。 它不是延伸到该距离的细长矩形的透视投影。 这是一个重要的区别,因为我们在这里看到的效果看起来像是透视校正和非透视校正插值之间差异的说明。 这个想法是相关的,因为透视校正是关于在透视后的真实空间(窗口坐标)中正确地插值,参数在同质夹(或眼)空间中线性变化[1]。

  尽管透视校正内插和投影纹理映射的概念密切相关,但实际上它们是正交的。 透视校正(或非透视校正)插值描述了如何在多边形上插值s,t,q和随顶点变化的任何其他参数。 对于投影纹理映射,将s和t除以q的事实与负责内插这些量的机制几乎无关。 我之所以这么说,主要是因为早期的OpenGL实现同时进行了投影和透视校正(一次除以q / w)。 尽管此方法在没有透视校正颜色的非多纹理系统中效果很好,但由于每个纹理单元都有自己的q坐标,因此在具有透视校正颜色的现代具有多纹理功能的硬件中它的用处较小。

分配均匀的纹理坐标 Assigning Homogeneous Texture Coordinates 

  上面的栅格化讨论假定已为每个顶点分配了均匀的纹理坐标。 作为应用程序程序员,这是我们的工作。 本节介绍如何在OpenGL [2]中进行设置。
  考虑到纹理是由幻灯机投影到场景上的。 该投影机具有与相机相同的大多数特性–拥有将世界空间坐标转换为投影机空间(或眼睛空间)的观看变换,并且具有将投影机空间视图体积映射到剪辑坐标的投影变换。 最后,我们有一个规模和偏见来应用简单的范围映射。 对于相机,x和y基于当前视口设置进行映射,而z基于当前深度范围进行映射。 对于投影纹理映射,每个坐标的范围映射通常为[0,1]。 NV_texture_rectangle纹理目标是这种情况的一个例外,因为它由s?[0,width]和t?[0,height]索引。

  图3比较了应用于顶点位置以计算窗口空间位置坐标和投影纹理坐标的变换。

  为投影纹理映射分配纹理坐标的关键是使用OpenGL纹理坐标生成(texgen)工具。 texgen工具只是根据其他顶点属性生成纹理坐标。 在GL_OBJECT_LINEAR和GL_EYE_LINEAR texgen的情况下,顶点位置(分别在对象空间和眼睛空间中)用于生成纹理坐标。 其他形式的texgen使用不同的属性。 GL_SPHEREMAP和GL_REFLECTION_MAP_ARB使用眼睛空间顶点位置和法线。 GL_NORMAL_MAP_ARB只是将眼空间法线向量分配给纹理坐标。

  技术图片

 

 

 图3.应用于世界空间顶点位置以生成窗口空间坐标的摄影机转换与应用于世界空间顶点位置以生成投影纹理坐标的投影机转换非常相似。

  OpenGL基于每个坐标保持texgen状态,这意味着,例如,您可以将S纹理坐标与GL_SPHERE_MAP关联,将T坐标与GL_REFLECTION_MAP_ARB关联,将R坐标与GL_OBJECT_LINEAR关联,将Q坐标与GL_EYE_LINEAR关联。 但是,这种灵活性并不是特别有用,我们通常对所有坐标使用相同形式的texgen。

  可用于投影纹理映射的两种类型的texgen是对象线性和眼睛线性。 在这两种模式下,通过评估顶点位置处的平面方程来计算纹理坐标的每个分量。 因为每个坐标都有自己的平面方程,并且评估平面方程等效于4分量点积,所以将四个texgen平面视为形成4x4矩阵T可能更直观。 -坐标,很难在OpenGL规范中使用该语言。 等式1和2说明了如何通过“ texgen矩阵”将顶点位置转换为纹理坐标。

技术图片

 

 

 在以下两个小节中,我们将考虑如何计算To(对于对象线性texgen)和Te(对于眼睛线性texgen)。 还要注意,由texgen生成的纹理坐标仍由纹理矩阵转换。 这可能很吸引人,因为它允许我们使用标准的矩阵操作命令(glTranslate(),glRotate(),gluPerspective()等),但它的效率可能比将所有变换合并到texgen矩阵中的效率略低。

对象线性Texgen  Object Linear Texgen

  对象线性texgen按照OpenGL指定的那样变换对象空间的顶点位置。 公式3中显示了这种情况下所需矩阵的级联。在此公式中,M是模型矩阵(不要与OpenGL MODELVIEW矩阵混淆),Vp是投影仪的视图矩阵,Pp是投影矩阵 用于投影机。 给定的最终矩阵将执行缩放和偏置操作,以将纹理坐标的s,t和r分量映射到[0,1]范围。

技术图片

 

 

   使用对象线性texgen的一些注意事项是:1)您应该跟踪当前的模型矩阵–这是OpenGL无法帮助您的; 2)对象线性texgen平面To,每次模型矩阵更改时必须更新。

Eye Linear Texgen   眼部线性texgen

  眼部线性texgen转换眼部空间顶点位置,该位置只是由OpenGL MODELVIEW矩阵转换的对象空间顶点位置。 公式4中显示了这种情况下所需矩阵的级联。该公式中的矩阵与公式3中的相同,不同之处在于模型矩阵M已替换为摄影机(或眼睛)视图矩阵的逆矩阵, Ve-1。 这是合乎逻辑的,因为我们需要撤消眼睛的观看转换才能回到世界空间。

技术图片

 

 使用眼睛线性texgen的一些注意事项是:1)OpenGL变换和光照必须计算眼空间顶点位置,以及2)必须计算矩阵逆。 如果我们使用逐顶点照明,则OpenGL变换和照明可能已经在计算眼空间顶点位置,因此与眼线性texgen相关的逐顶点成本可能不会很高。 OpenGL还尝试帮助解决所需的矩阵逆问题。 它通过用当前MODELVIEW矩阵的逆矩阵变换眼平面(或Te行)来实现此目的。 使用眼线性texgen时,这是造成混淆的常见原因,因此请注意。 如果要直接指定Te,则应验证当前的MODELVIEW矩阵是否为恒等。 为了让OpenGL处理逆视图矩阵,您可以简单地将MODELVIEW矩阵设置为仅包含视图矩阵。 然后,您将在不包括Ve-1的情况下从公式4传递矩阵。

注意事项Caveats

  使用投影纹理映射时,需要注意几个问题。 一个是反向投影,另一个是纹理图像分辨率和滤波.

反向投影Reverse Projection

  与真正的投影仪不同,投影纹理贴图的数学运算实际上会产生双重投影。 一个沿着投影机的观看方向,另一个沿着相反的方向。 图4说明了这种效果。

技术图片

 

 图4.投影纹理映射也产生反向投影。

  q的符号在投影机后变为负号,从而以反向投影反转纹理图像。 通常,当投影纹理的q坐标变为负值时,应用程序将使用一维纹理或其他内插量来消除颜色贡献。

过滤投影纹理Filtering Projective Textures

  投影纹理映射的另一个复杂性是可能发生的过滤要求中的病理变化。 由于所涉及的两个视锥面的性质,纹理图像的某些部分可能需要极度各向异性的滤镜内核,极小的缩小以及单遍图像中极高的单个纹理图像放大倍数。 图5说明了两个视锥细胞的“头灯鹿”方向。

技术图片

 

 图5.当投影仪的平截头体面对眼睛的平截头体时,发生“大灯鹿”效果。 采样频率的这种严重不匹配使滤波变得复杂

Conclusion 

  从1.0版开始,投影纹理映射已在OpenGL中受支持。 它对于许多有趣的高级渲染技术至关重要,例如每像素聚光锥渲染和阴影贴图。 此处提供的描述应提供足够的背景知识,以使OpenGL开发人员能够实现投影纹理映射。 请访问http://www.nvidia.com/cn了解更多信息,或发送电子邮件至cass@nvidia.com。

References
[1] James F. Blinn. Hyperbolic interpolation. IEEE Computer Graphics (SIGGRAPH)and Applications, 12(4):89 94, July 1992.
[2] Mark Segal and Kurt Akeley. The OpenGL Graphics System: A Specification(Version 1.2.1). www.opengl.org
[2] Mark Segal, et al. Fast shadows and lighting effects using texture mapping. In Proceedings of SIGGRAPH ’92, pages 249-252, 1992.
[3] Lance Williams. Casting curved shadows on curved surfaces. In Proceedings of SIGGRAPH ’78, pages 270-274, 1978.

Projective Texture Mapping

标签:转换   形状   技术   rap   oge   坐标   reflect   活性   视锥   

原文地址:https://www.cnblogs.com/d1012181765/p/13826412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!