cocos2d-x3.16 tiledmap缝隙问题有人遇到么

  • 如果瓦片在同一张纹理上不会出现裂缝问题

image

  • 如果瓦片在不同的纹理上就会会出现裂缝问题

image

折腾过shader精度、怀疑过纹理过滤方式,抱歉问题都不在这里

使用wireframe模式绘制,发现最终的顶点数据的确是分离的

image

仔细观察下shader

gl_Position = CC_MVPMatrix * a_position;

再次确认了MVP矩阵是没有问题,最终问题定位到是a_postion的问题

当出现问题是的顶点数据为:

image

很可能z的不同,在经过矩阵计算后,导致x、y也发生了变化,之前的焦点一直聚集在x、y上,导致忽略了这个问题。

追踪代码z的来源,发现是计算出来的

int zPos = getVertexZForPos(Vec2((float)x, (float)y));
z = (float)zPos;
auto iter = _indicesVertexZOffsets.find(zPos);
if(iter == _indicesVertexZOffsets.end())
{
    _indicesVertexZOffsets[zPos] = 1;
}
else
{
    iter->second++;
}


int FastTMXLayer::getVertexZForPos(const Vec2& pos)
{
    int ret = 0;
    int maxVal = 0;
    if (_useAutomaticVertexZ)
    {
        switch (_layerOrientation)
        {
            case FAST_TMX_ORIENTATION_ISO:
                maxVal = static_cast<int>(_layerSize.width + _layerSize.height);
                ret = static_cast<int>(-(maxVal - (pos.x + pos.y)));
                break;
            case FAST_TMX_ORIENTATION_ORTHO:
                ret = static_cast<int>(-(_layerSize.height-pos.y));
                break;
            case FAST_TMX_ORIENTATION_HEX:
                CCASSERT(0, "TMX Hexa vertexZ not supported");
                break;
            default:
                CCASSERT(0, "TMX invalid value");
                break;
        }
    }
    else
    {
        ret = _vertexZvalue;
    }
    
    return ret;
}

这个z为啥子要这样算,我能猜到是为了解决瓦片堆叠时,保证前后关系,但是具体细节有人知道么?

我现在强制把z设置为同一个值,就不会产生缝隙了,不知道这么做会不会引入新的bug,好坑啊

1赞

我都是自己解析xml,每个格子直接用Sprite,加上自动合批。
只是借助Tiled作为工具 :crazy_face:
主要是官方的类不好用,格子如果包含刚体之类的子节点

是个狠人啊

暂时这么解决问题,虽然很粗暴

我遇见这个问题好几年了 在js引擎里怎么改啊 求大佬斧正

js的可以检查下是否也存在这个问题,我对js不是太了解