Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

1

11.11.2013, 16:14

Probleme mit meinem ersten kleinen VertexShader [gelöst]

Liebe Leser

Ich Programmiere grade meiner ersten kleinen Vertex Shader.
Er soll einfach nur die Vertizen Transformieren.
Beleuchtung und andere zusätzliche Dinge kommen später.

Der Shader Effekt befindet sich im der Modelldatei. (Im Effecte Chunk des Models)

Wenn ich Das Modell Normal Rendere. Also ohne den Shader zu kompilieren, ist alles normal.
Das Objekt schwebt vor der Kamera.

Wenn ich nun den Shader Kompiliere Verschwindet das Objekt. Es ist nicht mehr da.
Das Shader etwas bewirkt weis ich nun. nur irgendetwas ist falsch.

// Hir die Funktion die die den Shader die Matrizen gibt und das Modell Rendert. Sie Wird in der Renderfunktion Aufgerufen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
tbResult CPart1::SetShader() 
{ 
// D3D Reverenz 
tbDirect3D &D3D = tbDirect3D::Instance(); 
// Matrizen Initialisieren 
m_Prj = gp_Main->mp_Game->m_Projection; // Projektionsmatrix 
m_Cam = gp_Main->mp_Game->m_Camera; // KameraMAtrix 
m_Trans = tbMatrixTranslation(tbVector3(0.0f,-14.0,0.0f)); // Transformation 
m_Rot = tbMatrixRotation(tbVector3(0.0f,0.0f,0.0f)); // Rotation 
m_Scl = tbMatrixScaling(tbVector3(1.0f,1.0f,1.0f)); // Scalierung 

// WeltMatrix / WeltSicht Matrix 
m_World = m_Scl * m_Rot * m_Trans; // Weltmatrix erstellen 
m_WorldCam = m_World * m_Cam; // WeltSicht MAtrix erstellen (Weltmatrix * CameraMatrix) 
// Matrizen an Shader Senden 
mp_Kugel->GetEffects()->pEffect->GetEffect()->SetMatrix("WorldViewMatrix",(D3DXMATRIX*)&m_WorldCam); // WeltSicht Matrix an Shader Senden 
mp_Kugel->GetEffects()->pEffect->GetEffect()->SetMatrix("ProjectionMatrix",(D3DXMATRIX*)&m_Prj); // Projektion an Shader Senden 

// Das Modell Rendern 
mp_Kugel->Render();return TB_OK; 
}





// Hir der Shader.

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
DWORD NumTextures = 0; 
  
// Ein Kleiner Vertexshader 
float4x4 WorldViewMatrix; // m_World * m_Cam 
float4x4 ProjectionMatrix; 
  
// VertexStruktur 
struct SVertexShaderOut 
{ 
float4 Position : POSITION; 
float2 Texture : TEXCOORD0; 
float4 Diffuse : COLOR0; 
float3 Normal : NORMAL; 
}; 
// VertexShader 
SVertexShaderOut VertexShaderMain( 
float4 InPosition : POSITION, 
float3 InNormal : NORMAL, 
float2 InTexture : TEXCOORD0, 
float4 InDiffuse : COLOR0 ) 
{ 
SVertexShaderOut Output = (SVertexShaderOut) (0); 
//POSITION MIT WELT-SICHT UND PROJEKTION TRANSFORMIEREN 
float3 Pos = mul(InPosition,(float4x3)(WorldViewMatrix));Output.Position = mul(float4(Pos,1.0f),ProjectionMatrix); 
// TEXTURE 
Output.Texture = InTexture; 
// Normalvector Transformieren 
float3 Normal = mul(InNormal,(float3x3)(WorldViewMatrix)); 
Output.Normal = Normal; 
Output.Diffuse = InDiffuse; 
return Output; 
} 
  
TECHNIQUE T1 
{ 
PASS P1 
{ 
// Materialeinstellungen 
MaterialDiffuse = {0.500f, 0.500f, 0.900f, 1.000f}; 
MaterialAmbient = {0.200f, 0.200f, 0.200f, 0.000f}; 
MaterialEmissive = {0.000f, 0.000f, 0.000f, 0.000f}; 
MaterialSpecular = {0.000f, 0.000f, 0.000f, 0.000f}; 
MaterialPower = 100.000f; 
VertexShader = compile vs_3_0 VertexShaderMain(); 
} 
}

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Sebastian Müller« (12.11.2013, 14:46)


Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

2

11.11.2013, 21:18

Hallo,

ich gibst du "Pos" in den PixelShader?

Sorry nicht gesehen, da stehen 2 Anweisungen in einer Zeile. ^^ Ich schaue weiter.

EDIT

Eins kann ich aber schon anmerken, du kann auch deine Matrizen an den Shader senden und lass ihn diese multiplizieren, denn der kann das viel besser als die CPU.

EDIT2

Was mir auch noch aufgefallen ist, dass du gar keinen Pixel Shader implementiert hast. Ich hätte zumindest ein

HLSL-Quelltext

1
2
3
float4 pixelPS(): COLOR{
 return float4(0.0f,0.0f,0.0f,1.0f);
}


erwartet. Denn der Rückgabewert den du in deinem VS zurück gibst muss ja von irgend jemanden verarbeitet werden.

EDIT3
Wäre auch gut wenn du noch den Schritt zeigen würdest wo du den Shader initialisierst. Ich sehe auch gerade, dass du gar keinen FillMode angegeben hast bei der technique. Du solltest hier auch von 0 anfangen zu zählen.

Gruß

Fb

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »Fireball« (11.11.2013, 21:47) aus folgendem Grund: Edit


  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

3

12.11.2013, 14:45

Vielen Dank

Vielen Vielen Dank

Es Funktioniert nun Endlich. Das Objekt wird Vom Vertex Shader korrekt Transformiert und vom Pixelshader angemalt.

Vielen Dank. :) :) :)

Werbeanzeige