1

我正在使用 D3DXSPRITE 方法将我的地图图块绘制到屏幕上,我刚刚添加了一个缩放功能,当您按住向上箭头时会放大,但注意到您现在可以看到图块之间的间隙,这是一些屏幕截图

每个图块的正常尺寸 (32x32)

在此处输入图像描述

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

在此处输入图像描述

缩小(甚至更糟!)

在此处输入图像描述

这是我翻译和缩放世界的代码片段。

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();
  }
4

5 回答 5

4

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

于 2011-05-28T16:55:21.837 回答
2

这就是放大和缩小的问题。您的纹理应该有不可见的边界,其中填充了部分相邻纹理。然后放大和缩小过滤器将使用该边框来计算边缘像素的颜色,而不是默认(白色)颜色。

我认同。

于 2011-05-28T16:42:54.623 回答
1

我在纹理映射方面也遇到了类似的问题。对我有用的是更改采样器状态描述中的纹理地址模式;纹理地址模式用于控制 direct3d 对 ([0.0f, 1.0f]) 范围之外的纹理坐标所做的操作:我将 ADDRESS_U、ADDRESS_V、ADDRESS_W 成员更改为 D3D11_TEXTURE_ADDRESS_CLAMP,它基本上钳制了所有超出范围的值纹理坐标进入 [0.0f, 1.0f] 范围。

于 2014-02-14T22:35:17.200 回答
1

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

来自 Unity 官方网站的 pixel-perfect-2d

加上 我自己的经验,我发现如果精灵 PPI 是 72(例如),你应该尝试为该图像使用更多 PPI(可能是 96 或更多)。它实际上使精灵更密集,并且没有空间留白出现。

于 2016-06-18T14:42:00.077 回答
0

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

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

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

您可以只索引构成地形的可见顶点,而不是绘制不同的四边形,而是使用纹理平铺技术在上面绘制不同的东西。我相信这不会给你带来丑陋的接缝,因为在那种情况下,技术上没有接缝。

于 2011-05-28T16:26:41.470 回答