游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5942|回复: 16

请教一下,我的地形和水都用了shader,分别渲染没问题,

[复制链接]

1

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2012-3-24 18:08:00 | 显示全部楼层 |阅读模式
如题,就变成这样了……

地形完全变成异世界了 [em6]
地形和水的代码我都有做       
           m_pD3DDevice->SetVertexShader(m_pVShader);
        m_pD3DDevice->SetPixelShader(m_pPShader);

        m_pD3DDevice->SetVertexShader(NULL);
        m_pD3DDevice->SetPixelShader(NULL);
不知道为什么还是会出现这样,而单独分别渲染却是可以的。

一步一步注释语句地调试,最终发现了只要注释到水render函数里的这一句代码就正常了:
m_pVConstTable->SetMatrix(m_pD3DDevice,mhWorldViewProj, &mWorldViewProj)
这我就纳闷了。。和这个有什么关系。。我把水的render函数全注释掉,只剩这一句(和必要的求mWorldViewProj的语句),居然还是会出现上述问题。

        if(FAILED(m_pVConstTable->SetMatrix(m_pD3DDevice,mhWorldViewProj, &mWorldViewProj)))       
                MessageBoxA(NULL,"a","a",0);
无对话框弹出。

[em7]想到头都破了……

6

主题

74

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2012-3-25 12:45:00 | 显示全部楼层

Re:请教一下,我的地形和水都用了shader,分别渲染没问题

2个shader冲突了

m_pVConstTable->SetMatrix(m_pD3DDevice,mhWorldViewProj, &mWorldViewProj)

wvp矩阵你倒置了没?或者你一个shader里面倒置的一个没有?

1

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2012-3-25 14:33:00 | 显示全部楼层

Re: Re:请教一下,我的地形和水都用了shader,分别渲染没

Kevin_Qing: Re:请教一下,我的地形和水都用了shader,分别渲染没问题,放在一起就出现问题了……

2个shader冲突了

m_pVConstTable->SetMatrix(m_pD3DDevice,mhWorldViewProj, &mWorldViewProj)
...

我想不通矩阵的设置为什么会导致两个不同的shader冲突了。 [em7]

6

主题

74

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2012-3-26 09:09:00 | 显示全部楼层

Re:请教一下,我的地形和水都用了shader,分别渲染没问题

这个是shader const啊,你水和地面的vs shader都要用mvp矩阵的

1

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2012-3-26 12:53:00 | 显示全部楼层

Re: Re:请教一下,我的地形和水都用了shader,分别渲染没

Kevin_Qing: Re:请教一下,我的地形和水都用了shader,分别渲染没问题,放在一起就出现问题了……

这个是shader const啊,你水和地面的vs shader都要用mvp矩阵的

[em7]不是很理解,请谅解我菜鸟,接触DirextX才一年多``。。

shader是什么情况下会造成冲突呢?
[em5]我能够把水和地形分别渲染出来。。他们各自的矩阵设置应该是没问题的吧?

6

主题

74

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2012-3-28 12:55:00 | 显示全部楼层

Re:请教一下,我的地形和水都用了shader,分别渲染没问题

把各自渲染部分的调用贴出来看看?你是做了什么其他事情


setVS(pVSWater)
setVSConst(xxx);
draw(water_vb)....

setVS(pVSTerrain)
setVSConst(xxx);
draw(Terrain_vb)....

1

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2012-3-28 15:39:00 | 显示全部楼层

Re:请教一下,我的地形和水都用了shader,分别渲染没问题

Kevin_Qing: Re:请教一下,我的地形和水都用了shader,分别渲染没问题,放在一起就出现问题了……

把各自渲染部分的调用贴出来看看?你是做了什么其他事情


setVS(pVSWater)
setVSConst(xxx);
draw(wat...



void CMyGame::Render()
{
……
……
……

//渲染地形
pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld );
m_pLODTerrain->RenderTerrain(pD3DDevice, TRUE);
//水
m_water->Render();       

……
……
……
}

void  CZFXLODTerrain::RenderTerrain( LPDIRECT3DDEVICE9 pd3dDevice, BOOL bFog )
{
        //// pre rendering
        //D3DXVECTOR4 lightDirVec(3.0f, 1.0f, 0, 0);

        // set vertex shader constant table
        D3DXMATRIXA16 mWorld, mView, mProj;
        pd3dDevice->GetTransform(D3DTS_WORLD, &mWorld);
        pd3dDevice->GetTransform(D3DTS_VIEW, &mView);
        pd3dDevice->GetTransform(D3DTS_PROJECTION, &mProj);
        D3DXMATRIXA16 mWorldViewProj = mWorld * mView * mProj;
        D3DXMATRIXA16 mWorldView = mWorld * mView;
        m_pVConstTable->SetMatrix(pd3dDevice,mhWVP, &mWorldViewProj);

        pd3dDevice->SetStreamSource(0, m_pVB, 0, sizeof(TerrainVertex));
        pd3dDevice->SetVertexDeclaration(TerrainVertex:ECL);
        pd3dDevice->SetIndices(m_pIB);

        UINT count;
        D3DXCONSTANT_DESC mDescMap0,mDescMap1,mDescMap2,mDescMap;
        m_pPConstTable->GetConstantDesc(mhLayerMap0, &mDescMap0, &count);
        m_pPConstTable->GetConstantDesc(mhLayerMap1, &mDescMap1, &count);
        m_pPConstTable->GetConstantDesc(mhLayerMap2, &mDescMap2, &count);
        m_pPConstTable->GetConstantDesc(mhBlendMap, &mDescMap, &count);


        pd3dDevice->SetTexture(mDescMap0.RegisterIndex, mLayerMap0);
        pd3dDevice->SetTexture(mDescMap1.RegisterIndex, mLayerMap1);
        pd3dDevice->SetTexture(mDescMap2.RegisterIndex, mLayerMap2);
        pd3dDevice->SetTexture(mDescMap.RegisterIndex, mBlendMap);


        // rendering
        pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(TerrainVertex) );
        //pd3dDevice->SetVertexDeclaration(TerrainVertex::DECL);
        pd3dDevice->SetVertexShader(m_pVShader);
        pd3dDevice->SetPixelShader(m_pPShader);
        pd3dDevice->SetIndices( m_pIB );

        pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0/*base index index*/, 0,/*MinVertexIndex*/
                (m_numNodeRendered << 3 ) + m_numNodeRendered/*NumVertices*/,
                0/*StartIndex*/,
                (m_numNodeRendered << 3 )/*PrimitiveCount*/);
        // post rendering
        pd3dDevice->SetVertexShader(NULL);
        pd3dDevice->SetPixelShader(NULL);
}

