【发布时间】: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