首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有多块纹理的绘制模型

具有多块纹理的绘制模型
EN

Game Development用户
提问于 2017-04-17 20:37:11
回答 2查看 1.2K关注 0票数 1

见编辑:

我将如何绘制一个具有多个贴图纹理的模型?我有一些想法,但都有缺点,这里有一些(顺便说一下,这是一个opengl游戏):

-Use是一个巨大的纹理,但这是以纹理昂贵为代价的。

-Render不同的对象为每个纹理对象(例如:一个模型可以是一个房子的砖,另一个可以在屋顶,每一个有自己的瓷砖纹理),但这将变得非常混乱,非常迅速。

这是一个(惊人的)图像,以帮助演示我正在努力做的事情。

红色区域上重复的"R“可能代表着重复的砖块纹理,而绿色的表示屋顶,也许是屋顶瓦。另外,我还添加了一个窗口纹理。

我的问题是,大多数游戏是如何处理这个问题的?我似乎不能把我的头包围在我如何能把它放在一个纹理,但我看到许多其他游戏做我想做的事情。

编辑:

这应该提供一个更好的视觉演示。我想要一个大的网格(在演示中不是很大)使用一个纹理地图集。(请记住,不是地图集中的所有纹理都是相同大小的!)

让我们说这是我的对象,它使用地图集上的每一个纹理,但不是相同数量的重复(砖块重复3次,当笑脸重复9次左右)

大多数游戏是如何实现这样的目标的?而不用重复纹理的大文件。

例如(从BOTW),我想他们不只是重复这个纹理在地图集上,考虑到这将是多么大(和昂贵)。

EN

回答 2

Game Development用户

回答已采纳

发布于 2017-04-19 01:28:02

我似乎找到了最好的答案,它可能是懒惰,但如果你有时间,我会尝试做@DMGregory建议,因为它可能更有效。

因此,我最终做的是使用与OBJ一起导出的材料文件,这让我可以定义什么时候面部应该使用不同的纹理。所以我会渲染一个纹理,然后交换纹理,用这个纹理渲染其余的脸,再这样做,直到整个模型被渲染。当然,这意味着很多额外的平局呼叫,但对我来说,这似乎是最简单的选择。

票数 0
EN

Game Development用户

发布于 2017-04-18 04:17:54

我对OpenGL不太熟悉,所以我将在这里给出一个粗略的草图,并将它作为一个社区wiki,以防更了解该技术的人想要用精确的代码提示来更新它。

首先,如果您的目标是OpenGL 3.0或更高版本,则可以使用阵列纹理。这些允许您将同一分辨率的多个贴图纹理打包到一个采样器中。您的工作流程如下所示:

  1. 在建模工具中,用3通道纹理坐标(通常称为UVW)建立并导出模型。U&V将是你习惯的正常的2D纹理坐标,可以覆盖你想要的纹理空间的任何部分,甚至重叠UV网的其他部分。第三个组件,W,将是一个物质索引--例如,被认为是“砖块”的部分可能有W坐标为0,“鹅卵石”可能是W= 1,而“瓦”可能是W= 2。或者,您可以设置一个导入器,从模型中读取一个材料或亚网格索引,并使用它构造这些W坐标,如果这样做比编写它们更方便的话。
  2. 将纹理按与您指定的W坐标相同的顺序加载到纹理数组中。0=砖,1=鹅卵石,2=瓦,等等)
  3. 在您的着色器中,使用sampler2DArray来引用这个纹理,并将上面创建的三维纹理坐标传递给它。它将使用纹理坐标的第三个通道从数组中选择正确的材料“页面”,并对其进行示例。

如果您需要将不支持Array纹理的设备作为目标,那么您可以使用纹理地图集来完成这方面的工作,只需稍微大惊小怪:

  • 与其将纹理存储为数组中的页面,不如将它们并排放置在一个大的2D纹理中,就像瓷砖一样。
  • 在您的着色器,您将使用第三个纹理坐标,以选择一个偏移到这个网格的瓷砖。
  • 在像素/片段着色器中,您将使用frac或fmod函数将纹理坐标封装到0.1范围(有效地执行重复纹理采样模式通常在硬件中所做的操作),并将此范围缩放到地图集中单个瓷砖的大小。
  • 结合这个瓷砖偏移和包装内的坐标瓷砖,你将得到你的最终样本位置在地图集内。
  • 您可能需要使您的瓷砖稍微小一些,以允许它们之间的一些填充,以确保相邻的瓷砖不会在较小的mip水平一起流血。
票数 1
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/140012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档