Jump to content
  • Advertisement
Sign in to follow this  

What could make my shader scale the mesh, when I dont apply a scale transform.

This topic is 2910 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm trying to copy the 2009 DX SDK's instancing app but when I load my mesh class the shader seems to apply a scale to it.
I can find any thing wrong with the cpp side of the app and I dont know much about shaders so ill post the shader where i think it may be.
plus the relevant cpp code.

//cpp side code

D3DXMATRIX* g_pTreeInstanceData;//world locations

// set us up for instanced rendering all stuff related to rendering is valid just not put in here.
//this here code is the shaders params needed to render the mesh the mesh data comes from streem 0 and the instancing is in stream 1
D3DXMATRIX WorldViewProj;
D3DXMatrixMultiply( &WorldViewProj, &view, &proj );

HRESULT hr = fx->WorldViewProj->SetMatrix( ( float* )&WorldViewProj );//g_pmWorldViewProj
WorldView = view;

//FLOAT det = 0.0f;
//D3DXMatrixInverse(&WorldView, &det, &view);
hr = fx->WorldView->SetMatrix( ( float* )&WorldView);//view );//g_pmWorldView

hr = fx->iNumTrees->SetInt( g_iNumTreesToDraw );

//render here

//setting the instancing world locations

srand( 100 ); //use the same random seed every time so we can verify output
float fScale = 30.0f;

for( int i = 1; i < MAX_TREE_INSTANCES; i++ )
//find a random position
pos.x = RPercent() * 140.0f;
pos.y = 0;//RPercent() * 20.0f - 10.0f;
pos.z = 15.0f + fabs( RPercent() ) * 200.0f;

pos.x *= -1;
pos.z *= -1;

pos *= fScale;

float fRot = RPercent() * D3DX_PI;


D3DXMatrixRotationY( &mRot, fRot );
D3DXMatrixTranslation( &mTrans, pos.x, pos.y, pos.z );

//no scale
D3DXMatrixScaling( &mScale, 1.0f, 1.0f, 1.0f );
g_treeInstanceMatrices = mScale * mRot * mTrans;

//maybe need invers not work
//FLOAT d = 0.0f;
//D3DXMatrixInverse(&g_treeInstanceMatrices, &d, &g_treeInstanceMatrices);


g_pTreeInstanceList = &g_treeInstanceMatrices[0];
}//end CreateRandomTreeMatrices

LoadTreeInstanceData(DWORD dwNumTrees )

// Create a resource with the input matrices
// We're creating this buffer as dynamic because in a game, the instance data could be dynamic... aka
// we could have moving trees.
D3D10_BUFFER_DESC bufferDesc =
dwNumTrees * sizeof( D3DXMATRIX ),

hr = pd3dDevice->CreateBuffer( &bufferDesc, NULL, &g_pTreeInstanceData );
DebugText("failed to Create Buffer",//the message to display
"MyAppWin::LoadTreeInstanceData()",//the location the message was called Eg. what function
true);//bool Usewindowmsgbox = false);//true if you also want to display it in a messagebox


D3DXMATRIX* pMatrices = NULL;
( g_pTreeInstanceData )->Map( D3D10_MAP_WRITE_DISCARD, NULL, ( void** )&pMatrices );

memcpy( pMatrices, g_pTreeInstanceList, dwNumTrees * sizeof( D3DXMATRIX ) );

( g_pTreeInstanceData )->Unmap();

}//end LoadTreeInstanceData

//shader code comes out of the sdk 2009 instancing island app

// CalcLighting helper function. Calculates lighting from 4 light sources, adds ambient
// and attenuates for depth. Used by all techniques for lighting.
float4 CalcLighting( float3 norm, float depth )
float4 color = float4(0,0,0,0);

// add the contributions of 4 directional lights
[unroll] for( int i=0; i<4; i++ )
color += saturate( dot(g_lights.direction,norm) )*g_lights.color;

// give some attenuation due to depth
float attenuate = depth / 10000.0;
float4 attenColor = float4(0.15, 0.2, 0.3, 0);

// add it all up plus ambient
return (1-attenuate*0.23)*(color + g_ambient) + attenColor*attenuate;

// Instancing vertex shader. Positions the vertices based upon the matrix stored
// in the second vertex stream.
PSSceneIn VSInstmain(VSInstIn input)
PSSceneIn output;

// Transform by our Sceneance matrix
float4 InstancePosition = mul(float4(input.pos, 1), input.mTransform);
float4 ViewPos = mul(InstancePosition, g_mWorldView );

// Transform the vert to view-space
float4 v4Position = mul(InstancePosition, g_mWorldViewProj);
output.pos = v4Position;

// Transfer the rest
output.tex = input.tex;

// dot the norm with the light dir
float3 norm = mul(input.norm,(float3x3)input.mTransform);
output.color = CalcLighting( norm, ViewPos.z );

// Dim the color by how far up the tree we are.
// This is a nice way to fake occlusion of the branches by the leaves.
output.color *= 1.0f - saturate(input.pos.y/g_occDimHeight);

return output;

// PS for non-leaf or grass items.
float4 PSScenemain(PSSceneIn input) : SV_Target
float4 color = g_txDiffuse.Sample( g_samLinear, input.tex ) * input.color;
return color;

// Render instanced meshes with vertex lighting
technique10 RenderInstancedVertLighting
pass p0
SetVertexShader( CompileShader( vs_4_0, VSInstmain() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, PSScenemain() ) );

SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
SetDepthStencilState( EnableDepthTestWrite, 0 );
SetRasterizerState( EnableMSAA );

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!