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

     有时候,我们需要查看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。

时间: 2024-10-16 19:53:10

Directx11教程(50) 输出depth/stencil buffer的内容的相关文章

Directx11教程(49) stencil的应用-镜面反射

     本教程中,我们利用stencil来实现一个镜面反射效果. 1.首先我们要在D3DClass中增加几个成员变量及函数. ID3D11DepthStencilState* m_depthStencilStateMirror; ID3D11DepthStencilState* m_depthStencilStateReflect; m_depthStencilStateMirror是渲染镜子时候,使用的depth stencil 状态,我们设置stencil 函数为D3D11_COMPARI

Directx11教程(18) D3D11管线(7)

光栅化阶段(RS)之后,将进入PS/OM阶段. 参考外文资料:http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-7/ 大致的管线流程应该是这样的:       RS光栅化的fragment达到64或者32(一个wave或者warp)后,PS调度模块会产生一个新的wave或者warp,并把它们传给PS shader阶段,PS shader得到调度信息后,会从video mem

设置-nutch TopN 50万 depth 10 获取到6万多数据

问题描述 nutch TopN 50万 depth 10 获取到6万多数据 我用nutch1.9搜索阿里巴巴的网站,使用的是bin/crawl 脚本执行的,topN设置的50万,爬行深度设置的10,url过滤只允许阿里巴巴的网站,但是实际搜出来的结果却只有6万多,又人知道大概是什么原因吗困扰了好几天了.....求教 解决方案 网站发现你爬虫,ban了你的请求 解决方案二: 这个没很好办法,模拟浏览器,多换IP,降低频率.

新手求助 定义一个name 如何输入图形类的名字输出相应的类的内容

问题描述 新手求助 定义一个name 如何输入图形类的名字输出相应的类的内容 设计三个图形类:Circle(圆).Rectangle(矩形).Triangle(三角形): 1.Cirlce类基本信息:圆心坐标.半径: Rectangle类基本信息:长.宽: Triangle类基本信息:三个顶点坐标: 其中:成员变量为private属性,成员函数为public属性: 2.每个图形类有计算图形的面积GetArea(),显示图形的基本信息函数Show(): 现在我的代码不能实现 输入名字circle

python-Python编码问题,cgi脚本输出BeautifulSoup处理的中文内容(decode处理)出错

问题描述 Python编码问题,cgi脚本输出BeautifulSoup处理的中文内容(decode处理)出错 最近写一个程序,想要先用BeautifulSoup处理一个html页面,然后再输出一下到我的一个python写的cgi页面上,因为一些中文字符都是X**的格式,网上查了说BeautifulSoup输出的是unicode字符.然后需要把字节类型的转为字符输出.在ide中是可以正常转换的. 但是使用cgi脚本在浏览器中浏览时就会出错,报一个UnicodeEncodeError: 'gbk'

php文件调用一个类或方法,生成一个log文件,log文件上输出调用的时间和内容,该怎么写

问题描述 php文件调用一个类或方法,生成一个log文件,log文件上输出调用的时间和内容,该怎么写 php文件调用一个类或方法,生成一个log文件,log文件上输出调用的时间和内容,该怎么写 解决方案 /** 自定义日志 @param string $type @param string $content @return bool */ function mylog($type="",$content=""){ if(!$content || !$type){ r

《剑网3》今日开放50级到70级游戏内容

10月22日上午消息,金山软件宣布<剑侠情缘网络版叁>(以下简称<剑网3>)今日将进行公测后最大规模更新,届时会开放50级到70级所有游戏内容.同时,金山方面透露随着62组服务器开始收费,<剑网3>已进入盈利期. 据悉,此次<剑网3>开放50级到70级游戏内容,包括7大场景地图.多个高级副本和阵营系统等大量全新内容.金山方面表示,开放大量新内容有助于稳定用户,这对进入收费阶段的<剑网3>来说尤其重要. 数据显示,<剑网3>目前共开放6

Directx11教程(66) D3D11屏幕文本输出(1)

     在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所有问题,但在D3D11中个,这个变得超级麻烦,因为微软移除了Font接口,要在屏幕上输出文本,用户需要做很多事情. 通常我们可以用以下的方法来输出文本信息: (1)用纹理贴图的方法,把所有的字体存储在一张纹理上,再做一个字体查询表,对应纹理的相应位置,可以用2D渲染的方式,把文本染出来,但这种方法不是很灵活,英文还好说,字母字符就那么多,但对于汉字就麻烦了,另外字体

Directx11教程(5) 画一个简单的三角形(1)

      在本篇教程中,我们将通过D3D11画一个简单的三角形.在D3D11中,GPU的渲染主要通过shader来操作(当然还有一些操作是由GPU固定管线完成,比如光栅化操作),最常用的shader操作是顶点shader(vertex shader)和像素shader(pixel shader).其实shader就是在GPU中执行的代码,这些代码被driver编译成硬件依赖的机器码,最终被GPU中shader pipe执行,从而完成3D渲染.D3D11中shader是用一种类C的语言HLSL编