[lnkForumImage]
Download FREE Software.

Confronta i prezzi di migliaia di prodotti.
News Forum Italiano
 Home | Login | Registrati | Ricerca 


 

Forums >

it.comp.giochi.sviluppo

D3D10 - GetVariableByName

Vincent

14/05/2009 20:42:11

Ho un semplicissimo shader:

cbuffer cEveryFrame
{
float4x4 ViewMatrix;
}

cbuffer cOnCamera
{
float4x4 WorldMatrix;
float4 EyePosition;
}
cbuffer cNever
{
float4x4 ProjMatrix;
const float4 LightDirection = { 0.577f, 0.577f, 0.577f, 0.0f };
}

Texture2D Texture;

SamplerState FurText
{
Filter = MIN_MAG_MIP_POINT;
AddressU = WRAP;
AddressV = WRAP;
};

SamplerState SamplText
{
Filter = ANISOTROPIC;
AddressU = WRAP;
AddressV = WRAP;
};


struct VS_INPUT
{
float4 Pos : POSITION;
float3 Tex : TEXCOORD;
float3 Nor : NORMAL;
};

struct PS_INPUT
{
float4 Pos : SV_POSITION;
float4 WorldPos: WORLDPOSITION;
float3 Tex : TEXCOORD;
float3 Nor : NORMAL;
};


PS_INPUT vs_main(VS_INPUT Input)
{
PS_INPUT Out = (PS_INPUT)0;

Out.WorldPos = mul(Input.Pos,WorldMatrix);

Out.Pos = mul(mul(Out.WorldPos,ViewMatrix),ProjMatrix);
Out.Tex = Input.Tex;
Out.Nor = mul(Input.Nor,WorldMatrix);

return Out;
}

float4 ps_main(PS_INPUT In) : SV_TARGET
{
return Texture.Sample(SamplText,In.Tex);
}


technique10 peppe
{

Pass Simple
{
SetVertexShader( CompileShader( vs_4_0, vs_main() ) );
SetGeometryShader(NULL);
SetPixelShader( CompileShader( ps_4_0, ps_main() ) );
}

}

Semplice codice per acquisire il controllo delle variabili.

EffectData.Eye = shader->GetVariableByName("Eye")->AsVector();
EffectData.WorldMatrix =
shader->GetVariableByName("WorldMatrix")->AsMatrix();
EffectData.ViewMatrix =
shader->GetVariableByName("ViewMatrix")->AsMatrix();
EffectData.ProjMatrix =
shader->GetVariableByName("ProjMatrix")->AsMatrix();
EffectData.MeshTexture =
shader->GetVariableByName("Texture")->AsShaderResource();

Set dei dati

HRESULT p = EffectData.ViewMatrix->SetMatrix((float*)&View);
p = EffectData.WorldMatrix->SetMatrix((float*)&World);
p = EffectData.ProjMatrix->SetMatrix((float*)&Proj);
p = EffectData.Eye->AsVector()->SetFloatVector((float*)&Eye);

Risultato? E_FAIL,E_FAIL,E_FAIL,E_FAIL...

Non ho piu' idea di come fare.

11 Risposte

Davide Pasca

15/05/2009 03:03:07

0

On May 15, 5:42 am, "Vincent" <darkfren...@yahoo.it> wrote:
> Ho un semplicissimo shader:
[...]
>  EffectData.ProjMatrix =
> shader->GetVariableByName("ProjMatrix")->AsMatrix();
>  EffectData.MeshTexture =
> shader->GetVariableByName("Texture")->AsShaderResource();
>
> Set dei dati
>
>  HRESULT p = EffectData.ViewMatrix->SetMatrix((float*)&View);
>  p = EffectData.WorldMatrix->SetMatrix((float*)&World);
>  p = EffectData.ProjMatrix->SetMatrix((float*)&Proj);
>  p = EffectData.Eye->AsVector()->SetFloatVector((float*)&Eye);
>
> Risultato? E_FAIL,E_FAIL,E_FAIL,E_FAIL...

...ummm, non dovrebbe esserci problema.
Prova a controllare che la variabile sia valida fin dall'inizio:

EffectData.ProjMatrix = shader->GetVariableByName("ProjMatrix")-
>AsMatrix();

assert( EffectData.ProjMatrix->IsValid() == TRUE ); // valida ?

...in oltre assicurati che EffectData.ProjMatrix sia di tipo
ID3D10EffectMatrixVariable*

Per sicurezza prova anche senza cbuffers.

ummumm
Davide

Vincent

15/05/2009 13:10:20

0

IsValid ritorna tutto false, anche senza cbuffer.

