Ich habe mir ein OOP Framework für nVidia's Cg Framework geschrieben. Eigentlich funktioniert alles sehr schön, was erfreulich ist. Allerdings werden Parameter, die eigentlich gesetzt werden sollten, mal einfach nicht gesetzt :(.
Meine derzeitige vorgehensweise:
1. Effect erstellen (funktioniert wunderbar)
2. Technique rausholen (funktioniert wunderbar)
3. Variablen holen (funktioniert wunderbar, sogar mit Semantiken!)
4. Variablen setzen (funktioniert nicht :()
Jetzt muss ich die Kenner fragen, ob ich den Effekt neu kompilieren muss? Bis jetzt folgende Arbeitsweise bei den Variablen:
Vor RenderFrame:
(Effekt da, Technique da)
CGparameter holen (geht)
Wert zum Parameter setzen
RenderFrame:
CGpass setzen
Rendern mittels DirectX 10
CGpass entkoppeln
Hier ein Beispiel der Methode zum Setzen eines Matrixparameters:
Code: Alles auswählen
namespace BSE
{
namespace EFF
{
class EffectParameterCg
{
...
void SetMatrix(const D3DXMATRIX &Matrix)
{
cgSetMatrixParameterfr(_Parameter, (float*)&Matrix);
}
void Set(const float x, const float y, const float z, const float w)
{
cgSetParameter4f(_Parameter, x, y, z, w);
}
...
}
}
}
Code: Alles auswählen
float4x4 WVP : WorldViewProjection;
float4x4 W : World;
float4 color;
const float3 LD : LightDirection = float3(0.0f, 1.0f, 0.0f);
const float4 LDC : LightDiffuseColor = float4(1.0f, 1.0f, 1.0f, 1.0f);
const float4 LAC : LightAmbientColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
struct VS_OUT
{
float4 Pos : POSITION;
float4 Col : COLOR0;
};
VS_OUT vs_main(float3 pos : POSITION, float3 nor : NORMAL)
{
VS_OUT Out = (VS_OUT)0;
Out.Pos = float4(pos.xyz, 1.0);
Out.Col = color;
return Out;
}
VS_OUT vs_main2(float3 pos : POSITION, float3 nor : NORMAL)
{
VS_OUT Out = (VS_OUT)0;
Out.Pos = mul(float4(pos.xyz, 1.0), WVP);
Out.Col = float4(1.0f, 1.0f, 1.0f, 1.0f);
return Out;
}
VS_OUT vs_main3(float3 pos : POSITION, float3 nor : NORMAL)
{
VS_OUT Out = (VS_OUT)0;
Out.Pos = mul(float4(pos.xyz, 1.0), WVP);
float4 pkt = mul(W, float4(normalize(nor).xyz, 1.0f));
Out.Col = LAC + max(0, dot(pkt, LD)*LDC);
return Out;
}
float4 ps_main(VS_OUT Out) : COLOR
{
return Out.Col;
}
technique Render
{
pass p0
{
VertexProgram = compile vs_4_0 vs_main();
FragmentProgram = compile ps_4_0 ps_main();
}
}
technique Render2
{
pass p0
{
VertexProgram = compile vs_4_0 vs_main2();
FragmentProgram = compile ps_4_0 ps_main();
}
}
technique Render3
{
pass p0
{
VertexProgram = compile vs_4_0 vs_main3();
FragmentProgram = compile ps_4_0 ps_main();
}
}
Wenn euch was einfällt oder ihr mit dem Problem schon zu kämpfen hattet - immer her damit :) !