我想在游戏中画只老虎,但有时纹理不对,下面那张的效果才是我想要的.
我在画图之前已经使用了
SetVertexShader(0);
SetPixelShader(0); SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
SetTextureStageState(0, D3DTSS_COLOROP, D3DTA_TEXTURE);
SetTextureStageState(0, D3DTSS_COLORARG1,D3DTA_TEXTURE);
SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTA_TEXTURE);
SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

解决方案 »

  1.   

    try this:
    SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); 
    SetTextureStageState(0, D3DTSS_COLORARG1,D3DTA_TEXTURE); 
    SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); 
    SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
      

  2.   

    看图1的效果,纹理坐标像是一维,所以拉扯了。检查下,两三角形的纹理坐标是不是不小心写错了,可能有y相等或x相等的。另外,
    SetTextureStageState(0, D3DTSS_COLOROP, D3DTA_TEXTURE); 
    SetTextureStageState(0, D3DTSS_COLORARG1,D3DTA_TEXTURE); 
    SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTA_TEXTURE); 
    SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);这个有问题,D3DTSS_COLOROP和D3DTSS_ALPHAOP后设的是操作类型(像D3DTOP_SELECTARG1、D3DTOP_MODULATE等),不是混合阶段的参数类型。
      

  3.   

    我是加载的一个模型,用DrawSubset画的,纹理坐标也不需要我写的?
      

  4.   

    具体设渲染态的话:
    1、要是纹理没老虎的alpha通道:SetTextureStageState(0, D3DTSS_COLOROP,  D3DTOP_SELECTARG1 );
    SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
    SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE );SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
    SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
    SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
    2、要是有alpha通道:SetTextureStageState(0, D3DTSS_COLOROP,  D3DTOP_SELECTARG1 );
    SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
    SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
    SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE );
    SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
    SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
    SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
      

  5.   

    用DrawSubset的话,之前用SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE)也没用,更何况setfvf里都没有指定纹理
      

  6.   

    for( DWORD i=0; i<m_dwNumMaterials; i++ )
    {
    // 为这一部分设置材质
    m_device->SetMaterial( &m_pMeshMaterials[i] ); hr = m_device->SetTexture( 0, m_pMeshTextures[i] ); /*if( FAILED(hr))
    {
    Log("texture set failed");
    }*/ hr = m_pMesh->DrawSubset( i ); }
    SetTexture不是指定了纹理吗?纹理应该是起用了的,你看他有两个地方是有颜色的呀
      

  7.   


    当然,用SetTexture后纹理是有了,但是SetFVF()没有指定任何纹理坐标,像D3DFVF_TEX1,所以也没用了。实际上SetFVF()在这用和不用对老虎都一样,因为DrawSubset调用时,自己会给mesh设顶点格式。要不用m_pMesh->GetFVF()检查下老虎模型的顶点格式,看下有没有D3DFVF_TEX0;
    要不换个模型再试试,一样有问题的话,可能程序里setTextureState/setSampleState等什么地方有问题吧。没遇到过这问题,所以只能猜了,仅供参考。
      

  8.   

    我猜测可能是ID3DXEffect的影响
    我怎么让前面的ID3DXEffect效果不要影响后面要画的物体?
      

  9.   

    搞定了~~~~~~
    为了使用一个效果渲染几何体,我们必须围绕绘图函数在ID3DXEffect::Begin 和 ID3DXEffect::End技术间调用。这些函数就是分别开启和关闭效果。
    HRESULT ID3DXEffect::Begin(
         UINT* pPasses,
         DWORD Flags
    );•         pPasses—返回在当前活动的技术中的传递的数量。
    •         Flags—下面标志的任何一个:
    o        Zero (0)—指定效果保存当前设备状态和着色状态,并在效果结束(这时ID3DXEffect::End被调用)后恢复它们。因为效果文件能够改变状态,对于可以保存启动效果前的状态来说,是很有用的。
    o        D3DXFX_DONOTSAVESTATE—指示效果不保存和恢复设备状态(除shader状态外)。
    o        D3DXFX_DONOTSAVESHADERSTATE—指示效果不保存和恢复shader状态。
    我想问下Flags设为0有什么缺点吗,速度会变慢?