I want to use light map for each box, but I have the problem about the additional light map texture coordinate.
This is my vertex declaration. The additional texture coordinate is in stream 2
D3DVERTEXELEMENT9 g_VertexElemHardware[] = { {0,0,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0}, {0,3*4,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,0}, {0,6*4,D3DDECLTYPE_FLOAT2,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TEXCOORD,0}, {1,0,D3DDECLTYPE_D3DCOLOR,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_COLOR,0}, {1,4,D3DDECLTYPE_D3DCOLOR,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_COLOR,1}, //texture coordinate for light map {2,0,D3DDECLTYPE_FLOAT2,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TEXCOORD,1}, D3DDECL_END()};struct BOX_VERTEX_TEXTURECOORD{ float u,v;};IDirect3DVertexBuffer9 *g_pVBBoxTextureCoordinate=0;
I fill all texture coordinate into vertex buffer "g_pVBBoxTextureCoordinate".
Each instance's light map uv are differences.
Then use "SetStreamSourceFreq" to perform hardware instancing.
V( pd3dDevice->SetStreamSource( 0, g_pVBBox, 0, sizeof(BOX_VERTEX)) ); V( pd3dDevice->SetStreamSourceFreq( 0, D3DSTREAMSOURCE_INDEXEDDATA | g_NumBoxes ) ); //g_NumBoxes: number of box to draw V( pd3dDevice->SetStreamSource( 1, g_pVBInstanceData, 0, sizeof( BOX_INSTANCEDATA_POS ) ) ); V( pd3dDevice->SetStreamSourceFreq( 1, D3DSTREAMSOURCE_INSTANCEDATA | 1ul ) ); V( pd3dDevice->SetIndices( g_pIBBox ) ); //set the additional light map texture coordinate V( pd3dDevice->SetStreamSource( 2, g_pVBBoxTextureCoordinate, 0, sizeof( BOX_VERTEX_TEXTURECOORD ) ) ); //how to set the light map texture coordinate instance data? //V( pd3dDevice->SetStreamSourceFreq(2,D3DSTREAMSOURCE_INDEXEDDATA | 1ul)); //V( pd3dDevice->SetStreamSourceFreq(2,D3DSTREAMSOURCE_INDEXEDDATA | 24ul)); //the number 24 means one box have 24 vertices //V( pd3dDevice->SetStreamSourceFreq(2,D3DSTREAMSOURCE_INSTANCEDATA | 1ul ) ); //V( pd3dDevice->SetStreamSourceFreq(2,D3DSTREAMSOURCE_INSTANCEDATA | 24ul ) ); V( g_pEffect->SetTechnique( g_HandleTechnique ) ); V( g_pEffect->Begin( &cPasses, 0 ) ); for( iPass = 0; iPass < cPasses; iPass++ ) { V( g_pEffect->BeginPass( iPass ) ); V( g_pEffect->SetTexture( g_HandleTexture, g_pBoxTexture ) ); V( g_pEffect->CommitChanges() ); V( pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 4 * 6, 0, 6 * 2 ) ); V( g_pEffect->EndPass() ); } V( g_pEffect->End() );
But the box still get the wrong box light map uv coordinate.
This is my code.
1.
V( pd3dDevice->SetStreamSource( 2, g_pVBBoxTextureCoordinate, 0, sizeof( BOX_VERTEX_TEXTURECOORD ) ) ); V( pd3dDevice->SetStreamSourceFreq(2,1ul)); //all box use the first uv
2.
V( pd3dDevice->SetStreamSource( 2, g_pVBBoxTextureCoordinate, 0, sizeof( BOX_VERTEX_TEXTURECOORD ) ) ); //do not use SetStreamSourceFreq //all box use the first uv
3.
V( pd3dDevice->SetStreamSource( 2, g_pVBBoxTextureCoordinate, 0, sizeof( BOX_VERTEX_TEXTURECOORD ) ) ); V( pd3dDevice->SetStreamSourceFreq(2,D3DSTREAMSOURCE_INSTANCEDATA|1ul)); //uv error
4.
V( pd3dDevice->SetStreamSource( 2, g_pVBBoxTextureCoordinate, 0, sizeof( BOX_VERTEX_TEXTURECOORD ) ) ); V( pd3dDevice->SetStreamSourceFreq(2,D3DSTREAMSOURCE_INDEXEDDATA|24ul)); //all box use the first uv
Does anyone try to add the addition uv coordinate when using hardware instancing?
I want to use hardware instancing to draw trees, and each tree has their own light map.
Thanks!