"Davide Pasca" <dpasca@gmail.com> ha scritto nel messaggio
news:87cd4601-e488-4741-a04f-665c6e82e4e0@z8g2000prd.googlegroups.com...
On May 15, 5:42 am, "Vincent" <darkfren...@yahoo.it> wrote:
> Ho un semplicissimo shader:
[...]
> EffectData.ProjMatrix =
> shader->GetVariableByName("ProjMatrix")->AsMatrix();
> EffectData.MeshTexture =
> shader->GetVariableByName("Texture")->AsShaderResource();
>
> Set dei dati
>
> HRESULT p = EffectData.ViewMatrix->SetMatrix((float*)&View);
> p = EffectData.WorldMatrix->SetMatrix((float*)&World);
> p = EffectData.ProjMatrix->SetMatrix((float*)&Proj);
> p = EffectData.Eye->AsVector()->SetFloatVector((float*)&Eye);
>
> Risultato? E_FAIL,E_FAIL,E_FAIL,E_FAIL...

...ummm, non dovrebbe esserci problema.
Prova a controllare che la variabile sia valida fin dall'inizio:

EffectData.ProjMatrix = shader->GetVariableByName("ProjMatrix")-
>AsMatrix();

assert( EffectData.ProjMatrix->IsValid() == TRUE ); // valida ?

...in oltre assicurati che EffectData.ProjMatrix sia di tipo
ID3D10EffectMatrixVariable*

Per sicurezza prova anche senza cbuffers.

ummumm
Davide

Vincent

15/05/2009 13:10:40

0

Non vorrei che fosse un problema dei driver ATI...


"Davide Pasca" <dpasca@gmail.com> ha scritto nel messaggio
news:87cd4601-e488-4741-a04f-665c6e82e4e0@z8g2000prd.googlegroups.com...
On May 15, 5:42 am, "Vincent" <darkfren...@yahoo.it> wrote:
> Ho un semplicissimo shader:
[...]
> EffectData.ProjMatrix =
> shader->GetVariableByName("ProjMatrix")->AsMatrix();
> EffectData.MeshTexture =
> shader->GetVariableByName("Texture")->AsShaderResource();
>
> Set dei dati
>
> HRESULT p = EffectData.ViewMatrix->SetMatrix((float*)&View);
> p = EffectData.WorldMatrix->SetMatrix((float*)&World);
> p = EffectData.ProjMatrix->SetMatrix((float*)&Proj);
> p = EffectData.Eye->AsVector()->SetFloatVector((float*)&Eye);
>
> Risultato? E_FAIL,E_FAIL,E_FAIL,E_FAIL...

...ummm, non dovrebbe esserci problema.
Prova a controllare che la variabile sia valida fin dall'inizio:

EffectData.ProjMatrix = shader->GetVariableByName("ProjMatrix")-
>AsMatrix();

assert( EffectData.ProjMatrix->IsValid() == TRUE ); // valida ?

...in oltre assicurati che EffectData.ProjMatrix sia di tipo
ID3D10EffectMatrixVariable*

Per sicurezza prova anche senza cbuffers.

ummumm
Davide

Davide Pasca

16/05/2009 06:53:10

0

On May 15, 10:10 pm, "Vincent" <darkfren...@yahoo.it> wrote:
> IsValid ritorna tutto false, anche senza cbuffer.
>
> "Davide Pasca" <dpa...@gmail.com> ha scritto nel messaggionews:87cd4601-e488-4741-a04f-665c6e82e4e0@z8g2000prd.googlegroups.com...
[...]
> assert( EffectData.ProjMatrix->IsValid() == TRUE ); // valida ?

Sei sicuro che hai caricato lo shader giusto ;)

Non credo sia un problema di drivers perche' la gestione degli shaders
a questo livello e' probabilmente parte del codice della microsoft.
Dubito sia un bug, altrimenti avresti problemi con qualsiasi altra
cosa.. tipo anche solo gli esempi del DX SDK 8)

bauu
Davide

Vincent

16/05/2009 08:00:21

0

Alla fine ho risolto togliendo la chiamata a shader->Optimize() e come flag
mettendo SKIP_OPTIMIZATION

"Davide Pasca" <dpasca@gmail.com> ha scritto nel messaggio
news:a44ea55a-4006-4f3b-9777-ea117f392842@u9g2000pre.googlegroups.com...
On May 15, 10:10 pm, "Vincent" <darkfren...@yahoo.it> wrote:
> IsValid ritorna tutto false, anche senza cbuffer.
>
> "Davide Pasca" <dpa...@gmail.com> ha scritto nel
> messaggionews:87cd4601-e488-4741-a04f-665c6e82e4e0@z8g2000prd.googlegroups.com...
[...]
> assert( EffectData.ProjMatrix->IsValid() == TRUE ); // valida ?

Sei sicuro che hai caricato lo shader giusto ;)

