无需 OpenGL 的纹理映射

问题描述 投票:0回答:3

所以我应该对我加载到场景中的特定模型进行纹理映射(使用帧缓冲区和平面针孔相机),但是我不允许使用OpenGL,而且我不知道如何做(否则)我们确实使用 glDrawPixels 来实现其他功能,但这是我们唯一可以使用的功能)。

这里有人能够给我演示如何在没有 OpenGL 功能的情况下进行纹理贴图吗?

我应该使用这些幻灯片:https://www.cs.purdue.edu/cgvlab/courses/334/Fall_2014/Lectures/TMapping.pdf

但它们对我来说毫无意义。

到目前为止我收集到的内容如下:

您迭代模型,并分配每个三角形“纹理坐标”(我不确定它们是什么),然后使用“模型空间插值”(同样,我不明白那是什么)来应用具有正确视角的纹理。

我的程序目前执行以下操作:

Teapot

TL;博士: 1.什么是模型空间插值/如何进行? 2. 纹理坐标具体是什么? 3. 在高层次上(用外行人的话来说)我如何在不使用 OpenGL 的情况下对模型进行纹理映射。

c++ visual-c++ textures texture-mapping interpolation
3个回答
1
投票

好的,首先让我们确保我们对于颜色插值的工作原理达成共识。第 125 行到第 143 行设置了三个向量

redABC
greenABC
blueABC
,用于在三角形上插值颜色。它们一次处理一种颜色分量,三个向量中的每一个都有助于插入一种颜色分量。

按照惯例,s,t 坐标位于源纹理空间中。正如网格数据中所提供的,它们指定了三角形特定顶点的纹理内的位置。要理解的关键一点是,s,t 坐标需要像颜色一样在三角形上进行插值

因此,您要做的是设置另外两个

ABC
向量:
sABC
tABC
,完全复制用于设置
redABC
的逻辑,但不使用每个顶点的颜色分量,而是只需使用每个顶点的 s,t 坐标即可。然后,对于每个像素,不是将
ssiRed
等计算为
unsigned int
值,而是将
ssis
ssit
计算为浮点数,它们应该在
0.0f
1.0f
范围内(假设源为 s,t)价值观表现良好。

现在您已经有了插值的 s,t 坐标,将

ssis
乘以纹理的纹素宽度,将
ssit
乘以纹素高度,然后使用这些坐标来获取纹素。然后把它放在屏幕上。


0
投票

既然你没有使用 OpenGL,我假设你编写了自己的软件渲染器来渲染那个茶壶?

纹理只是一个图像。纹理坐标是纹理中的 2D 位置。所以 (0,0) 是左下角,(1,1) 是右上角。对于 3D 模型的每个顶点,您应该在纹理中存储一个 2D 位置 (u,v)。这意味着在该顶点,您应该使用纹理在该点的颜色。

要了解顶点之间像素的 UV 纹理坐标,您需要对其周围顶点的纹理坐标进行插值。然后您可以使用该 UV 来查找纹理中的颜色。


-1
投票

如果您是一名业余爱好者,正在寻找一款易于使用且功能强大的 CAD 软件,那么 CADHOBBY IntelliCAD 就是您的最佳选择。它是创建 3D 设计和模型的完美软件。

https://www.cadhobby.com/

© www.soinside.com 2019 - 2024. All rights reserved.