为什么在我的DirectX11游戏中没有更详细地渲染我的纹理? 我尝试用C++编写一个小型3D游戏,使用DirectX 11。这绝对是我第一次尝试只用图形API编写游戏。我一直遵循网站上的教程,直到教程9环境照明

为什么在我的DirectX11游戏中没有更详细地渲染我的纹理? 我尝试用C++编写一个小型3D游戏,使用DirectX 11。这绝对是我第一次尝试只用图形API编写游戏。我一直遵循网站上的教程,直到教程9环境照明,c++,directx-11,game-development,C++,Directx 11,Game Development,在为玩家实施移动和碰撞后,我增加了游戏区域的大小。这时我注意到了我的问题:我正在使用的用于游戏区墙壁和地板的纹理没有按照我预期的方式渲染 也许你可以告诉我墙上的线条是如何奇怪地分开的——我希望它们能够在更大的距离上正确地渲染(就像它们是近距离的一样) 不过,对我来说最奇怪的是,线条可以从很远的地方渲染,但只有在移动摄影机时才能渲染,而且只能在墙的某些部分渲染。静止不动会再次破坏纹理。我尝试在视频中捕捉这种效果,但在GeForce体验中拍摄的视频中,我没有成功地将其显示出来 我尝试使用Dire

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

也许你可以告诉我墙上的线条是如何奇怪地分开的——我希望它们能够在更大的距离上正确地渲染(就像它们是近距离的一样)

不过,对我来说最奇怪的是,线条可以从很远的地方渲染,但只有在移动摄影机时才能渲染,而且只能在墙的某些部分渲染。静止不动会再次破坏纹理。我尝试在视频中捕捉这种效果,但在GeForce体验中拍摄的视频中,我没有成功地将其显示出来

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


我不知道该去哪里看,下一步该做什么。我是否必须接受我的纹理在任何距离都会看起来很糟糕?

您需要为加载的纹理生成mip贴图。检查DDSTureLoader.h/cpp和WICTextureLoader.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);
HRESULT hr=DirectX::CreateDDSSTextureFromFileEx(设备、上下文、路径c_str()、0、D3D11_用法_默认值、D3D11_绑定_着色器_资源| D3D11_绑定_渲染_目标、0、D3D11_资源_杂项_生成_MIPS、0、重新解释_cast(&pTexture)和pSRV);
如果失败则抛出(hr);

请注意使用的标志
D3D11\u BIND\u RENDER\u TARGET
D3D11\u RESOURCE\u MISC\u GENERATE\u MIPS

非常感谢您的回复,您让我走上了正确的道路!保存dds纹理时只需选中“生成mip贴图”选项即可立即修复问题,即使在很远的地方,我的纹理现在也能正确显示。我尝试按您所述加载它们,但当我将D3D设备的输入元素描述格式设置为我在(BC7)中导出的格式时,收到错误消息
元素[0]的格式(BC7\u UNORM)无法与输入汇编程序一起使用。也许是另一个问题的主题。。。将此标记为已回答,因为它现在正按预期工作。@Ploinky显然该格式不能绑定为渲染目标,如果您希望以这种方式生成mip贴图,则需要该格式。我很高兴你让它工作了。