Matrices and HLSL

Started by
2 comments, last by Armadon 18 years, 5 months ago
Hi, Is there a way to tell the HLSL that a given global matrix is the current world matrix, so that a call to pd3dDevice->SetTransfrom(D3DTS_WORLD, ...) would update it ? It's the case for texture samplers, so I wondered if there is a possibility to do it with matrices. For example, something like this in the HLSL : float4x4 g_mWorld : WORLDTRANSFORM; And that would tell the effect to take the current world matrix, so that a simple call to pd3dDevice->SetTransform(D3DTS_WORLD, ...) would work ... Maybe I'm dreaming, but such a fonctionality would really make my work easier ^^
Advertisement
Nope, all functions like SetTransform(), SetMaterial(), SetTexture(), ect, are purely for the Fixed-Function Pipeline. They have no effect on the programmable pipeline at all.

However, making your own is really easy. Check this out (note that this is slightly psuedocoded):

// At init timeD3DXHANDLE worldHandle = effect->GetParameterBySemantic( NULL, "WORLD" );HRESULT SetTransform( DWORD type, D3DXMATRIX mat ){   if( type == D3DTS_WORLD )   {       effect->SetMatrix( worldHandle, mat );   }   else if( type == D3DTS_VIEW )   {      ...   }   ...}
Dustin Franklin ( circlesoft :: KBase :: Mystic GD :: ApolloNL )
The point is that I already have a mesh class which use the FFP. And I want to encapsulate that class in a one that use a shader without modifying the actual code.

And for texture, I assure you that the FFP call to SetTexture actually sets the texture even when you're using a shader and you DON'T use effect->SetTexture()

If you have 2 global texture samplers defined in the HLSL, the first one will correspond to the texture channel 0 and the second one to the channel 1. So, if I have something like :

texture g_tDiffuseTexturesampler g_tDiffuseSampler = sampler_state{   g_tDiffuseTexture;}

in my HLSL, the 2 following lines will produce the exact same result :

effect->SetTexture("g_tDiffuseTexture", myTexture);pd3dDevice->SetTexture(0, myTexture);

That's the reason why I thought their was a similar "trick" with matrices. But from your answer, it seems not :(
Extending Circlesoft's reply, with effect files you can use the ID3DXEffect::SetMatrix(), the method is available. You can call this each frame/update or whatever you wish and that will have the same effect as pDevice->SetTransform(D3DTS_WORLD, ...)

I hope this helps.
Take care.

[Edited by - Armadon on November 10, 2005 12:26:25 PM]

This topic is closed to new replies.

Advertisement