如何在opengl es 2.0中重复非POT子纹理

时间:2016-01-30 14:24:25

标签: opengl-es-2.0 tiles

我们有一个纹理图集,其中不包含方形子图层,我们希望将其用作图块纹理以填充我们在游戏中的基础。我们需要使用非方形瓷砖,因为我们的2D游戏中具有特定的水平形状,并且需要为不同的移动屏幕提供许多图形包。因此,将地面纹理的大小与2的幂相关联是不方便的。

在谷歌中找不到任何有效的着色器或解释。任何帮助将非常感谢。

1 个答案:

答案 0 :(得分:1)

有关如何在着色器中使用这些数据的一些信息会很好。

我通常更喜欢在着色器中获取纹理坐标,就好像没有地图集一样。然后在旁边我添加一个“框架”,指出子纹理在实际纹理上的位置。然后必须在片段着色器中手动完成重复。 (顶点着色器不合适,因为它只会拉伸纹理)。

所以基本上你需要将输入坐标修改为[0,1]的范围并使用它们。因此,如果坐标是12.12,则需要将其用作.12x=x-(1/x)用于肯定,x=x-((1/x)-1)用于否定。

看看这段代码(只是一个概念,我没有测试过):

    uniform lowp vec4 subtextureRelativeCoordinates;// Represents a part of the texture where the sub texture lies. Origin is .xy, size is .zw
    varying highp vTextureCoordinates;  // actual texture coordinates which you would use if no atlasing was present

    main() {
        // resample texture coordinates to be in range [0,1] as if they need to repeat
        int xCount = (int)(1.0/vTextureCoordinates.x); // might also be negative
        int yCount = (int)(1.0/vTextureCoordinates.y); // might also be negative
        // a negative coordinates will always have +1. For instance -1.5 will return xCount=-1 but the result must be -1.5 - (-1-1) = .5
        xCount += vTextureCoordinates.x<.0?-1:0;
        yCount += vTextureCoordinates.y<.0?-1:0;
        vTextureCoordinates -= vec2(xCount, yCount);

        lowp vec2 textureCoordinate = textureCoordinates*subtextureRelativeCoordinates.zw + subtextureRelativeCoordinates.xy;
        ...
    }