在模型上重复纹理

时间:2014-02-20 12:46:14

标签: java opengl 3d libgdx

我正在创造一个小游戏,你在迷宫中。迷宫以2D Array组织,描述x and z positionblock type。所以它是Tile-based。让我们说每个块都是1 m³。现在我的角色 2米高,迷宫应该 4米高。因此,如果该图块上有墙,我会在彼此上添加4个块。当然,即使使用100 * 100,这对Viewfrustum- and backface culling米/瓦片迷宫也会产生巨大的性能影响。因为这是我的第一个3D游戏,我想保持简单,我不想使用高级剔除技术(八叉树或其他:P)。所以我尝试创建1*4*1块而不是1*1*1,并将它们添加为Walls到我的世界。它效果很好,性能再次完美(60 FPS),但Texture (64*64px)拉长了,看起来真的很难看。

所以我的问题是:

  1. 是否可以每米重复纹理,而不是 伸展吗?
  2. 或者我是否需要修改纹理才能使用4次 高吗?
  3. 或者是否有更好的解决方案?
  4. 编辑:我发现,Texture具有TextureWrap模式。我将其设置为TextureWrap.Repeat,但我无法在UV上设置Texture。如果您要从Sprite创建Texture,则可以轻松将其设置为4以重复Texture 4次。但是我无法向Sprite添加Model,只有Texture是可能的。有没有办法重复那些Texture

3 个答案:

答案 0 :(得分:3)

纹理应用于模型的方式取决于模型中每个顶点的UV值。

如果考虑立方体的一个平面 - 它是一个由4个顶点组成的矩形。如果您的顶点具有类似于(0,0), (1,0), (1,1), (0,1)的UV值,那么整个纹理将在整个平面上渲染一次(就像您现在所拥有的那样)。

你需要的是将你的一些UV值改为4而不是1 - 你应该使用类似(0,0), (1,0), (1,4), (0,4)的东西 - 这样你的纹理将被重复4次。

不幸的是我不知道如何在Libgdx中更改UV,也许其他人会在这里提供帮助。


编辑评论中的问题:

您知道您渲染的每个顶点都有自己的3D位置向量,由x,y,z个组件组成。这表示3D空间中的位置。

如果你想添加纹理,你需要告诉你的顶点纹理的哪个点。您可以定义一些表示纹理中某个点的2D矢量(您也可以使用3D纹理,但现在让我们坚持使用2D示例)。

您的纹理矢量组件也可以命名为x,y,但是为了避免可能与位置数据混淆,有人决定将它们称为u,v(在数学中经常会做这样的事情,即使你存储了相同类型的数据使得一些方程更易于阅读和理解)。这些向量简称为texture coordinatesUVs

现在假设你的纹理在你面前,其中一个角落在(0,0),而另一个角落在(1,1)。您可以获取某些三角形的3个顶点,并且对于每个顶点,您可以获取其UV并在纹理上标记此点。然后,当你连接所有3个点时,你将获得与渲染相同的三角形。

但是如果你的一个UV组件大于1或小于0怎么办?为简单起见,我们可以说GPU将采用相同的纹理并将其复制到原始纹理之后(它不能完全按照这种方式工作,但结果是相同的)。这回答了关于4数字的问题 - 如果我们使用像(1,4)这样的纹理坐标,则意味着我们从原点移动4 * textureHeight,因此您将重复纹理4次。

我认为现在你应该找到一种方法来为顶点添加UV并稍微尝试一下。尝试设置0,0.1,1,10等......作为纹理坐标并查看它给你的东西。通过这种方式,您应该了解UV的工作原理。

答案 1 :(得分:3)

如果在使用ModelBuilder.createRect方法时有人在更改UV时遇到问题,那么这可能会有所帮助:

...
Model rect = modelBuilder.createRect ...

Matrix3 mat = new Matrix3();
mat.scl(2);
rect.meshes.get(0).transformUV(mat);

instance = new ModelInstance(rect); 
...

这样你将获得2x2纹理重复。 (我浪费了一些时间来寻找这个解决方案。我用它在大地面上重复草纹)

答案 2 :(得分:0)

由于@kolenda的回答是正确的,但我没有找到任何方法来应用它们我必须找到另一种方式。我现在正在使用ModelBuilder.createRect(),我为每一面墙创造了4个相互重叠的面孔。通过使用rects,我可以简单地只绘制可见的rects,只是忽略被另一面墙占据的rects。因此,如果墙壁位于另一面墙的左侧,则不会绘制其左侧面,而其他墙壁则面向右侧。 问题是,当时有许多法案,即使使用截头剔除也可以使FPS下降到20,如果我在我的fiewfrustum中查看许多rects的方向。 @xoppa告诉我,ModelBuilder仅用于调试,我应该使用其他技术,但我不确定是哪一种。因此,如果有人知道这一点,请将其作为答案发布在这里,因为它回答了这个问题(而不是重复模型上的纹理做这个...),它也解决了一些其他问题。 但目前这是我的解决方案,它对我来说足够好,也许它可以帮助其他人。 但正如我所说,我希望看到其他更好的解决方案,因为我还在学习3D编程的一些基础知识。

相关问题