[DX9, HLSL] Mesh wird nicht gerendert

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Droven
Beiträge: 25
Registriert: 05.03.2009, 09:48
Echter Name: David Lorenz
Wohnort: Dresden

[DX9, HLSL] Mesh wird nicht gerendert

Beitrag von Droven » 25.03.2009, 22:55

Hi an alle,

mal wieder macht mir die Shader-Programmierung unvorhersehbare Probleme. Problem diesmal ist, dass das Mesh der mit Hilfe des Effektes gerendert wird eben nicht angezeigt wird.
Aber Code sagt mehr als tausend Worte:
Hier die .Fx Datei:

Code: Alles auswählen

//--------------------------
//--- Globals --------------
//--------------------------

float4x4 matWorldViewProj;
float3x3 matRotation;
texture tex0;

sampler DiffuseTex = sampler_state
{
    texture = (tex0);
    MIPFILTER = LINEAR;
    MINFILTER = LINEAR;
    MAGFILTER = LINEAR;
};
//--------------------------
//---  Vertex Shader -------
//--------------------------

struct VS_OUTPUT
{
    float4 vPos    : POSITION;
    float2 vTex0   : TEXCOORD0; 
    float3 vNormal : TEXCOORD1;
   
};

VS_OUTPUT VS(float4 vPosition : POSITION,
             float3 vNormal   : NORMAL,
             float2 vTexCoord : TEXCOORD0)
{
    VS_OUTPUT OUT =(VS_OUTPUT)0; 
    OUT.vPos = mul(matWorldViewProj, vPosition);
    OUT.vNormal = mul(matRotation, vNormal);
    OUT.vTex0 = vTexCoord;
    return OUT;
}

float4 PS(float2 vTex0 : TEXCOORD0) : COLOR
{
    return tex2D(DiffuseTex, vTex0);
}
//---------------------------
//--- Techniken -------------
//---------------------------

technique tec0
{
    pass p0
    {
        //Vertexshader
        VertexShader = compile vs_1_1 VS();
        //Pixelshader
        PixelShader  = compile ps_2_0 PS(); 
    }
}
Die 2 Matricen und die Textur werden hier übergeben und dann wird gerendert:

Code: Alles auswählen

	//Matricen
	//welt sicht und projektions matrix
	MATRIX	matWorldViewProj, matWorldIT;
	matWorldViewProj = maWorld*view*proj;
	
	//Berechnungen an Effekt geben
	bumpMapping.GetEffect()->SetMatrix("matWorldViewProj", &matWorldViewProj);
	bumpMapping.GetEffect()->SetMatrix("matRotation", &maRotate);
       if(textures[i])
		bumpMapping.GetEffect()->SetTexture("tex0", textures[i]);
	//zeichenvorgang
	bumpMapping.BeginEffect();
	for(DWORD j = 0; j < bumpMapping.GetNumPasses(); j++)
		{
			bumpMapping.BeginPass(j);
			HRESULT hr = mesh->DrawSubset(i);
			bumpMapping.EndPass();
		}
	bumpMapping.EndEffect();

Angezeigt wird nichts. Der Debugger auf höchster Stufe bringt auch keine Fehler, auch Shader Debug habe ich aktiviert.
Außerdem habe ich geprüft, ob die richtigen Werte an den Effekt übergeben werden. Dies ist auch der Fall.

Sieht jemand einen Fehler in der Shaderdatei oder im Code?

MfG Droven

Benutzeravatar
Zudomon
Establishment
Beiträge: 2127
Registriert: 25.03.2009, 08:20
Kontaktdaten:

Re: [DX9, HLSL] Mesh wird nicht gerendert

Beitrag von Zudomon » 25.03.2009, 23:23

Ist zwar nicht direkt eine Lösung zu deinem Problem, aber versuch mal das NVidia PerfHUD bei dir ein zu bauen... da kannst du dann schauen, ob das Mesh richtig gebunden ist und alles fehlerfrei ausgeführt wird.

Liegt es denn sicher am Effekt? Also funktionierte es vorher?

Droven
Beiträge: 25
Registriert: 05.03.2009, 09:48
Echter Name: David Lorenz
Wohnort: Dresden

Re: [DX9, HLSL] Mesh wird nicht gerendert

Beitrag von Droven » 25.03.2009, 23:28

Danke für die schnelle Antwort.
Jap ohne Effekt wird alles perfekt dargestellt.
Ich werd mir das NVidia PerfHUD trotzdem mal einbauen.

MfG Droven

Dirk Schulz
Establishment
Beiträge: 130
Registriert: 01.03.2009, 15:21
Alter Benutzername: frittentuete

Re: [DX9, HLSL] Mesh wird nicht gerendert

Beitrag von Dirk Schulz » 26.03.2009, 00:23

hi,

eigentlich wird in DX9/HLSL immer der Vektor mit der Matrix multipliziert. Oder nutzt du OpenGl-Matrizen?

Wenn nicht, dann einfach mal so versuchen:

Code: Alles auswählen

OUT.vPos = mul(vPosition, matWorldViewProj);
für die Normalen auch so, aber zumindest dürfte dann was angezeigt werden.

frittentuete

Droven
Beiträge: 25
Registriert: 05.03.2009, 09:48
Echter Name: David Lorenz
Wohnort: Dresden

Re: [DX9, HLSL] Mesh wird nicht gerendert

Beitrag von Droven » 26.03.2009, 09:34

eigentlich wird in DX9/HLSL immer der Vektor mit der Matrix multipliziert.
Jap. So hatte ich es vorher und dann habe ich ein wenig im Internet rumgesucht und diese Variante gefunden und ausprobiert.

So ich habe es ausprobiert und es funktioniert. Dennoch verstehe ich den Fehler selber nicht. Bei anderen Shader war es auch anders rum. Ich weiß, dass es sich bei einer Variante um einen Spalten und bei der anderen um einen Zeilenvektor handelt, wahrscheinlich lags irgendwie daran.

Danke für die Hilfe;)

MfG Droven

Benutzeravatar
Schrompf
Moderator
Beiträge: 3960
Registriert: 26.02.2009, 00:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9, HLSL] Mesh wird nicht gerendert

Beitrag von Schrompf » 26.03.2009, 13:59

Der Vektor ist schnuppe, der wird zu Zeilenform oder Spaltenform, wie's halt nötig ist. Die Matrix ist das entscheidende. Manche Tutorials verlassen sich auf die row_major Standardeinstellung des HLSL-Compilers und transponieren ihre Matrizen dann vorher, falls nötig. Andere spezifizieren ihre Matrizen bewusst als column_major im Shader und müssen halt evtl. auch transponieren. Der Unterschied macht sich dann bei der Multiplikation im Shader bemerkbar - in der einen Form braucht es ein mul(vec, mat), in der anderen Form ein mul(mat, vec).
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.

Antworten