CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  游戏开发

在用DirectShow播放视频时怎样应用ALPHA混合?

楼主0000000009()2004-12-02 00:00:39 在 专题开发/技术/项目 / 游戏开发 提问

 
   
  主要是要实现让某种颜色变的透明。  
   
  我的视频播放的方法是使用DX9SDK中的Texture3D例子  
   
   
  HRESULT   InitDShowTextureRenderer()  
  {  
          HRESULT   hr   =   S_OK;  
          CComPtr<IBaseFilter>         pFSrc;                     //   Source   Filter  
          CComPtr<IPin>                       pFSrcPinOut;         //   Source   Filter   Output   Pin        
          CTextureRenderer                 *pCTR=0;                 //   DirectShow   Texture   renderer  
           
          //   Create   the   filter   graph  
          if   (FAILED(g_pGB.CoCreateInstance(CLSID_FilterGraph,   NULL,   CLSCTX_INPROC)))  
                return   E_FAIL;  
   
  #ifdef   REGISTER_FILTERGRAPH  
          //   Register   the   graph   in   the   Running   Object   Table   (for   debug   purposes)  
          AddToROT(g_pGB);  
  #endif  
           
          //   Create   the   Texture   Renderer   object  
          pCTR   =   new   CTextureRenderer(NULL,   &hr);  
          if   (FAILED(hr)   ||   !pCTR)  
          {  
                  Msg(TEXT("Could   not   create   texture   renderer   object!     hr=0x%x"),   hr);  
                  return   E_FAIL;  
          }  
         
          //   Get   a   pointer   to   the   IBaseFilter   on   the   TextureRenderer,   add   it   to   graph  
          g_pRenderer   =   pCTR;  
          if   (FAILED(hr   =   g_pGB->AddFilter(g_pRenderer,   L"TEXTURERENDERER")))  
          {  
                  Msg(TEXT("Could   not   add   renderer   filter   to   graph!     hr=0x%x"),   hr);  
                  return   hr;  
          }  
           
          //   Determine   the   file   to   load   based   on   DirectX   Media   path   (from   SDK)  
          //   Use   a   helper   function   included   in   DXUtils.cpp  
          TCHAR   strFileName[MAX_PATH];  
          WCHAR   wFileName[MAX_PATH];  
   
          lstrcpyn(   strFileName,   DXUtil_GetDXSDKMediaPath(),   MAX_PATH-1   );  
          lstrcat(   strFileName,   SOURCE_FILE   );  
          strFileName[MAX_PATH-1]   =   0;     //   NULL-terminate  
          wFileName[MAX_PATH-1]   =   0;         //   NULL-terminate  
   
          USES_CONVERSION;  
          wcsncpy(wFileName,   T2W(strFileName),   NUMELMS(wFileName));  
   
   
   
          //   Add   the   source   filter   to   the   graph.  
          hr   =   g_pGB->AddSourceFilter   (wFileName,   L"SOURCE",   &pFSrc);  
           
          //   If   the   media   file   was   not   found,   inform   the   user.  
          if   (hr   ==   VFW_E_NOT_FOUND)  
          {  
                  Msg(TEXT("Could   not   add   source   filter   to   graph!     (hr==VFW_E_NOT_FOUND)\r\n\r\n")  
                          TEXT("This   sample   reads   a   media   file   from   the   DirectX   SDK's   media   path.\r\n")  
                          TEXT("Please   install   the   DirectX   9   SDK   on   this   machine."));  
                  return   hr;  
          }  
          else   if(FAILED(hr))  
          {  
                  Msg(TEXT("Could   not   add   source   filter   to   graph!     hr=0x%x"),   hr);  
                  return   hr;  
          }  
   
          if   (FAILED(hr   =   pFSrc->FindPin(L"Output",   &pFSrcPinOut)))  
          {  
                  Msg(TEXT("Could   not   find   output   pin!     hr=0x%x"),   hr);  
                  return   hr;  
          }  
   
  #ifdef   NO_AUDIO_RENDERER  
   
          //   If   no   audio   component   is   desired,   directly   connect   the   two   video   pins  
          //   instead   of   allowing   the   Filter   Graph   Manager   to   render   all   pins.  
   
          CComPtr<IPin>   pFTRPinIn;             //   Texture   Renderer   Input   Pin  
   
          //   Find   the   source's   output   pin   and   the   renderer's   input   pin  
          if   (FAILED(hr   =   pFTR->FindPin(L"In",   &pFTRPinIn)))  
          {  
                  Msg(TEXT("Could   not   find   input   pin!     hr=0x%x"),   hr);  
                  return   hr;  
          }  
   
          //   Connect   these   two   filters  
          if   (FAILED(hr   =   g_pGB->Connect(pFSrcPinOut,   pFTRPinIn)))  
          {  
                  Msg(TEXT("Could   not   connect   pins!     hr=0x%x"),   hr);  
                  return   hr;  
          }  
   
  #else  
   
          //   Render   the   source   filter's   output   pin.     The   Filter   Graph   Manager  
          //   will   connect   the   video   stream   to   the   loaded   CTextureRenderer  
          //   and   will   load   and   connect   an   audio   renderer   (if   needed).  
   
   
   
          if   (FAILED(hr   =   g_pGB->Render(pFSrcPinOut)))  
          {  
                  Msg(TEXT("Could   not   render   source   output   pin!     hr=0x%x"),   hr);  
                  return   hr;  
          }  
   
  #endif  
         
          //   Get   the   graph's   media   control,   event   &   position   interfaces  
          g_pGB.QueryInterface(&g_pMC);  
          g_pGB.QueryInterface(&g_pMP);  
          g_pGB.QueryInterface(&g_pME);  
           
          //   Start   the   graph   running;  
          if   (FAILED(hr   =   g_pMC->Run()))  
          {  
                  Msg(TEXT("Could   not   run   the   DirectShow   graph!     hr=0x%x"),   hr);  
                  return   hr;  
          }  
   
          return   S_OK;  
  }  
   
  在对bmp平面图的处理中可以用颜色键屏蔽掉某种颜色  
   
   
   
   
   
  D3DXCreateTextureFromFileEx(pd3dDevice,   "*.bmp",   0,   0,   0,   0,  
      D3DFMT_UNKNOWN,   D3DPOOL_MANAGED,   D3DX_DEFAULT,  
      D3DX_DEFAULT,   D3DCOLOR_XRGB(0,   0,   0),   NULL,   NULL,   &m_pTexture);  
   
   
  但是在播放视频时好像不行?  
   
  请大家帮帮我,多谢! 问题点数:50、回复次数:3Top

