首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateDepthStencilView()失败

CreateDepthStencilView()失败
EN

Stack Overflow用户
提问于 2019-12-01 22:50:41
回答 1查看 508关注 0票数 1

我正尝试在我的DirectX应用程序中创建阴影贴图,但目前在创建深度模具视图时遇到了问题。CreateDepthStencilView()将我的ID3D11DepthStencilView*变量保留为空。

我设法从HRESULT得到的唯一错误是"The parameter is incorrect"。问题似乎出在D3D11_TEXTURE2D_DESC和ID3D11_DEPTH_STENCIL_VIEW_DESC上,因为当我将它们分别替换为深度纹理和nullptr时,它就可以工作了。然后,我将工作函数参数替换为阴影贴图值,一次一个,但两者都不起作用。

我还尝试了按照this post中的建议设置shadowDsv.Flags = 0,但得到了相同的结果。

我正在学习this教程,代码和他的是一样的(除了我的是DX11而不是DX10),我不确定问题是什么。这是我的代码:

Application.h

代码语言:javascript
复制
    ID3D11Texture2D*        _shadowMapTexture;
    ID3D11DepthStencilView* _shadowMapStencil;
    ID3D11ShaderResourceView* _shadowMapRV;

Application.cpp

代码语言:javascript
复制
    //Set up shadow map
    D3D11_TEXTURE2D_DESC shadowTexDesc;
    shadowTexDesc.Width = _WindowWidth;
    shadowTexDesc.Height = _WindowHeight;
    shadowTexDesc.MipLevels = 1;
    shadowTexDesc.ArraySize = 1;
    shadowTexDesc.Format = DXGI_FORMAT_R32_TYPELESS;
    shadowTexDesc.SampleDesc.Count = 1;
    shadowTexDesc.SampleDesc.Quality = 0;
    shadowTexDesc.Usage = D3D11_USAGE_DEFAULT;
    shadowTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE;
    shadowTexDesc.CPUAccessFlags = 0;
    shadowTexDesc.MiscFlags = 0;

    D3D11_DEPTH_STENCIL_VIEW_DESC shadowDsv;
    shadowDsv.Format = shadowTexDesc.Format;
    shadowDsv.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
    shadowDsv.Texture2D.MipSlice = 0;

    D3D11_SHADER_RESOURCE_VIEW_DESC shadowSrv;
    shadowSrv.Format = DXGI_FORMAT_R32_FLOAT;
    shadowSrv.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    shadowSrv.Texture2D.MipLevels = shadowTexDesc.MipLevels;
    shadowSrv.Texture2D.MostDetailedMip = 0;

    hr = _pd3dDevice->CreateTexture2D(&shadowTexDesc, nullptr, &_shadowMapTexture);
    hr = _pd3dDevice->CreateDepthStencilView(_shadowMapTexture, &shadowDsv, &_shadowMapStencil);
    hr = _pd3dDevice->CreateShaderResourceView(_shadowMapTexture, &shadowSrv, &_shadowMapRV);

编辑:这是调用CreateDepthStencilView()时的控制台输出。谢谢你到目前为止的帮助。

代码语言:javascript
复制
D3D11 ERROR: ID3D11Device::CreateDepthStencilView: The Format (0x27, R32_TYPELESS) is invalid, when creating a View; it is not a fully qualified Format castable from the Format of the Resource (0x27, R32_TYPELESS). [ STATE_CREATION ERROR #144: CREATEDEPTHSTENCILVIEW_INVALIDFORMAT]
D3D11 ERROR: ID3D11Device::CreateDepthStencilView: The format (0x27, R32_TYPELESS) cannot be used with a DepthStencil view. [ STATE_CREATION ERROR #144: CREATEDEPTHSTENCILVIEW_INVALIDFORMAT]
D3D11 ERROR: ID3D11Device::CreateDepthStencilView: There were unrecognized flags specified in the DepthStencilView Flags field. The flags value was 0xcccccccc, while the valid flags are limited to 0x3. [ STATE_CREATION ERROR #2097153: CREATEDEPTHSTENCILVIEW_INVALIDFLAGS]
Exception thrown at 0x76D235D2 in DX11 Framework.exe: Microsoft C++ exception: _com_error at memory location 0x00B3EE98.
D3D11 ERROR: ID3D11Device::CreateDepthStencilView: Returning E_INVALIDARG, meaning invalid parameters were passed. [ STATE_CREATION ERROR #148: CREATEDEPTHSTENCILVIEW_INVALIDARG_RETURN]

似乎R32_TYPELESS格式是导致错误的原因。看完文档后,我发现只有几种允许的格式。有没有人推荐阴影贴图的特定格式?我以前没有这样做过,所以我不确定下面的任何一个是不是一个很好的替代品:

代码语言:javascript
复制
DXGI_FORMAT_D16_UNORM
DXGI_FORMAT_D24_UNORM_S8_UINT
DXGI_FORMAT_D32_FLOAT
DXGI_FORMAT_D32_FLOAT_S8X24_UINT
DXGI_FORMAT_UNKNOWN

再次感谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-02 00:18:08

对于其他有这个问题的人:我的解决方法是将D3D11_DEPTH_STENCIL_VIEW_DESC格式设置为DXGI_FORMAT_D32_FLOAT,并且D3D11_DEPTH_STENCIL_VIEW_DESC标志等于0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59126663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档