Parameter setzen und nVidia Cg

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Gelöschter Benutzer
Beiträge: 92
Registriert: 26.02.2009, 22:09

Parameter setzen und nVidia Cg

Beitrag von Gelöschter Benutzer »

Hallo Leute, ich stehe gerade vor einem etwas "speziellem" Problem :). Folgendes:

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);
            }
            ...
        }
    }
}
Hier dazu ein Beispiel eines Cg-Codes:

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();
    }
}
Wie geschrieben, dass man nun den Effekt neu kompilieren muss kann ich mir nicht wirklich vorstellen. Ich hoffe, dass man mir auch nicht abließt, dass ich ein Cg-Neuling bin. Abgesehen davon, dass diese vollkommen OOP-frei ist, finde ich diese deutlich besser gelungen als die DirectX API - auch wenn Cg an sich selbst HLSL relativ nahe ähnelt.

Wenn euch was einfällt oder ihr mit dem Problem schon zu kämpfen hattet - immer her damit :) !
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Parameter setzen und nVidia Cg

Beitrag von Krishty »

Darf ich an dieser Stelle (ganz dreist ot ;) ) fragen, was der Vorteil von CG gegenüber HLSL ist? Ersteres ist, nach dem was ich im Internet gelesen habe, auf reinem C-Niveau, bietet also z.B. keine Klassen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Gene
Beiträge: 25
Registriert: 22.05.2003, 11:26

Re: Parameter setzen und nVidia Cg

Beitrag von Gene »

Muss man bei CG nicht ein 'uniform' vor den Variablen setzten die man selber festlegt?

also:
uniform float4x4 WVP : WorldViewProjection;

wobei ich das ganze als Paramter für die Funktion übergeben habe, also:

VS_OUT vs_main3(float3 pos : POSITION, float3 nor : NORMAL, uniform float4x4 worldViewProjection;);
Gelöschter Benutzer
Beiträge: 92
Registriert: 26.02.2009, 22:09

Re: Parameter setzen und nVidia Cg

Beitrag von Gelöschter Benutzer »

Ne :( uniform hilft leider nicht.

Ich hab das Projekt mal hochgestellt und lässt sich per SVN ziehen: https://bsgameengine.svn.sourceforge.ne ... gameengine .

Interessant sind hierbei die Dateien: bscgeffect.h und main.h

Ich hoffe das hilft mehr, denn ich vermute, dass ich irgendwo eine wichtige Zeile vergessen habe... :?

Danke für die Hilfe schonmal im Weiteren!

By the way:
Cg Shader haben den Vorteil, dass diese Plattformunabhängig sind. Sprich: Kanste mit OpenGL und DirectX laufen lassen. Klassen kann es nicht, aber ich denke das stört auch erstmal nicht...
Antworten