Non credo sia un problema di drivers perche' la gestione degli shaders
a questo livello e' probabilmente parte del codice della microsoft.
Dubito sia un bug, altrimenti avresti problemi con qualsiasi altra
cosa.. tipo anche solo gli esempi del DX SDK 8)

bauu
Davide

Davide Pasca

16/05/2009 17:50:53

0

On May 16, 5:00 pm, "Vincent" <darkfren...@yahoo.it> wrote:
> Alla fine ho risolto togliendo la chiamata a shader->Optimize() e come flag
> mettendo SKIP_OPTIMIZATION

...in pratica stavi settando variabili dichiarate ma non usate.. e che
quindi il compilatore ha giustamente rimosso.
Ti consiglio di tenere le ottimizzazioni attivate e piuttosto non
indirizzare variabili che non sono effettivamente usate o, quanto
meno, far finta che esistano (lasciando che l'operazione fallisca).

maoooo
Davide

Davide Pasca

16/05/2009 18:07:47

0

On May 17, 2:50 am, Davide Pasca <dpa...@gmail.com> wrote:
> On May 16, 5:00 pm, "Vincent" <darkfren...@yahoo.it> wrote:
>
> > Alla fine ho risolto togliendo la chiamata a shader->Optimize() e come flag
> > mettendo SKIP_OPTIMIZATION
>
> ..in pratica stavi settando variabili dichiarate ma non usate.. e che
> quindi il compilatore ha giustamente rimosso.
> Ti consiglio di tenere le ottimizzazioni attivate e piuttosto non
> indirizzare variabili che non sono effettivamente usate o, quanto
> meno, far finta che esistano (lasciando che l'operazione fallisca).

...vedendo il sorgente originale, variabili tipo WorldMatrix sono
usate.
Ho trovato la definizione di Optimize() (
http://msdn.microsoft.com/en-us/librar...(VS.85).aspx ) ..ed
effettivamente pare tolga il tipo di informazioni dallo shader
necessarie per ottenere variabili per nome.
Non ho mai chiamato quel metodo e di norma non serve.. dal punto di
vista della performance non dovrebbe fare nessuna differenza, visto
che rimuove solo un po di informazioni di contorno.

D3D10_SHADER_SKIP_OPTIMIZATION invece fa influenza sulla performance,
perche' evita potenziali ottimizzazioni del codice.. cosa sconsigliata
a meno che uno non voglia debuggare lo shader.

...quindi Optimize() e SKIP_OPTIMIZATION sono due cose diverse. Ma di
norma e meglio non toccarle ;)

bauuuuuuu
Davide

Vincent

02/06/2009 22:26:26

0

Optimize può essere chiamato, ma dopo aver preso i riferimenti necessari,
che rimangono fortunatamente ancora validi.

"Davide Pasca" <dpasca@gmail.com> ha scritto nel messaggio
news:c4e67fcb-adf0-4c50-b91e-4cb627551186@18g2000prx.googlegroups.com...
On May 17, 2:50 am, Davide Pasca <dpa...@gmail.com> wrote:
> On May 16, 5:00 pm, "Vincent" <darkfren...@yahoo.it> wrote:
>
> > Alla fine ho risolto togliendo la chiamata a shader->Optimize() e come
> > flag
> > mettendo SKIP_OPTIMIZATION
>
> ..in pratica stavi settando variabili dichiarate ma non usate.. e che
> quindi il compilatore ha giustamente rimosso.
> Ti consiglio di tenere le ottimizzazioni attivate e piuttosto non
> indirizzare variabili che non sono effettivamente usate o, quanto
> meno, far finta che esistano (lasciando che l'operazione fallisca).

...vedendo il sorgente originale, variabili tipo WorldMatrix sono
usate.
Ho trovato la definizione di Optimize() (
http://msdn.microsoft.com/en-us/librar...(VS.85).aspx ) ..ed
effettivamente pare tolga il tipo di informazioni dallo shader
necessarie per ottenere variabili per nome.
Non ho mai chiamato quel metodo e di norma non serve.. dal punto di
vista della performance non dovrebbe fare nessuna differenza, visto
che rimuove solo un po di informazioni di contorno.

D3D10_SHADER_SKIP_OPTIMIZATION invece fa influenza sulla performance,
perche' evita potenziali ottimizzazioni del codice.. cosa sconsigliata
a meno che uno non voglia debuggare lo shader.

...quindi Optimize() e SKIP_OPTIMIZATION sono due cose diverse. Ma di
norma e meglio non toccarle ;)

bauuuuuuu
Davide

Davide Pasca

03/06/2009 03:56:18

0

On Jun 3, 7:26 am, "Vincent" <darkfren...@yahoo.it> wrote:
> Optimize può essere chiamato, ma dopo aver preso i riferimenti necessari,
> che rimangono fortunatamente ancora validi.

OK, ma a quel punto "optimize" non ha piu' nessun effetto pratico.. a
parte risparmiarti quei 3-4 K di info che rimangono in memoria di
sistema.

maooooo
Davide


>
> "Davide Pasca" <dpa...@gmail.com> ha scritto nel messaggionews:c4e67fcb-adf0-4c50-b91e-4cb627551186@18g2000prx.googlegroups.com...
> On May 17, 2:50 am, Davide Pasca <dpa...@gmail.com> wrote:
>
> > On May 16, 5:00 pm, "Vincent" <darkfren...@yahoo.it> wrote:
>
> > > Alla fine ho risolto togliendo la chiamata a shader->Optimize() e come
> > > flag
> > > mettendo SKIP_OPTIMIZATION
>
> > ..in pratica stavi settando variabili dichiarate ma non usate.. e che
> > quindi il compilatore ha giustamente rimosso.
> > Ti consiglio di tenere le ottimizzazioni attivate e piuttosto non
> > indirizzare variabili che non sono effettivamente usate o, quanto
> > meno, far finta che esistano (lasciando che l'operazione fallisca).
>
> ..vedendo il sorgente originale, variabili tipo WorldMatrix sono
> usate.
> Ho trovato la definizione di Optimize() (http://msdn.microsoft.com/en-us/librar...(VS.85).aspx) ..ed
> effettivamente pare tolga il tipo di informazioni dallo shader
> necessarie per ottenere variabili per nome.
> Non ho mai chiamato quel metodo e di norma non serve.. dal punto di
> vista della performance non dovrebbe fare nessuna differenza, visto
> che rimuove solo un po di informazioni di contorno.
>
> D3D10_SHADER_SKIP_OPTIMIZATION invece fa influenza sulla performance,
> perche' evita potenziali ottimizzazioni del codice.. cosa sconsigliata
> a meno che uno non voglia debuggare lo shader.
>
> ..quindi Optimize() e SKIP_OPTIMIZATION sono due cose diverse. Ma di
> norma e meglio non toccarle ;)
>
> bauuuuuuu
> Davide

Vincent

03/06/2009 08:18:22

0

Sono molto tirchio.

"Davide Pasca" <dpasca@gmail.com> ha scritto nel messaggio
news:b274962f-4984-42c7-9f92-bec524745b60@l28g2000vba.googlegroups.com...
On Jun 3, 7:26 am, "Vincent" <darkfren...@yahoo.it> wrote:
> Optimize può essere chiamato, ma dopo aver preso i riferimenti necessari,
> che rimangono fortunatamente ancora validi.

OK, ma a quel punto "optimize" non ha piu' nessun effetto pratico.. a
parte risparmiarti quei 3-4 K di info che rimangono in memoria di
sistema.

maooooo
Davide


>
> "Davide Pasca" <dpa...@gmail.com> ha scritto nel
> messaggionews:c4e67fcb-adf0-4c50-b91e-4cb627551186@18g2000prx.googlegroups.com...
> On May 17, 2:50 am, Davide Pasca <dpa...@gmail.com> wrote:
>
> > On May 16, 5:00 pm, "Vincent" <darkfren...@yahoo.it> wrote:
>
> > > Alla fine ho risolto togliendo la chiamata a shader->Optimize() e come
> > > flag
> > > mettendo SKIP_OPTIMIZATION
>
> > ..in pratica stavi settando variabili dichiarate ma non usate.. e che
> > quindi il compilatore ha giustamente rimosso.
> > Ti consiglio di tenere le ottimizzazioni attivate e piuttosto non
> > indirizzare variabili che non sono effettivamente usate o, quanto
> > meno, far finta che esistano (lasciando che l'operazione fallisca).
>
> ..vedendo il sorgente originale, variabili tipo WorldMatrix sono
> usate.
> Ho trovato la definizione di Optimize()
> (http://msdn.microsoft.com/en-us/librar...(VS.85).aspx) ..ed
> effettivamente pare tolga il tipo di informazioni dallo shader
> necessarie per ottenere variabili per nome.
> Non ho mai chiamato quel metodo e di norma non serve.. dal punto di
> vista della performance non dovrebbe fare nessuna differenza, visto
> che rimuove solo un po di informazioni di contorno.
>
> D3D10_SHADER_SKIP_OPTIMIZATION invece fa influenza sulla performance,
> perche' evita potenziali ottimizzazioni del codice.. cosa sconsigliata
> a meno che uno non voglia debuggare lo shader.
>
> ..quindi Optimize() e SKIP_OPTIMIZATION sono due cose diverse. Ma di
> norma e meglio non toccarle ;)
>
> bauuuuuuu
> Davide