Sign in to follow this  

Tweening with HLSL lerp(), No textures!

Recommended Posts

I load 2 meshes from ".x" file, The ".x" file already had more than 10 textures on various surfaces. DX Mesh Viewer display them very well(with textures). The vertex FVF is D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1 .the number of bytes of pre vertex is 32 . mesh01--- m_pVB1 mesh02--- m_pVB2 The vertex decl is D3DVERTEXELEMENT9 decl[] = { {0, 0,D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, {0, 12,D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0}, {0, 24,D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, {1,0,D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 1 }, {1,12,D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 1}, {1,24,D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,1}, D3DDECL_END() }; I tween them with HLSL lerp(a,b,s) . s is the tweening factor which is from API constant table. It works well except none textures. The following sentences are my shader.txt file matrix ViewMatrix; matrix ViewProjMatrix; vector AmbientMtrl; vector DiffuseMtrl; vector LightDirection; float factor; vector DiffuseLightIntensity = {0.0f, 0.0f, 1.0f, 1.0f}; vector AmbientLightIntensity = {0.0f, 0.0f, 0.2f, 1.0f}; // // Input and Output structures. // struct VS_INPUT { vector position : POSITION0; vector normal : NORMAL0; float2 base:TEXCOORD0; vector position1 : POSITION1; vector normal1 : NORMAL1; float2 base1 : TEXCOORD1; }; struct VS_OUTPUT { vector position : POSITION; vector diffuse : COLOR; float2 base : TEXCOORD0; }; VS_OUTPUT Main(VS_INPUT input) { // zero out all members of the output instance. VS_OUTPUT output = (VS_OUTPUT)0; vector Temp=lerp(input.position,input.position1,factor); Temp.w=1.0f; vector TempNormal=lerp(input.normal,input.normal1,factor); TempNormal.w=1.0f; input.normal=TempNormal; output.position =mul( Temp,ViewProjMatrix); LightDirection.w = 0.0f; input.normal.w = 0.0f; LightDirection = mul(LightDirection, ViewMatrix); input.normal = mul(input.normal, ViewMatrix); float s = dot(LightDirection, input.normal); if( s < 0.0f ) s = 0.0f; output.diffuse = (AmbientMtrl * AmbientLightIntensity) + (s * (DiffuseLightIntensity * DiffuseMtrl)); output.base=input.base; return output; } I render them with: m_pd3dDevice->SetStreamSource( 0, m_pVB1,0,sizeof(D3DVERTEX) ); m_pd3dDevice->SetStreamSource(1, m_pVB2,0,sizeof(D3DVERTEX) ); ...m_pd3dDevice->SetIndices( m_pMeshIB ); m_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, m_dwNumMeshVertices, 0, m_dwNumMeshFaces ); U know, if I render mesh01(or mesh02)in a loop of materials ->DrawSubset(i) It works with all textures very well. Now ,the output.position is interpolated how can i get the interpolated "mesh" to DrawSubset(i) ? U know DirectX tweening sample "Dolphin" is different from my case, dolphin ".x" file have none texture at all, just mesh. Help!

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this