Directx11教程(50) 输出depth/stencil buffer的内容

简介: 有时候,我们需要查看depth/stencil buffer的内容,比如上一章中,我们要查看stencil buffer,看看我们设置的stencil值是否起作用,这时就要输出depth/stencil buffer内容,但这些内容在gpu中,我们并不能直接查看,需要通过纹理copy,资源映射的方式,拷贝到system memory中才可以直接查看。

     有时候,我们需要查看depth/stencil buffer的内容,比如上一章中,我们要查看stencil buffer,看看我们设置的stencil值是否起作用,这时就要输出depth/stencil buffer内容,但这些内容在gpu中,我们并不能直接查看,需要通过纹理copy,资源映射的方式,拷贝到system memory中才可以直接查看。

     下面是输出depth/stencil buffer的代码,最终结果被输出到一个csv文件中,便于用excel 查看。该函数我加在了D3DClass类中:

    bool D3DClass::SaveDepthStencilBuffer()
        {
           D3D11_TEXTURE2D_DESC dsDesc, destTexDesc;
           ID3D11Texture2D*    destTex;
            HRESULT result;

           if(m_depthStencilBuffer)
               {
               m_depthStencilBuffer->GetDesc(&dsDesc);
              // 使目的和源的描述一致
                memcpy(&destTexDesc,&dsDesc,sizeof(destTexDesc));
               destTexDesc.Usage            = D3D11_USAGE_STAGING;
               destTexDesc.BindFlags        = 0;
               destTexDesc.CPUAccessFlags    = D3D11_CPU_ACCESS_READ;   
               result = m_device->CreateTexture2D(&destTexDesc, 0, &destTex);
               if(FAILED(result))
                   {
                   HR(result);
                   return false;
                   }

               //depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
              
               m_deviceContext->CopyResource(destTex, m_depthStencilBuffer);

               D3D11_MAPPED_SUBRESOURCE mappedResource;

               result = m_deviceContext->Map(destTex, 0, D3D11_MAP_READ, 0, &mappedResource);
               if(FAILED(result))
                   {
                   return false;
                   }

               FILE *fp = fopen("depth-stencil.csv","w");

               const UINT WIDTH = destTexDesc.Width ;
               const UINT HEIGHT = destTexDesc.Height;
               //映射为32位的dword
               DWORD* pTexels = (DWORD*)mappedResource.pData;
               for( UINT row = 0; row < HEIGHT; row++ )
                   {
                   UINT rowStart = row * mappedResource.RowPitch/sizeof(pTexels[0]);
                   for( UINT col = 0; col < WIDTH; col++ )
                       {
                       fprintf(fp,"%08x,",pTexels[rowStart + col]);
                       }
                   fprintf(fp,"\n");
                   }

               fclose(fp);
               m_deviceContext->Unmap(destTex, 0);
               }
               return true;
       
        }

在GraphicClass类的Render函数中,调用该函数,我们就可以得到depth/stencil buffer的内容了。

本文参考了http://www.cppblog.com/GameAcademe/articles/DirectX11.html这篇blog。

相关文章
Word转PDF 并转成base64(亲测可用)
Word转PDF 并转成base64(亲测可用)
429 0
|
计算机视觉 C#
知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?
一直以来,我使用的方法都是shiqiyu在opencvchina上面提供的引入directshow,并且采用cvvimage和cameraDs的方法。这个方法虽然在xp/win7/win8下面都能够成果使用,但是一直以来我都没有动机去深入看一看这个方法。
1275 0
|
6月前
|
监控 Serverless
函数计算操作报错合集之SEG插件一直预览报错,是什么原因
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
存储 C语言 索引
ENVI IDL:熟悉IDL语法+输出多幅TIFF影像的MAX文件和MEAN文件
ENVI IDL:熟悉IDL语法+输出多幅TIFF影像的MAX文件和MEAN文件
309 0
|
Windows
3dMax建模笔记(一):介绍3dMax和创建第一个模型Hello world
三维模型,虽然淘宝上一抓一大把,但是三维开发人员最好还是具备一定基础的建模能力。本文用hello world模型描述基本的3dMax建模流程。
3dMax建模笔记(一):介绍3dMax和创建第一个模型Hello world
|
iOS开发
iOS 中block结构的简单用法(二)
iOS 中block结构的简单用法
150 0
iOS 中block结构的简单用法(二)
|
编译器 API iOS开发
iOS 中block结构的简单用法(一)
iOS 中block结构的简单用法
131 0
iOS 中block结构的简单用法(一)