为什么我的纹理在我的 DirectX11 游戏中没有更详细地渲染?

Why are my textures not rendered in greater detail in my DirectX11 game?

我正在尝试使用 DirectX 11 用 C++ 编写一个小型 3D 游戏。这绝对是我第一次尝试仅使用图形来编写游戏 API。我一直在关注网站上的教程 Rastertek.com 直到环境照明教程 9。

为玩家实现移动和碰撞后,我增加了游戏区域的大小。这是我注意到我的问题的时候:我用于游戏区域的墙壁和地板的纹理没有按照我预期的方式渲染。

Wall from close up

Wall from far away

也许你能看出墙上的线条是如何奇怪地被打断的——我希望它们能在更大的距离上正确渲染(就像它们很近)。

不过,对我来说最奇怪的是,线 可以 从很远的地方渲染,但只能 在移动时 场景周围的相机,只在墙壁的某些部分。站着不动再次打破纹理。我尝试在视频中捕捉这种效果,但未能成功地将其显示在我使用 GeForce Experience 拍摄的视频中。

我尝试使用 DirectX 提供的一系列设置,例如光栅器或深度缓冲区描述,我尝试启用和禁用 VSync、抗锯齿和多重采样,我尝试使用各向异性过滤而不是线性过滤。 .. 但是 none 有任何效果。

我不知道去哪里寻找以及接下来要尝试什么。我是否必须接受我的纹理在任何距离下看起来都很糟糕?

您需要为加载的纹理生成 mip 贴图。检查 DDSTextureLoader.h/cpp 和 WICTextureLoader.h/cpp here.

例如,要加载带有 mip 映射的 .dds 图像,您可以使用:

HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice,
                                         ID3D11DeviceContext* d3dContext,
                                         const wchar_t* fileName,
                                         size_t maxsize,
                                         D3D11_USAGE usage,
                                         unsigned int bindFlags,
                                         unsigned int cpuAccessFlags,
                                         unsigned int miscFlags,
                                         bool forceSRGB,
                                         ID3D11Resource** texture,
                                         ID3D11ShaderResourceView** textureView,
                                         DDS_ALPHA_MODE* alphaMode )

用法示例:

HRESULT hr = DirectX::CreateDDSTextureFromFileEx(device, context, path.c_str(), 0, D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, 0, D3D11_RESOURCE_MISC_GENERATE_MIPS, 0, reinterpret_cast<ID3D11Resource**>(&pTexture), &pSRV);
THROW_IF_FAILED(hr);

注意使用的标志 D3D11_BIND_RENDER_TARGETD3D11_RESOURCE_MISC_GENERATE_MIPS