我们有一个纹理图集,其中不包含方形子图层,我们希望将其用作图块纹理以填充我们在游戏中的基础。我们需要使用非方形瓷砖,因为我们的2D游戏中具有特定的水平形状,并且需要为不同的移动屏幕提供许多图形包。因此,将地面纹理的大小与2的幂相关联是不方便的。
在谷歌中找不到任何有效的着色器或解释。任何帮助将非常感谢。
答案 0 :(得分:1)
有关如何在着色器中使用这些数据的一些信息会很好。
我通常更喜欢在着色器中获取纹理坐标,就好像没有地图集一样。然后在旁边我添加一个“框架”,指出子纹理在实际纹理上的位置。然后必须在片段着色器中手动完成重复。 (顶点着色器不合适,因为它只会拉伸纹理)。
所以基本上你需要将输入坐标修改为[0,1]
的范围并使用它们。因此,如果坐标是12.12
,则需要将其用作.12
或x=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;
...
}