基于2D平铺的游戏,当我用相机放大时,显示平铺精灵之间的间隙?

时间:2011-05-28 16:16:19

标签: c++ direct3d direct3d9

我使用D3DXSPRITE方法将我的地图图块绘制到屏幕上,我只是添加了一个缩放功能,当你按住向上箭头时它会放大,但是注意到你现在可以看到图块之间的间隙,这里是一些屏幕截图< / p> 每块瓷砖

正常尺寸(32x32)

enter image description here

放大(你可以看到瓷砖之间的白色间隙)

enter image description here

缩小(甚至最差!)

enter image description here

这是我翻译的代码片段,并用。扩展世界。

D3DXMATRIX matScale, matPos;

D3DXMatrixScaling(&matScale, zoom_, zoom_, 0.0f);
D3DXMatrixTranslation(&matPos, xpos_, ypos_, 0.0f);

device_->SetTransform(D3DTS_WORLD, &(matPos * matScale));

这是我对地图的绘制,(瓷砖是瓷砖矢量的矢量..我还没有剔除)

LayerInfo *p_linfo = NULL;
  RECT rect = {0};
  D3DXVECTOR3 pos;
  pos.x = 0.0f;
  pos.y = 0.0f;
  pos.z = 0.0f;

  for (short y = 0; 
    y < BottomTile(); ++y)
  {
    for (short x = 0; 
          x < RightTile(); ++x)
    {
      for (int i = 0; i < TILE_LAYER_COUNT; ++i)
      {
        p_linfo = tile_grid_[y][x].Layer(i);

        if (p_linfo->Visible())
        {
          p_linfo->GetTextureRect(&rect);

          sprite_batch->Draw(
            p_engine_->GetTexture(p_linfo->texture_id), 
            &rect, NULL, &pos, 0xFFFFFFFF);
        }
      }
      pos.x += p_engine_->TileWidth();
    }
    pos.x = 0;
    pos.y += p_engine_->TileHeight();
  }

5 个答案:

答案 0 :(得分:4)

您的纹理索引错误。 0,0,32,32不是正确的值 - 它应该是0,0,31,31。对于256像素的纹理图集的从零开始的索引将产生0到255的值,而不是0到256,并且32x32纹理应该产生0,0,31,31。在这种情况下,不正确像素的颜色取决于沿右侧和底部的下一个纹理的颜色。

答案 1 :(得分:0)

欢迎来到浮点世界。由于使用浮点数的缺陷,存在这些差距。

您可以通过在进行浮点数学时非常小心来改善这种情况,但除非您从地形中制作出一个完整的网格,否则这些接缝将会存在。

给定视图和投影矩阵的光栅化器以及顶点位置稍微偏离。你可能会改进,但我不知道你会有多成功。

您可以仅绘制构成地形的可见顶点,而不是绘制不同的四边形,而是使用纹理平铺技术在其上绘制不同的内容。我相信这不会让你变得难看,因为在那种情况下,技术上并不是一个。

答案 2 :(得分:0)

这是放大和缩小的问题。你的纹理应该有不可见的边框填充相邻纹理的一部分。然后放大和缩小滤镜将使用该边框来计算边缘像素的颜色而不是默认(白色)颜色。

我想是的。

答案 3 :(得分:0)

我的纹理贴图也有类似的问题。对我有用的是改变采样器状态描述中的纹理地址模式;纹理地址模式用于控制direct3d对([0.0f,1.0f])范围之外的纹理坐标所做的操作:我将ADDRESS_U,ADDRESS_V,ADDRESS_W成员更改为D3D11_TEXTURE_ADDRESS_CLAMP,这基本上会限制所有超出范围的值。纹理坐标为[0.0f,1.0f]范围。

答案 4 :(得分:0)

经过很长时间搜索和测试人员解决方案后,我发现这条规则是我读过的最完整的规则。

pixel-perfect-2d from Official Unity WebSite

加上 以我自己的经验我发现如果精灵PPI为72(例如),你应该尝试为该图像使用更多的PPI(96或者或者它实际上使精灵变得更加密集,并且没有空白来显示白色空白。