1 楼0000000009()回复于 2004-12-03 13:21:56 得分 0

 
   
   
  问题好像解决了,但我有点不明白。  
   
   
   
   
          m_pd3dDevice->SetTexture(   0,   g_pTexture   );  
          m_pd3dDevice->SetStreamSource(   0,   g_pVB,   0,   sizeof(CUSTOMVERTEX)   );  
          m_pd3dDevice->SetVertexShader(   NULL   );  
          m_pd3dDevice->SetFVF(   D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1);  
   
  我加上了下面几句:  
   
  m_pd3dDevice->SetRenderState(   D3DRS_ALPHABLENDENABLE,       TRUE   );                       //打开ALPHA通道  
  m_pd3dDevice->SetRenderState(   D3DRS_SRCBLEND,   D3DBLEND_SRCCOLOR   );                 //??  
  m_pd3dDevice->SetRenderState(   D3DRS_DESTBLEND,D3DBLEND_INVSRCCOLOR   );           //??    
   
          m_pd3dDevice->DrawPrimitive(   D3DPT_TRIANGLESTRIP,   0,98);               //画纹理(mpg视频)  
   
  按照DX帮助文档中的介绍:  
   
  D3DBLEND_SRCCOLOR:     混合因子   (Rs,Gs,Bs,As)  
   
  D3DBLEND_INVSRCCOLOR:     混合因子   (1   -   Rs,   1   -   Gs,   1   -   Bs,   1   -   As)  
   
   
  但我不明白   Rs,Gs,Bs,As   分别是什么?如果是顶点的RGB值得话,那么他们是怎样赋值的?我的意思是,怎样得到的将黑色去掉的?如果我想把黑色换成蓝色该怎样做?  
   
   
  对于bmp格式的纹理来说,用下面的几句:  
   
  m_pd3dDevice->SetRenderState(   D3DRS_ALPHABLENDENABLE,       TRUE   );     //打开ALPHA通道  
  m_pd3dDevice->SetRenderState(   D3DRS_SRCBLEND,   D3DBLEND_ONE   );       //D3DBLEND_ONE   混合(1,   1,   1,1)  
  m_pd3dDevice->SetRenderState(   D3DRS_DESTBLEND,D3DBLEND_ONE   );              
   
  (1,   1,   1,1)代表黑色吗?  
  Top

2 楼0000000009()回复于 2005-01-11 19:41:31 得分 0

请大家登陆   61.50.226.75   告诉我结果好吗?  
  马上给分Top

3 楼hanleihanlei()回复于 2005-02-06 11:34:28 得分 50

(1111)不代表黑色Top

相关问题

  • 求教:DirectX下alpha混合
  • 请教把多路视频混合成一路视频采用什么方法
  • 请教把多路视频混合成一路视频采用什么方法
  • 关于视频采集的实时混合及显示
  • DirectX6.1下的Alpha混合的速度
  • 如何编写AVI编辑器,---把不同的视频和音频混合?
  • 请问,如何动态混合几个视频流,并且要求保存。
  • Alpha混合中的Alpha值是怎么算出来的?
  • 请问Alpha混合处理是什么啊?
  • 求教16位色下ALPHA混合的三原色算法。

关键词

  • hr
  • source
  • pd3ddevice
  • pgb
  • dblend
  • pctr
  • setrenderstate
  • 混合
  • render
  • ctexturerenderer

得分解答快速导航

  • 帖主:0000000009
  • hanleihanlei

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo