首先说明一下,我是在windows mobile下用Direct3d mobile实现mobile下的3d效果的,现在我想问一下如何实现一幅图片的的淡入淡出效果(图片是先load到surface然后StretchRect到要渲染的TEXTURE上的 ),我知道最好的方法应该是用模板缓存技术。但对这个不太熟悉。希望达人指点,最好有些代码,这样容易理解,方便我一直到windows mobile上。谢谢!

解决方案 »

  1.   

    D3DLOCKED_RECT     stLockedRect;

    (*ppTexture)->LockRect( 0, &stLockedRect, 0, 0 );
    UCHAR *pch=(UCHAR *)stLockedRect.pBits;
    for (int j=0;j<h;j++)
    {
    for (int i=0;i<w;i++)
    {
    pch[3]=AlphaData[i+j*w];
    if(pch[3]!=0)//pch[3] may by is -120
    {
    if(!mode)//3d ob static
    {
    if(alpha-AlphaData[i+j*w]+255>0)
    {pch[3]=alpha-AlphaData[i+j*w]+255;}
    else{pch[3]=0;}
    }
    else//3d fog static
    {
    if(AlphaData[i+j*w]-alpha>0)
    {pch[3]=AlphaData[i+j*w]-alpha;}
    else{pch[3]=0;}
    }
    }
    pch+=4;
    }
    }
    (*ppTexture)->UnlockRect(0);
    设置纹理的alpha值,但d3d渲染还有相关的设置. //D3DRS_DITHERENABLE:使程序允许抖动,默认是FALSE。
    m_pd3dDevice->SetRenderState( D3DRS_DITHERENABLE, TRUE );
      // Turn on the zbuffer
        m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );//激活深度缓冲区P157
    m_pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESS );//设置深度深度函数P157
    m_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);//允许应用程序在绘制像素时更新深度缓冲区;P158
    // Turn off culling render mode
    m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );//设置整体环境光;P92
    m_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );//D3DFILL_WIREFRAME//D3DFILL_SOLID渲染面模式;P168
    m_pd3dDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
    // Turn off D3D lighting
        m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );//激活对景物进行光照运算x
    // Turn on ambient lighting 
    //D3DCOLOR ambientcolor=D3DCOLOR_XRGB(64,64,64);
        //m_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );
    //激活多重采样;P173(除锯齿)
    m_pd3dDevice->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false );
    // Set default render states
    // 用于设置顶点与纹理混合
    m_pd3dDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
        m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
        m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
        m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 );
        m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
    //D3DSAMP_MINFILTER:缩小过滤器,用于纹理缩小时减少闪烁失真
        //D3DSAMP_MAGFILTER:放大过滤器,用于纹理放大时,减少出现色块
        m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
        m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
    //多级渐进纹理(用于设置各纹理层间的设置)
        //D3DSAMP_MIPFILTER:设置多级渐进纹理过滤
        m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
    //纹理拉伸(不复制纹理,作边缘像素的拉伸);P140
        m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU,  D3DTADDRESS_CLAMP );
        m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV,  D3DTADDRESS_CLAMP );