3

如果我要在 3D 对象(例如立方体)的表面上放置纹理,我可以使用该立方体的顶点来描述此纹理的放置。

但是,如果我想在同一个平面上放置多个单独的图像怎么办?或者假设它只是一个图像,但我不希望它出现在顶点所在的曲面边缘,而是出现在曲面中间的某个小地方。我希望在运行时动态选择和放置实际图像,否则我可以将它们离线压缩为单个纹理。

我有一种方法,但我想就是否有更好的方法寻求建议,或者这是否完全可以接受

我的猜测是创建多个单独的 2D 四边形(深度为 0),每个四边形都有与之关联的纹理并放置在它们上面(它们当然可以是具有不同纹理坐标的纹理图集)。

然后,我变换这些四边形,使它们看起来位于 3D 对象(例如立方体)的表面上。当然,我必须维护一个矩阵层次结构,以便在变换立方体时适当地变换这些四边形,以便它们看起来附加到立方体上。

虽然这不一定很难,但我是纹理的新手,想知道这是否是这样的正常做法。

4

2 回答 2

1

您可以尝试渲染场景并将其保存为纹理,然后在表面上使用该纹理。

查看glCopyTexImage2D()glCopyTexSubImage2D()

或者也许尝试使用帧缓冲区对象。

于 2013-04-20T01:23:25.210 回答
0

但是,如果我想在同一个平面上放置多个单独的图像怎么办?

使用多个纹理,也许每个纹理都有自己的一组纹理坐标。您的 OpenGL 实现将为您提供许多纹理单元。它们中的每一个都可以提供不同的纹理。

glActiveTexture(GL_TEXTURE_0 + i);
glBindTexture(…);
glUniform1i(texturesampler[i], i); // texturesampler[i] contains the sampler uniform location of the bound program.

或者假设它只是一个图像,但我不希望它出现在顶点所在的曲面边缘,而是出现在曲面中间的某个小地方。

这就是 GL_CLAMP... 纹理环绕模式得到使用的地方。

glTexParameteri(GL_TEXTURE_WRAP_{S,T,R}, GL_CLAMP[_TO_{EDGE,BORDER}]);

对于那些您指定顶点处的纹理坐标在 [0, 1] 间隔之外的那些,但不是重复图像,而是仅显示一次,仅重复边缘像素。如果使边缘像素透明,就好像那里没有图像一样。

于 2013-04-20T10:42:40.343 回答