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

1

12.01.2011, 22:56

Vertex wird nicht gezeichnet

Hallo Spieleprogrammierer Community,

ich habe es endlich geschafft und ein paar Klassen soweit zusammengebaut dass ich ein schönes Device Initialisieren kann und quasi alles bereit ist zum Zeichnen (natürlich alles an der TriBaseEngine orientiert).

Mein Problem ist nur leider dass ich einfach kein Dreieck zu Gesicht bekommen. Habe schon ein dutzend mal alles geändert, und so wie es im Buch steht neu geschrieben :-(.

Vielleicht seht ihr ja meinen Fehler. Das sollten die Methoden sein wo irgendetwas schiefgeht.:

C-/C++-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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
void InitScene()
{
    // Vertize Mode
    HRESULT result = manager.DeviceInterface->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);

    //
    // Set Render States
    //
    manager.DeviceInterface->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); 
    manager.DeviceInterface->SetRenderState(D3DRS_LIGHTING, false); 
    manager.DeviceInterface->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    manager.DeviceInterface->SetRenderState(D3DRS_DITHERENABLE, true);

    float aspectRatio = (float)manager.CurrentDisplayMode->Width / (float)manager.CurrentDisplayMode->Height;   

    // Projectionsmatrix erstellen
    ue_Matrix projection =  ue_MatrixProjection(UE_DEG_TO_RAD(90.0f ),aspectRatio,0.1f,100.0f);
    
    result = manager.DeviceInterface->SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)(&projection.ToD3DMatrix()));       
}

ueResult Render(float time)
{   
    ue_Matrix rotation;
    ue_Matrix translation;
    ue_Matrix world;

    // Create Matrix    
    rotation = ue_MatrixRotationY(UE_DEG_TO_RAD(90));
    translation = ue_MatrixTranslation(ue_Vector3(0.0f, 0.0f,2.0f));
    world =  translation * rotation;    
    
    HRESULT result1 = manager.DeviceInterface->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&world.ToD3DMatrix()));   

    // Clear Buffers and Device
    HRESULT result ;
    result = manager.DeviceInterface->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 64,0,0),1.0f,0);
    

    // Begin Scene
    result = manager.DeviceInterface->BeginScene(); 
    
    // My new Scene
    {   
        InitScene();

        Vertex aTriangle[3];        
        
        aTriangle[0].Color =  D3DCOLOR_ARGB(0, 0,255,0);
        aTriangle[0].Position.x = -2.0f;
        aTriangle[0].Position.y = 1.0f;
        aTriangle[0].Position.z = 1.0f;

        
        aTriangle[1].Color =  D3DCOLOR_ARGB(0, 255,0,0);
        aTriangle[1].Position.x = 0.0f;
        aTriangle[1].Position.y = 1.0f;
        aTriangle[1].Position.z = 1.0f;

        
        aTriangle[2] .Color =  D3DCOLOR_ARGB(0, 0,0,255);
        aTriangle[2] .Position.x = 2.0f;
        aTriangle[2] .Position.y = 1.0f;
        aTriangle[2] .Position.z = 1.0f;

        
        result = manager.DeviceInterface->DrawPrimitiveUP(D3DPT_TRIANGLELIST,3,aTriangle,sizeof(Vertex));   
    }
    result = manager.DeviceInterface->EndScene();
    result = manager.DeviceInterface->Present(NULL,NULL,NULL,NULL);
    
    return UE_OK;
}


Vielen Vielen Dank schonmal für eure Hilfe. Ich verzweifel hier gerade....

Gruß SirMarley

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.01.2011, 23:35

C-/C++-Quelltext

1
world =  translation * rotation;

Ich vermute dass du das eigentlich anders rum willst ;)
So jedenfalls rotiert dein ganzes Dreieck im Abstand 2 um 90° um den Ursprung und liegt dann natürlich außerhalb deines Sichtfeldes.
Generell vielleicht ein Tipp: Wenn du nurmal checken willst ob überhaupt etwas gerendert wird dann lass solche Dinge wie irgendwelche komplizierten Transformationen einfach mal weg und render nurmal was wo du auch sicher sein kannst dass es schonmal rein geometrisch auch am Bildschirm landet. So Zeug ist da nur eine zusätzliche Fehlerquelle. Du glaubst gar nicht wie viele Stunden manch einer ( :whistling: ) schon damit verbracht hat rauszufinden warum etwas nicht gerendert wird was die Kamera nichtmal annähernd angeschaut hat ;)

das D3DRS_DITHERENABLE kannst du dir übrigens ziemlich schenken, außer du renderst wirklich in 16bit oder noch weniger Farben. Wenn ja muss ich dich Fragen ob du dafür auch wirklich gute Gründe (Hardware aus dem vorigen Jahrtausend?) hast.

Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von »dot« (12.01.2011, 23:51)


3

13.01.2011, 09:34

Vielen Dank erstmal für den Hinweis. Leider hilft es nicht wenn ich erst rotiere und danach verschiebe. Verstehe auch nicht 100%ig warum das Dreieck dann aus dem Sichtbereich fallen sollte.

