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

01.11.2011, 22:58

Mein erstes Dreieck

Wollte mich auch mal dran versuchen, mein eigenes Dreieck auf den Bildschirm zu bringen.
(Naja mehr oder weniger, ich hab mich schon in den Beispielprogrammen etwas bedient :) )

DirectX wird korrekt initialisiert, der Bildschirm wird vorm Zeichnen auf die von mit gewählte Farbe gebracht, nur das Dreieck will sich nicht zeigen.

Hier der etwas lange Code

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
74
75
#include "Scene.hpp"



Vertex Triangle [3];


void InitScene (PDIRECT3DDEVICE9 D3DD, const TempParams& Temp)
{
    D3DD->SetFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE);

    D3DD->SetRenderState (D3DRS_LIGHTING, false);
    D3DD->SetRenderState (D3DRS_CULLMODE, D3DCULL_NONE);
    D3DD->SetRenderState (D3DRS_DITHERENABLE, true);

    float Aspect = static_cast<float> (Temp.VideoModeWidth)
                  /static_cast<float> (Temp.VideoModeHeight);

    tbMatrixProjection (TB_DEG_TO_RAD (90.0f), Aspect, 0.1f, 100.0f);


    Triangle[0].Position = tbVector3 (0.0f, 1.0f, 0.0f);
    Triangle[1].Position = tbVector3 (1.0f, -1.0f, 0.0f);
    Triangle[2].Position = tbVector3 (-1.0f, -1.0f, 0.0f);
    Triangle[0].Color   = tbColor (1.0f, 0.0f, 0.0f);
    Triangle[1].Color   = tbColor (0.0f, 1.0f, 0.0f);
    Triangle[2].Color   = tbColor (0.0f, 0.0f, 1.0f);
}


void Render (PDIRECT3DDEVICE9 D3DD, float Time)
{
    tbMatrix Rotation (tbMatrixRotationY (TB_DEG_TO_RAD (90.0f * Time) ) );
    tbMatrix Translation (tbMatrixTranslation (tbVector3 (0.0f, 0.0f, 2.0f) ) );

    tbMatrix World (Rotation * Translation);
    D3DD->SetTransform (D3DTS_WORLD, (D3DMATRIX*)(&World) );
    
    D3DD->Clear (0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, 
                 D3DCOLOR_XRGB (25, 0, 70), 1.0f, 0);

    D3DD->BeginScene ();

    D3DD->DrawPrimitiveUP (D3DPT_TRIANGLELIST, 1, Triangle, sizeof (Vertex) );

    D3DD->EndScene ();

    D3DD->Present (0, 0, 0, 0);
}



void MessageLoop (PDIRECT3DDEVICE9 D3DD)
{
    MSG         Message;
    bool Active = true;

    ZeroMemory (&Message, sizeof(MSG) );

    while (Active == true)
    {
        while(PeekMessage (&Message, NULL, 0, 0, PM_REMOVE) )
            {
                TranslateMessage(&Message);
                DispatchMessage(&Message);  

                if(Message.message == WM_QUIT)
                {
                    Active = false;
                }   
            }

        Render (D3DD, 0.0f);
    }
}


Schlagt mich tod, wenn es irgendein primitiver Fehler ist :pinch:

Dazu noch ne andere Frage.

Wie kapsele ich den Vertex Array am besten?
Soll ich ihn von einer Funktion übergeben lassen oder ihn in einen namespace packen?

Achja, bevor sich jemand wundert.
Die Move-Funktion hab ich erstmal außen vor gelassen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

01.11.2011, 23:02

Du hast dein Dreieck in einer Ebene bei z = 0 platziert. Die near-plane deiner Projektionsmatrix liegt aber bei 0.1, was dazu führt, dass dein Dreieck weggeclipped wird. Pack das Dreieck mal z.B. an z = 1 und staune ;)

3

01.11.2011, 23:10