void CWater::Render()
{
        CGameObject::Render();

        D3DXMATRIXA16 mWorld, mView, mProj;
        m_pD3DDevice->GetTransform(D3DTS_WORLD, &mWorld);
        m_pD3DDevice->GetTransform(D3DTS_VIEW, &mView);
        m_pD3DDevice->GetTransform(D3DTS_PROJECTION, &mProj);
        D3DXMATRIXA16 mWorldViewProj = mWorld * mView * mProj;
        D3DXMATRIXA16 mViewProj = mView * mProj;
        if(FAILED(m_pVConstTable->SetMatrix(m_pD3DDevice,mhWorldViewProj, &mWorldViewProj)))        //为什么注释这条就正常??
                MessageBoxA(NULL,"a","a",0);
        m_pVConstTable->SetMatrix(m_pD3DDevice,mhViewProj, &mViewProj);


        UINT count;
        D3DXCONSTANT_DESC mDescReflectMap,mDescWaveTexture;
        m_pPConstTable->GetConstantDesc(mhReflectMap, &mDescReflectMap, &count);
        m_pPConstTable->GetConstantDesc(mhWaveTexture, &mDescWaveTexture, &count);


        //m_pD3DDevice->SetTexture(mDescReflectMap.RegisterIndex, mReflectMap);
        m_pD3DDevice->SetTexture(mDescWaveTexture.RegisterIndex, mWaveTexture);


        m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
        m_pD3DDevice->SetRenderState(D3DRS_CULLMODE,                         D3DCULL_NONE);
        m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
       

        m_pD3DDevice->SetTexture(0,m_pTexture);
        m_pD3DDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR );
        m_pD3DDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR );
        m_pD3DDevice->SetStreamSource( 0, m_pVB, 0, sizeof(WaterVertex));
        m_pD3DDevice->SetFVF(WaterVertex::FVF);
        //m_pD3DDevice->SetVertexDeclaration(VertexPT::DECL);
        m_pD3DDevice->SetIndices(m_pIB);

        m_pD3DDevice->SetVertexShader(m_pVShader);
        m_pD3DDevice->SetPixelShader(m_pPShader);

        m_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,0,2);
        m_pD3DDevice->SetVertexShader(NULL);
        m_pD3DDevice->SetPixelShader(NULL);
        m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
}

void CGameObject::Render()
{
        if (!m_pD3DDevice)
        {
                return;
        }

        D3DXMATRIX matTrans,matScale,matRotX,matRotY,matRotZ;

        D3DXMatrixIdentity(&matWorld);       

        D3DXMatrixTranslation(&matTrans,m_pos.x ,m_pos.y ,m_pos.z);

        D3DXMatrixRotationX(&matRotX,m_angle.x);
        D3DXMatrixRotationY(&matRotY,m_angle.y);
        D3DXMatrixRotationZ(&matRotZ,m_angle.z);

        D3DXMatrixScaling(&matScale,m_size.x,m_size.y,m_size.z);

        D3DXMatrixMultiply(&matWorld,&matWorld,&matScale);

        D3DXMatrixMultiply(&matWorld,&matWorld,&matRotX);
        D3DXMatrixMultiply(&matWorld,&matWorld,&matRotY);
        D3DXMatrixMultiply(&matWorld,&matWorld,&matRotZ);

        D3DXMatrixMultiply(&matWorld,&matWorld,&matTrans);

        m_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);

}

6

主题

74

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2012-3-30 11:57:00 | 显示全部楼层

Re:请教一下,我的地形和水都用了shader,分别渲染没问题

?2个shader怎么会共用一个const table?

const table是绑定于shader的。

另外你的处理顺序也有问题。

要先设置shader,再设置const。否则你设置的值可能被shader里面的初始化干掉了

1

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2012-3-30 15:15:00 | 显示全部楼层

Re: Re:请教一下,我的地形和水都用了shader,分别渲染没

Kevin_Qing: Re:请教一下,我的地形和水都用了shader,分别渲染没问题,放在一起就出现问题了……

?2个shader怎么会共用一个const table?

const table是绑定于shader的。

另外你的处理顺序也有问题。
...

m_pPConstTable只是名字一样而已啊...分别是不同类的成员变量..

您的意思是..m_pD3DDevice->SetVertexShader(m_pVShader);和m_pD3DDevice->SetPixelShader(m_pPShader);会初始化我设置的值?
[em24] [em24] [em24]

6

主题

74

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2012-3-31 23:06:00 | 显示全部楼层

Re:请教一下,我的地形和水都用了shader,分别渲染没问题

如果你shader里面有默认值的话,应该是在set的时候初始化的

你可以尝试下修改顺序看看是否效果就对了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-28 12:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表