- 如果瓦片在同一张纹理上不会出现裂缝问题
- 如果瓦片在不同的纹理上就会会出现裂缝问题
折腾过shader精度、怀疑过纹理过滤方式,抱歉问题都不在这里
使用wireframe模式绘制,发现最终的顶点数据的确是分离的
仔细观察下shader
gl_Position = CC_MVPMatrix * a_position;
再次确认了MVP矩阵是没有问题,最终问题定位到是a_postion
的问题
当出现问题是的顶点数据为:
很可能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,好坑啊