Negativ, egal welche z Werte ich eingebe, es erscheint trotzdem nicht :(

Abgesehen davon, müsste meine Translationsmatrix das schon erledigen?

4

01.11.2011, 23:30

Es ist doch zum Haareraufen, aufeinmal liefert CreateDevice einen Fehlerwert.


Ich weiß nicht, ob hier der Fehler liegt, eben hatte es noch funtioniert.

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
PDIRECT3DDEVICE9 InitD3DDevice (PDIRECT3D9 D3D, TempParams* Temp, HWND FocusWindow)
{
    PDIRECT3DDEVICE9 D3DD;
    D3DPRESENT_PARAMETERS PresentParams;
    DWORD MultiSamplingQuality = 0;

    ZeroMemory(&PresentParams, sizeof(D3DPRESENT_PARAMETERS));

    PresentParams.BackBufferWidth           = Temp->VideoModeWidth;
    PresentParams.BackBufferHeight          = Temp->VideoModeHeight;
    PresentParams.BackBufferFormat          = D3DFMT_X8R8G8B8;
    PresentParams.BackBufferCount           = 1;
    PresentParams.MultiSampleType           = GetHightestMultiSampling (D3D, &MultiSamplingQuality);
    PresentParams.MultiSampleQuality        = MultiSamplingQuality - 1;
    PresentParams.SwapEffect                = D3DSWAPEFFECT_DISCARD;
    PresentParams.hDeviceWindow             = FocusWindow;
    PresentParams.Windowed                  = true;
    PresentParams.EnableAutoDepthStencil    = true;
    PresentParams.AutoDepthStencilFormat    = D3DFMT_D24S8;
    PresentParams.Flags                     = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
    PresentParams.FullScreen_RefreshRateInHz  = Temp->VideoRefreshRate;
    PresentParams.PresentationInterval      = D3DPRESENT_INTERVAL_ONE;

    if (FAILED (D3D->CreateDevice (D3DADAPTER_DEFAULT, 
                                   D3DDEVTYPE_HAL, FocusWindow, 
                                   D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                   &PresentParams, &D3DD) ) )
    {
        MessageBox (FocusWindow, L"Error", L"Error", 0);
    }

    return D3DD;
}



Die selben Parameter funktionieren blendent mit dem Beispielprogramm, trotzdem gibts bei mir eine Fehlermeldung.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

01.11.2011, 23:35

Abgesehen davon, müsste meine Translationsmatrix das schon erledigen?

Sry, übersehen. Aber lass die Worldmatrix doch mal weg und setz die z-Werte direkt. Eine Fehlerquelle weniger...

Es ist doch zum Haareraufen, aufeinmal liefert CreateDevice einen Fehlerwert.

Wenn MultiSamplingQuality 0 ist, dann ist MultiSamplingQuality - 1 keine gute Idee ;)
D3DRS_DITHERENABLE kannst du dir übrigens sparen.

6

01.11.2011, 23:44

Zitat

Sry, übersehen. Aber lass die Worldmatrix doch mal weg und setz die z-Werte direkt. Eine Fehlerquelle weniger...
Die z-Werte habe ich schon direkt gesetzt, ändert aber nichts.

Zitat

Wenn MultiSamplingQuality 0 ist, dann ist MultiSamplingQuality - 1 keine gute Idee ;)
D3DRS_DITHERENABLE kannst du dir übrigens sparen.
MultiSamplingQuality sollte bei mir eigentlich 3 sein und 2 damit die maximal Stufe.
Aber stimmt, sollte man natürlich ändern :)

E: Ich habs erstml mit ner if-Abfrage gelöst, sowie den Wert einfach mal direkt gesetzt.
Totzdem kein Erfolg :|

7

01.11.2011, 23:53

Da fällt mir noch ein, im Debugger bekomm ich immer folgende Meldung, wenn ich den Wert der Variable D3DD wissen möchte:

__vfptr = CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden

Im Beispiel Programm ist das nicht so ?(

ProAmateur

Alter Hase

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

8

02.11.2011, 06:43

Also zu deinem Problem mit dem device Hab ich jez auch keine Idee, aber ich denke,
dass das Dreieck nicht angezeigt wird liegt daran, dass du die projektionsmatrix zwar erstellt hast,
sie aber nicht über SetTransform setzt.
Oder Hab ich das nur übersehen...
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

9

02.11.2011, 13:27

Ups, Tatsache, klar dass das nicht funktionieren kann :lol:

Mit CreateDevice gibt es aber immer noch Problem :(

Grad herausgefunden, die der Fehlerwert ist D3DERR_INVALIDCALL ist und auf einmal funktioniert das Programm perfekt, zumindest im Vollbildmodus. 8|

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Rexona for men« (02.11.2011, 13:45)


ProAmateur

Alter Hase

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

10

02.11.2011, 14:53

Im Fenstermodus etwa nit?!
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Werbeanzeige