等距瓷砖有锯齿状的线条

时间:2016-03-17 18:23:52

标签: directx directx-11

所以我试图渲染一个小的等距瓷砖地图,然后用一块瓷砖开始感受这个东西。但是我遇到了一个问题,如果瓷砖变得太小而且#34; (实际上64x64与纹理的大小完全相同)它会变成锯齿状的线条,即使纹理本身看起来还不错。奇怪的是,如果我在Visual Studio中使用图形调试器,它似乎也是正确的。这是一张图片,以更好地形象化我的意思:

enter image description here

左图是普通窗口内渲染帧的一部分。右侧部分是图形调试工具的捕获帧。如您所见,捕获帧的显示看起来完全正常。如果我按照某个因素缩放此图块,窗口内的正常渲染也会开始变好。有什么想法可能会发生吗?如果有任何帮助,这是原始纹理。

enter image description here

还有一点需要注意:我创建了"纹理"通过在设置相机时在混合器中渲染对象,如下所示:http://flarerpg.org/tutorials/isometric_tiles/(正如我的理解,这应该是在DirectX中渲染它的一种好方法)

编辑:这是我的Sampler Desc。我正在使用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 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-Levels:

Mip-Level 1 and 2

还有新的纹理描述:

        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

对我来说很好,但结果仍然相同:/。

1 个答案:

答案 0 :(得分:0)

@Gnietschow:谢谢你的努力。解决方案很简单,gamedev.net董事会的一些人发现了它:

<强>行情:

  

我有一个类似的问题,结果发现我正在做窗口   在计算窗口大小以适应时,模式错误   backbuffer尺寸等,导致显示模糊的显示   很长一段时间很难注意到

  

我打算说同样的话。你想确保   窗口的客户区域与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/