手动使用圆柱体中间表面进行纹理映射

Posted

技术标签:

【中文标题】手动使用圆柱体中间表面进行纹理映射【英文标题】:Texture mapping with cylinder intermediate surface manually 【发布时间】:2013-04-14 17:20:25 【问题描述】:

我正在为一个班级项目进行扫描线渲染。渲染器到目前为止工作,它读取模型(主要使用 utah 茶壶),计算顶点/表面法线,并且可以进行平面和 phong 着色。我现在正在添加纹理映射,这是我遇到问题的地方(除了在屏幕上实际绘制点之外,我不能使用任何 OpenGL 方法)。

因此,我将纹理读入我的应用程序并拥有一个 RGB 值的二维数组。我知道这个概念是将纹理从 2D 纹理空间映射到一个简单的 3D 对象(在我的例子中是一个圆柱体)。然后我现在您将中间表面映射到对象表面上。

但是,我实际上并不知道如何做这些事情 :)。我找到了一些将纹理映射到圆柱体的公式,但它们似乎总是遗漏了诸如要使用的值之类的细节。然后我也不知道如何获取对象的顶点坐标并获取该点的圆柱值。还有其他一些关于映射到圆柱体的 *** 帖子,但它们 1)使用着色器等处理较新的 OpenGL,以及 2)不处理中间表面,所以我不确定如何从它们中翻译知识。

因此,对于使用圆柱体作为中间表面将纹理映射到 3D 对象的伪代码的任何帮助将不胜感激。

【问题讨论】:

纹理映射不适用于“中间表面”。从技术上讲,纹理定义了插值函数的采样点,并且根据纹理坐标沿原始光栅化器对插值函数进行采样。纹理坐标是明确给出的,或者是从顶点位置计算出来的。我知道这不是一个非常令人满意的答案,因此我将其写为评论。 【参考方案1】:

你一直在使用“中间表面”这个词,它没有正确描述这个过程,但却暗示了你的想法。

基本上,您需要一种将茶壶表面上的每个点映射到圆柱体上的方法(假设纹理将“包裹”在圆柱体上)。

只需将您的表面点转换为圆柱坐标(rthetaheight),然后使用 theta作为 uheight 作为 v (texcoords)。

这是您想要实现的目标:

【讨论】:

我以为我已经解决了这个问题,但继续绕圈子(坏笑话)。那么我如何将表面点实际转换为圆柱坐标呢?不确定x,y,z 点如何转换为r, theta, and height 我无法在此评论中格式化和排版该数学。对于converting from Cartesian to Cylindrical coordinates 的实际数学,我必须将您推荐给***。查看“坐标系转换”部分。具体来说,使用 arcsin 的公式(在 math.h 中是 asin)。

以上是关于手动使用圆柱体中间表面进行纹理映射的主要内容,如果未能解决你的问题,请参考以下文章

图形学计算机图形学知识点提纲5

webgl 纹理

知识点3 shader_基础纹理

3d一些术语

OpenGL_Qt学习笔记之_05(纹理映射)(转)

在 OpenGL 中将纹理映射到球体时出现接缝问题