我正在尝试使用DirectX 11用C++编写一个小型3D游戏。这绝对是我第一次尝试只使用图形API编写游戏。我一直在关注Rastertek.com网站上关于环境照明的教程,直到教程9。
在为玩家实施移动和碰撞后,我增加了游戏区域的大小。就在这时,我注意到了我的问题:我在游戏区的墙壁和地板上使用的纹理没有按照我预期的方式渲染。
来自近距离的墙
来自远方的墙
也许你可以看出墙上的线条是如何奇怪地断裂的——我本以为它们能在更大的距离上正确渲染(就像它们是近距离的(。
不过,对我来说最奇怪的是,的线条可以从远处渲染,但只能在在场景周围移动相机时渲染,并且只能在墙的某些部分上渲染。站着不动又打破了质感。我试着在视频中捕捉这种效果,但没有成功地让它出现在我使用GeForce Experience拍摄的视频中。
我试着玩DirectX提供的一系列设置,比如光栅化器或深度缓冲区描述,我试着启用和禁用VSync、抗锯齿和多采样,我试过使用各向异性过滤而不是线性过滤。。。但没有任何效果。
我不知道该去哪里看,下一步该做什么。我只是要接受我的纹理在任何距离上都会看起来很糟糕吗?
您需要为加载的纹理生成mip贴图。请在此处查看DDSTextureLoader.h/cpp和WICTextureLoadr.h/cpp。
例如,要加载带有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_TARGET
和D3D11_RESOURCE_MISC_GENERATE_MIPS
。