在3D表面上放置多个图像

时间:2013-04-20 00:57:30

标签: opengl graphics opengl-es 3d opengl-es-2.0

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

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

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

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

然后,我对这些四边形进行变换,使它们看起来位于3D对象的表面上,例如立方体。当然,我必须维护一个矩阵层次结构,这样每当转换立方体时这些四边形都会被适当地转换,这样它们就会被附加到立方体上。

虽然这不一定很难,但我不熟悉纹理,并想知道这是否是这种情况的正常做法。

2 个答案:

答案 0 :(得分:1)

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

结帐glCopyTexImage2D()glCopyTexSubImage2D()

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

答案 1 :(得分:0)

  

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

使用多个纹理,可能每个纹理都有自己的textuer坐标集。您的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]间隔之外,但不重复图像只显示一次,只重复边缘像素。如果使边缘像素透明,就好像那里没有图像一样。