【问题标题】:Isometric tile has jagged lines等距瓷砖有锯齿线
【发布时间】:2016-03-17 18:23:51
【问题描述】:

所以我正在尝试渲染一个小的等距平铺地图,然后从一个平铺开始,感受一下。但是我遇到了一个问题,如果瓷砖“太小”(实际上是 64x64,与纹理的大小完全相同),它会出现锯齿状线条,即使它在纹理本身上看起来还不错。奇怪的是,如果我在 Visual Studio 中使用图形调试器,它似乎也是正确的。这是一张图片,可以更好地理解我的意思:

左图是正常窗口内渲染帧的一部分。右边部分是图形调试工具的捕获帧。如您所见,捕获帧的显示看起来完全正常。如果我将这个图块放大某个因子,窗口内的正常渲染也开始看起来不错。任何想法为什么会发生这种情况?如果有帮助的话,这里是原始纹理。

进一步说明:我通过在搅拌器中渲染对象来创建“纹理”,同时像这样设置相机:http://flarerpg.org/tutorials/isometric_tiles/(据我了解,这应该是在 DirectX 中渲染它的一种好方法)

编辑:这是我的采样器描述。我正在使用 DirectXTK (https://github.com/Microsoft/DirectXTK) 提供的CreateDDSTextureFromFile 方法创建纹理。

CreateDDSTextureFromFile(gfx->GetGraphicsDevice()->GetDevice(), L"resources/house_tile.DDS", nullptr, shaderResource.GetAddressOf())

g_defaultSamplerDesc.Filter = D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR;
g_defaultSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
g_defaultSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
g_defaultSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
g_defaultSamplerDesc.MipLODBias = 0.0f;
g_defaultSamplerDesc.MaxAnisotropy = 1;
g_defaultSamplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
g_defaultSamplerDesc.BorderColor[0] = 0;
g_defaultSamplerDesc.BorderColor[1] = 0;
g_defaultSamplerDesc.BorderColor[2] = 0;
g_defaultSamplerDesc.BorderColor[3] = 0;
g_defaultSamplerDesc.MinLOD = 0;
g_defaultSamplerDesc.MaxLOD = D3D11_FLOAT32_MAX;

编辑 2: 我检查了 .dds 文件,只有 1 个 Mip-Level。这里也是 DirectXTK 方法使用的纹理描述。对我来说似乎很好:

        Width   64  unsigned int
        Height  64  unsigned int
        MipLevels   1   unsigned int
        ArraySize   1   unsigned int
        Format  DXGI_FORMAT_B8G8R8A8_UNORM (87) DXGI_FORMAT
+       SampleDesc  {Count=1 Quality=0 }    DXGI_SAMPLE_DESC
        Usage   D3D11_USAGE_DEFAULT (0) D3D11_USAGE
        BindFlags   8   unsigned int
        CPUAccessFlags  0   unsigned int
        MiscFlags   0   unsigned int

而这里值得一提的还有我的 Vertex-Setup:

Vertex v[] =
{
    Vertex(-32.f, -32.f, 1.0f, 0.0f, 1.0f),
    Vertex(-32.f, 32.f, 1.0f, 0.0f, 0.0f),
    Vertex(32.0f, -32.f, 1.0f, 1.0f, 1.0f),
    Vertex(32.0f, 32.f, 1.0f, 1.0f, 0.0f)
};

应该创建 64x64 大小的四边形。

编辑 3: 我尝试生成 Mip-Maps 以查看它是否有效,但它没有。以下是 7 个可用 Mip 级别中的两个:

还有新的纹理描述:

        Width   64  unsigned int
        Height  64  unsigned int
        MipLevels   7   unsigned int
        ArraySize   1   unsigned int
        Format  DXGI_FORMAT_B8G8R8A8_UNORM (87) DXGI_FORMAT
+       SampleDesc  {Count=1 Quality=0 }    DXGI_SAMPLE_DESC
        Usage   D3D11_USAGE_DEFAULT (0) D3D11_USAGE
        BindFlags   8   unsigned int
        CPUAccessFlags  0   unsigned int
        MiscFlags   0   unsigned int

对我来说看起来不错,但结果还是一样:/。

【问题讨论】:

  • 你使用 mipmapping 和无点过滤吗?对我来说,这似乎是一个抽样问题。
  • 我没有使用 Mip-Mapping。无法确定,但我一回家就会检查。谢谢!
  • @Gnietschow 我添加了我的采样器描述以及我如何创建着色器资源视图。你觉得那里有什么问题吗?
  • 对我来说采样器看起来不错。不幸的是,我不熟悉 DirectXTK,它是否会在加载时为您的纹理生成 mipmap?如果没有,您的 dds 是否包含 mipmap?
  • @Gnietschow :如果需要,它可以创建 mipmap,但它不适合我。我检查了我的 .dds 文件,它只包含 1 个 Mip-Level。我还检查了 DirectXTK 正在为 ShaderResourceView 创建和使用的纹理的纹理描述。见上文。

标签: directx directx-11


【解决方案1】:

@Gnietschow:感谢您的努力。解决方案很简单,被gamedev.net 板的一些人发现:

引述:

我曾经遇到过类似的问题,结果我正在做窗口化 模式在计算窗口大小以适应 后缓冲区大小等,导致显示模糊不清 很长一段时间都很难注意到


我也想说同样的话。您要确保 窗口的客户区与 D3D 后备缓冲区大小相同, 否则,当后台缓冲区 blit 时,你会得到非常糟糕的缩放 到窗户上。你可以使用这样的东西:

RECT windowRect;
SetRect(&windowRect, 0, 0, backBufferWidth, backBufferHeight);

BOOL isMenu = (GetMenu(hwnd) != nullptr);
if(AdjustWindowRectEx(&windowRect, style, isMenu, exStyle) == 0)
    DoErrorHandling();

if(SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, windowRect.right - windowRect.left, windowRect.bottom - windowRect.top, SWP_NOMOVE) == 0)
    DoErrorHandling();

来源:http://www.gamedev.net/topic/677243-iso-dimetric-tile-texture-has-jagged-edges/

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多