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

3
如果我要在3D对象表面放置纹理,例如一个立方体,我可以使用该立方体的顶点来描述纹理的放置。
但是如果我想在同一平面上放置多个单独的图像呢?或者假设它只是一个图像,但我不希望它出现在表面边缘(即顶点处),而是希望它出现在表面中间的某个小地方。我希望实际的图像在运行时动态选择和放置,否则我可以将它们离线压缩为单个纹理。
我有一个方法,但我想征求建议,是否有更好的方法,或者这种方法完全可行:
我的想法是创建多个单独的2D四边形(深度为0),每个四边形都有一个与之关联的纹理,并放置在其上(它们当然可以是具有不同纹理坐标的纹理集)。
然后,我对这些四边形进行变换,使它们看起来在3D对象表面,比如一个立方体上。当然,我必须维护一个矩阵层次结构,以便这些四边形在立方体变换时适当地变换,从而看起来它们附着在立方体上。
虽然这并不难,但我对纹理贴图还很陌生,想知道这是否是这种情况下的常规做法。

你所尝试的做法并不是常规做法,因此很难说针对人们通常不做的事情,“正常做法”是什么。纹理通常是构建为按原样使用的。如果您需要在墙的一部分上放置某些东西,则您的纹理艺术家实际上会将其放入墙壁的纹理中,或者您的建模师会放置一个嵌入墙壁的多边形,纹理艺术家会添加特殊内容。 - Nicol Bolas
1
@NicolBolas 在我的研究中,我发现我所问的与从位图字体渲染不同字形到表面上并没有太大区别,其中每个字形都是从相同纹理中取出的不同图像。我发现的一个流行实现实际上正在做我上面建议的事情(除了使用纹理中的字形图像而不是其他类型的图像),所以我认为这并不太常见。 - johnbakers
@SebbyJohanns 像是表面上的3D贴花,而不是由多种纹理组成的拼贴图案? - james82345
除非“decal”是一个特定的术语,否则它与我提出的四边形纹理有何不同?@JamesEldridge - johnbakers
1
@SebbyJohanns:如果你决定将转换后的四边形粘贴在立方体上方,请注意深度冲突 - Rahul Banerjee
显示剩余2条评论
2个回答

1

有趣的函数,虽然不确定它们在这个特定的例子中是否更明智,但它们看起来像是其他需求的有用技术。如果我在这里使用它们,我仍然必须做我正在做的事情,但每次更新图像时还要承担复制纹理的开销;由于我计划经常更新图像,这可能不太优雅。 - johnbakers
另一种方法是通过组合其他纹理图像的数据来重新创建纹理。但是,您必须将图像数据缓冲在内存中,这可能会产生很多开销。我认为您当前的方法可能是最好的。 - james82345
谢谢;我希望这里的一些大牛也能出现并提供一些见解。因为我已经学到了在OpenGL或图形学中几乎总有多种方法来完成某些事情。 - johnbakers
@datenwolf,我做了一个编辑,但不用担心被踩票 :-),我的回答很简短。 - james82345
@SebbyJohanns:一定时间后,投票将被锁定,只有在回答被编辑后才能更改。 - datenwolf
显示剩余2条评论

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]区间,但是图像不会重复显示,而只会显示一次,仅重复边缘像素。如果将边缘像素设置为透明,则就好像没有图像存在。


在我的研究中,我发现我所询问的与从位图字体渲染不同字形到表面上并没有太大区别,其中每个字形都是从相同纹理中获取的不同图像。我发现的一个流行实现实际上基本上就是执行了我上面建议的操作(除了使用纹理中的字形图像而不是其他类型的图像)。 - johnbakers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接