HLSL中的多纹理输入和输出

来源:互联网 发布:初级程序员考试时间 编辑:程序博客网 时间:2024/06/07 23:56
1:分配内存,创建纹理,并和表面挂接

   LPDIRECT3DTEXTURE9      inputTexturePtr(void) {return _inp_tex;}
   LPDIRECT3DTEXTURE9      _out_tex;
   LPDIRECT3DSURFACE9        _surface_out;
   LPDIRECT3DSURFACE9        _oldRenderTarget;

 _data = new T[_num_channels * _width * _height];

   if(FAILED( D3DXCreateTexture(
                                                              xDevice,                // Device
                                                              _width,                 // width
                                                              _height,                // height
                                                              1,                      // mip levels
                                                                D3DUSAGE_RENDERTARGET,  // usage
                                                                  format,                 // format
                                                                  D3DPOOL_DEFAULT,        // memory pool
                                                              &_out_tex)))                
   {

      std::cout << "**ERROR: unable to create output stream texture!/n";
   }
 
   _out_tex->GetSurfaceLevel(0, &_surface_out);

2:将kernel用到的输入和输出纹理放于对应数组中
   _inputNames.push_back(newname);
   _inputArrays.push_back(array);

   _outputArrays.push_back(array);

3:运行是
(1):传入需要的参数
(2):将输入的纹理传入
   for (i=0;i<_inputArrays.size();i++)
   {
      _shader->sendTexture(_inputNames[i], _inputArrays[i]->texturePtr());
   }
(3):将所有的输出作为渲染目标(按顺序自动计入shader的,COLOR0-N)
   for (unsigned long i=0;i<_outputArrays.size();i++)
   {  
      _outputArrays[i]->setRenderTarget(i);

   }

void setRenderTarget(int MRT)   // Stream als Rendertarget festlegen
{
   //--------------------------------------------------------------------------
   // Alter Viewport / altes Rendertarget speicher
    _oldRenderTarget=NULL;
   if (MRT==0) xDevice->GetViewport(&_viewportStored);
   xDevice->GetRenderTarget(MRT,&_oldRenderTarget);   // altes Render Target speichern

   //--------------------------------------------------------------------------

   xDevice->SetRenderTarget(MRT,_surface_out); // neues Render Target festlegen
   xDevice->SetViewport(&_viewportTexture);

(4):执行
   xDevice->BeginScene();
   unsigned int numpasses;
   numpasses = _shader->start();
   // Alle P鋝se rendern
   for (unsigned int pass=0;pass<numpasses;pass++)
   {
      _shader->beginPass(pass);  
   xDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
   xDevice->SetStreamSource( 0, _pVertexBuffer, 0, sizeof(mVertex) );
   xDevice->SetFVF( D3DFVF_MVERTEX );
   xDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
      _shader->endPass();
   }  
   _shader->stop();

   xDevice->EndScene();
(5):恢复渲染目标
   for (unsigned long i=0;i<_outputArrays.size();i++)
   {
      _outputArrays[i]->restoreRenderTarget(i);
   }
void restoreRenderTarget(int MRT)   // altes Rendertarget wiederherstellen (inkl. Viewport)
{
    
   xDevice->SetRenderTarget(MRT,_oldRenderTarget);
   if (MRT==0) xDevice->SetViewport(&_viewportStored);
   SAFE_RELEASE(_oldRenderTarget);
}
原创粉丝点击