Ich verstehe das aber doch generell richtig: Wenn ich keine der Matrizen (World, Projection, Camera) setze, werden diese auf die Identitätsmatrix gesetzt. Trotzdem müsste mein Dreieck dann doch normal gezeichnet werden. Wenn ich in meinem Code aber keine World und Projectionmatrix setze wird mir das Dreieck trotzdem nicht angezeigt.

Gruß gamer1208

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

4

13.01.2011, 09:59

Du setzt deine Vertexfarbe auf

C-/C++-Quelltext

1
D3DCOLOR_ARGB(0, 255,0,0);


Auch wenn Blending nicht enabled ist, bin ich mir nicht sicher wie das Verhalten aussieht wenn deine Vertexe einen AlphaWert von 0 haben. Was passiert wenn du die erste 0 jeweils durch 255 ersetzt?

Und wie schaut deine VierMatrix aus? Muss die nicht auch gesetzt werden?

mfg Mark

Edit: Dein Triangle ist eine Linie, ich kenne grade nicht das Rasterisierungsverhalten von DirectX auswendig, aber was passiert wenn man eine Fläche von 0 befüllen muss? Kann durchaus sein das hier nichts gerendert wird.

Hier kann man sehen was ich meine:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
aTriangle[0].Position.y = 1.0f;
        aTriangle[0].Position.z = 1.0f;

        aTriangle[1].Position.y = 1.0f;
        aTriangle[1].Position.z = 1.0f;

        
        aTriangle[2] .Position.y = 1.0f;
        aTriangle[2] .Position.z = 1.0f;

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DerMark« (13.01.2011, 10:06)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

13.01.2011, 10:18

Du setzt deine Vertexfarbe auf

C-/C++-Quelltext

1
D3DCOLOR_ARGB(0, 255,0,0);


Auch wenn Blending nicht enabled ist, bin ich mir nicht sicher wie das Verhalten aussieht wenn deine Vertexe einen AlphaWert von 0 haben.

Der Alpha-Wert wird komplett in der Rechnung ignoriert, falls Blending nicht enabled ist, was äquivalent ist zu einem Alpha-Wert von 1.0, bzw. 255.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

6

13.01.2011, 10:38

@BlueCobold: Danke, gut zu wissen. :)

Was mir noch einfällt, dank eines anderen Threads, wie genau ist deine VertexStruktur aufgebaut?

7

13.01.2011, 10:46

Hier mein Vertex Struct: (Bin mir nicht sicher was ich als Typ für die Color genommen habe)

C-/C++-Quelltext

1
2
3
4
5
struct Vertex
{
ue_Vector3 vector,
Color color
};




Gruß gamer1208

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

13.01.2011, 15:15

Verstehe auch nicht 100%ig warum das Dreieck dann aus dem Sichtbereich fallen sollte.



(Link)


;)


Ich verstehe das aber doch generell richtig: Wenn ich keine der Matrizen (World, Projection, Camera) setze, werden diese auf die Identitätsmatrix gesetzt. Trotzdem müsste mein Dreieck dann doch normal gezeichnet werden.

Je nachdem was du unter "normal gezeichnet" verstehst...

Auch wenn Blending nicht enabled ist, bin ich mir nicht sicher wie das Verhalten aussieht wenn deine Vertexe einen AlphaWert von 0 haben.

Sollte normal egal sein, aber schadet sicher nicht das gleich richtig zu machen...

Und wie schaut deine VierMatrix aus? Muss die nicht auch gesetzt werden?

Wenn die nicht gesetzt ist dann ist die einfach Identitiy...

Edit: Dein Triangle ist eine Linie, ich kenne grade nicht das Rasterisierungsverhalten von DirectX auswendig, aber was passiert wenn man eine Fläche von 0 befüllen muss? Kann durchaus sein das hier nichts gerendert wird.

Stimmt, das ist sogar ganz sicher das Problem.

Bin mir nicht sicher was ich als Typ für die Color genommen habe

Das wär aber gut zu wissen weil es ist jetzt nicht gerade so dass das keine Rolle spielen würde...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (13.01.2011, 15:22)


9

13.01.2011, 15:40

Vielen Dank schonmal dot für die Erklärung.

Ist es also so, dass ich durch meine Projektionsmatrix
(

C-/C++-Quelltext

1
ue_MatrixProjection(UE_DEG_TO_RAD(90.0f ),aspectRatio,0.1f,100.0f);
)
von oben auf das ganze gucke ? Dann ist mir natürlich auch klar warum mein Dreieck nur eine Linie ist.

Warum ist es wichtig den Typen für die Color zu wissen ? Ich denke das Problem ist dass mein Dreieck nur eine Linie ist ?!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

13.01.2011, 15:42

Ist es also so, dass ich durch meine Projektionsmatrix [...] von oben auf das ganze gucke ? Dann ist mir natürlich auch klar warum mein Dreieck nur eine Linie ist.

Nunja, da du keine ViewMatrix gesetzt hast wird eben "normal gezeichnet" ;)
Das bedeutet dass deine Kamera entlang der positiven z-Achse blickt wobei die x-Achse nach rechts und die y-Achse nach oben zeigt. Mit den Koordinaten aus deinem Code oben ist dein Dreieck aber so oder so tatsächlich nur eine Linie, egal von wo man es anschaut.

Werbeanzeige