Java 在模型上重复纹理

Java 在模型上重复纹理,java,opengl,3d,libgdx,Java,Opengl,3d,Libgdx,我正在做一个小游戏,你在迷宫里。迷宫以2D数组组织,描述x和z位置和块类型。因此它是基于平铺的。假设每个区块1 m³。现在我的角色是2m高,迷宫应该是4m高。因此,如果瓷砖上有墙,我会在每个砖上加4个砖。当然,在100*100meter/tile迷宫中,这会对性能产生巨大影响,即使使用视锥台和背面剔除。由于这是我的第一个3D游戏,我想保持它的简单,我不想使用先进的淘汰技术(八叉树或其他:P)。因此,我尝试创建1*4*1块,而不是1*1*1,并将它们作为墙添加到我的世界中。它工作得很好,性能再次完

我正在做一个小游戏,你在迷宫里。迷宫以
2D数组组织
,描述
x和z位置
块类型
。因此它是基于
平铺的
。假设每个区块
1 m³
。现在我的角色是2m高,迷宫应该是4m高。因此,如果瓷砖上有墙,我会在每个砖上加4个砖。当然,在
100*100
meter/tile迷宫中,这会对性能产生巨大影响,即使使用
视锥台和背面剔除
。由于这是我的第一个3D游戏,我想保持它的简单,我不想使用先进的淘汰技术(八叉树或其他:P)。因此,我尝试创建
1*4*1
块,而不是
1*1*1
,并将它们作为
墙添加到我的世界中。它工作得很好,性能再次完美(60 FPS),但是
纹理(64*64px)
被拉长了,看起来真的很难看

因此,我的问题是:

  • 是否可以每米重复一次纹理,而不是 拉伸它
  • 或者我需要修改纹理使其具有4次吗 那么高
  • 还是有更好的解决方案

  • EDIT:我发现
    Texture
    s具有
    TextureWrap
    模式。我将其设置为
    TextureWrap。重复
    ,但我无法在
    纹理上设置
    UV
    s。如果要从
    纹理创建
    精灵
    ,可以轻松将其设置为4,以重复
    纹理
    4次。但是我不能在我的
    模型中添加
    精灵
    ,只能添加
    纹理
    。是否有方法重复这些
    纹理
    s?

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

    如果你考虑立方体的一个平面,它是由4个顶点组成的矩形。如果顶点具有以下UV值:

    (0,0)、(1,0)、(1,1)、(0,1)
    ,则整个纹理将在整个平面上渲染一次(如您现在所做的)

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

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


    编辑评论中的问题:

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

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

    纹理向量组件也可以命名为
    x,y
    ,但为了避免可能与位置数据混淆,有人决定将它们命名为
    u,v
    (在数学中,这样做很常见,即使存储相同类型的数据,也会使某些方程式更易于阅读和理解)。这些向量简称为
    纹理坐标
    UVs

    现在想象你的纹理在你面前,它的一个角在
    (0,0)
    ,另一个角在
    (1,1)
    。取某个三角形的3个顶点,每个顶点取其UV,并在纹理上标记该点。然后,当连接所有3个点时,将得到与渲染相同的三角形

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


    我认为,现在你应该找到一种方法,将UV添加到你的顶点,并尝试一下。尝试设置0、0.1、1、10等。。。作为你的纹理坐标,看看它给了你什么。通过这种方式,你应该对紫外线的工作原理有一些基本的了解。

    因为@kolenda的答案是正确的,但我没有找到任何方法来应用它们,我必须找到另一种方法。我现在使用的是
    ModelBuilder.createRect()
    ,我为每面墙在彼此上方创建了4个矩形。通过使用矩形,我可以只画可见的矩形,只需忽略被另一面墙占据的矩形。因此,如果一堵墙在另一堵墙的左边,我不会画它的左边,而画其他墙的右边。 问题是,当时有很多矩形,即使启用了平截头体剔除功能,如果我朝一个有很多矩形的方向看,FPS也会下降到20。 @xoppa告诉我,
    ModelBuilder
    仅用于调试,我应该使用其他技术,但我不确定是哪种技术。因此,如果有人知道这一点,请将其作为Answare发布在这里,因为它回答了这个问题(而不是在模型上重复纹理,这样做…),它还解决了一些其他问题。 但目前这是我的解决方案,它对我来说已经足够好了,也许它可以帮助其他人。
    但正如我所说,我喜欢看到其他更好的解决方案,因为我仍在学习一些3D编程的基础知识。

    如果有人在使用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纹理重复。
    (我浪费了一些时间寻找这个解决方案。我用它在大的地面上重复草地纹理)

    Thansk很多!我今晚就试试。也许我会发现如何改变它们。你能告诉我为什么把最后两个顶点的第二个参数改为4吗?为什么这会告诉纹理t