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

Ashnarott

Frischling

  • »Ashnarott« ist der Autor dieses Themas

Beiträge: 57

Beruf: Student Maschinenbau

  • Private Nachricht senden

11

04.12.2007, 20:21

Oh man so langsam bin ich am verzweifeln...jetzt läuft zwar alles und er lädt den effekt auch...aber irgendwie ist mein ganzes Bild nur rot. Habs auch schon mit g_pEffect->SetValue() probiert. Das selbe Ergebnis. Wo ist mein Fehler?
Hat jemand vill ne gute Tutorialseite für Shader. Wo auch gezeigt wird wie man das in C++ einbindet. Beim goggeln finde ich nämlich nichts gscheites...

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
    //Die Projektionsmatrix erzeugen

    tbMatrix mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f),   //Sichtverhältnis 90°

                                              fAspect,                //Bildseitenverhältnis

                                              0.1f,                   //Nahe  Clipping-Ebene

                                              100.0f);                //Ferne Clipping-Ebene



    //Projektionsmatrix erzeugen

    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));
    g_pEffect->SetMatrix("Projection", (D3DXMATRIX*)(&mProjection));



    //Kamermatrix

    mCamera = tbMatrixCamera(tbVector3(0.0f, 0.0f, 0.0f), tbVector3(0.0f, 0.0f, 1.0f), tbVector3(0.0f, 1.0f, 0.0f));
    //Kameramatrix setzen

    g_pD3DDevice->SetTransform(D3DTS_VIEW, (D3DXMATRIX*)(&mCamera));
    
    //Translationsmatrix

    mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 60.0f));

    

    //WorldView matrix setzen

    g_pEffect->SetMatrix("WorldView",(D3DXMATRIX*)(&(mTranslation*mCamera)));


    unsigned int uiNumPasses;
    g_pEffect->Begin(&uiNumPasses, 0);
        // Für jeden Durchgang...

    for(unsigned int uiPass = 0; uiPass < uiNumPasses; uiPass++)
    {
        // Einstellungen aktivieren

        g_pEffect->BeginPass(uiPass);

        // Modell rendern

        g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mTranslation));
        g_pModel->DrawSubset(0);

        g_pEffect->EndPass();
    }

@TrommlBomml: Deine Signatur ist einfach mal sau lustig :D:D

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

12

04.12.2007, 22:01

wie kann denn das bild rot sein? passiert das nur, wenn du den shader nutze oder hast du die clearfarbe auf rot gestellt?

13

04.12.2007, 22:52

Warum hast du das auskommentiert?

C-/C++-Quelltext

1
g_pEffect->EndPass(); 

14

05.12.2007, 09:10

Wahrscheinlich "klebt" dein Objekt an der Kamera.

C-/C++-Quelltext

1
2
// Modell rendern

g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mTranslation)); 

Hier setzt du erst die Weltmatrix, nachdem sie du weiter oben schon an den Shader übergeben hast?

C-/C++-Quelltext

1
2
//WorldView matrix setzen

g_pEffect->SetMatrix("WorldView",(D3DXMATRIX*)(&(mTranslation*mCamera))); 


Ich würde erstmal die notwendigen Transformationen erledigen und dann gesammelt an den Shader übergeben:
Setze ProjectionMatrix
Setze ViewMatrix
Setze WorldMatrix
Erstelle WorlViewMatrix = World * View
und ab dafür...

C-/C++-Quelltext

1
2
g_pEffect->SetMatrix("Projection", &mProjection);
g_pEffect->SetMatrix("WorldView", &WorlViewMatrix);


BTW, Wo ist eigentlich der Aufruf von g_pEffect->SetTechnique("T1"); ?

Oh je...

Ashnarott

Frischling

  • »Ashnarott« ist der Autor dieses Themas

Beiträge: 57

Beruf: Student Maschinenbau

  • Private Nachricht senden

15

05.12.2007, 14:30

@BlackSnake: die Clearfarbe ist auf schwarz und es passiert nur wenn der Effekt aktiviert ist
@TrikkieMikkie: Das mit den auskommentieren war ein versehen und SetTechnique hab ich schon in InitScene aufgerufen. Hätte ich posten sollen tut mir leid.


Ich hab jetzt alles nacheinander gemacht und auch erst die Matrizen an Direct3D übergeben und dann an den Effekt. Das Ergebnis ist das selbe. Roter Screen, wenn ich die GlowFarbe beim Effekt änder ändert sich auch die Farbe meines Bildes. Also muss es was mit dem Effekt oder dessen Einbindung zu tun haben, weil wenn ich ihn deaktivier wird alles normal angezeigt.


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
    //Das Bildseitenverhältnis berechnen

    float fAspect = (float)(g_Direct3DParameters.VideoMode.Width)
                   /(float)(g_Direct3DParameters.VideoMode.Height);



    //Die Projektionsmatrix erzeugen

    tbMatrix mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f),   //Sichtverhältnis 90°

                                              fAspect,                //Bildseitenverhältnis

                                              0.1f,                   //Nahe  Clipping-Ebene

                                              100.0f);                //Ferne Clipping-Ebene








    //Den Bildpuffer und den Z-Buffer leeren

    if(FAILED(hResult = g_pD3DDevice->Clear(0, NULL,
                                            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                            D3DCOLOR_XRGB(0, 0, 0),
                                            1.0f, 0)))
    {
        //Fehler beim leeren

        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }


    //Szene beginnen

    g_pD3DDevice->BeginScene();


    //Kamermatrix

    mCamera = tbMatrixCamera(tbVector3(0.0f, 0.0f, 0.0f), tbVector3(0.0f, 0.0f, 1.0f), tbVector3(0.0f, 1.0f, 0.0f));

    //Translationsmatrix

    mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 60.0f));

    //WorldView Matrix

    mWorldView = mCamera * mTranslation;

    //Projektionsmatrix setzen

    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));
    //Kameramatrix setzen

    g_pD3DDevice->SetTransform(D3DTS_VIEW, (D3DXMATRIX*)(&mCamera));
    //Weltmatrix setzen

    g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mTranslation));


    //WorldView matrix setzen

    g_pEffect->SetMatrix("WorldView", (D3DXMATRIX*)(&mWorldView));
    g_pEffect->SetMatrix("Projection", (D3DXMATRIX*)(&mProjection));


    unsigned int uiNumPasses;
    g_pEffect->Begin(&uiNumPasses, 0);
        // Für jeden Durchgang...

    for(unsigned int uiPass = 0; uiPass < uiNumPasses; uiPass++)
    {
        // Einstellungen aktivieren

        g_pEffect->BeginPass(uiPass);

        // Modell rendern

        g_pModel->DrawSubset(0);

        g_pEffect->EndPass();
    }


    //Szene beenden

    g_pD3DDevice->EndScene();

    //Der große Moment: den Bildpuffer sichtbar machen

    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

16

05.12.2007, 14:37

Analog zu g_pEffect->Begin(&uiNumPasses, 0); braucht es auch einen g_pEffect->End(); Das hast du ausgelassen.
Ansonsten tipp ich darauf, daß deine Matrizen nicht stimmen...

Edit/Nachtrag:
Hast du D3DXMatrixLookAtLH und D3DXMatrixPerspectiveFovLH
zuförderst irgendwo ausgeführt?

Und das da:

C-/C++-Quelltext

1
2
//WorldView Matrix

mWorldView = mCamera * mTranslation; 


sollte nach dem da kommen:

C-/C++-Quelltext

1
2
3
4
5
6
//Projektionsmatrix setzen

g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));
//Kameramatrix setzen

g_pD3DDevice->SetTransform(D3DTS_VIEW, (D3DXMATRIX*)(&mCamera));
//Weltmatrix setzen

g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mTranslation)); 

Ashnarott

Frischling

  • »Ashnarott« ist der Autor dieses Themas

Beiträge: 57

Beruf: Student Maschinenbau

  • Private Nachricht senden

17

05.12.2007, 14:48

kann das dran liegen das ich von tbMatrix auf D3DXMATRIX konvertiere?
habs auch schon probiert mit:

C-/C++-Quelltext

1
2
3
4
D3DMATRIX mWorld;
...
GetTransform(D3DTS_WORLD, &mWorld);
g_pEffect->SetMatrix(...


damit ich nicht mit tbMatrix arbeite. Hat aber auch nicht funktioniert.

Also D3DXMatrixLookAtLH und das andere hab ich noch nirgends ausgeführt.

Edit: Hab die nWorldView jetzt nach dem setzen der Transformationen in Direct3D berechnet. Immer noch das selbe

Ashnarott

Frischling

  • »Ashnarott« ist der Autor dieses Themas

Beiträge: 57

Beruf: Student Maschinenbau

  • Private Nachricht senden

18

10.12.2007, 17:41

Mhmm da anscheinend keiner eine Antwort auf mein Problem weiß, trotzdem danke für die Hilfe ;) , hat vieleicht irgendjemand eine Ahnung wo es ein gutes Tutorial gibt oder sollte man sich da eher gleich n Buch kaufen?

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

19

10.12.2007, 17:48

das erzeugen von der worldview ist egal wo du das auführst. hauptsache vor dem übergeben an den shader. weil die veränderst die beiden matrizen (world, camera) nicht. es wird ja eine neue erzeugt...

edit:
wenn du nen normalen projectionsshader nimmst, der geht oder geht dieser auch nicht?

20

10.12.2007, 18:05

Ähm, Antworten haste ja einige bekommen. Hast du die letzten vorgeschlagenen Dinge (D3DXMatrixLookAtLH usw.) noch ausprobiert?
Hast du das Beispiel aus Davids Buch? Wenn ja, welche Auflage, welches Kapitel, welche Seite?

Buch kaufen ist eine gute Idee! Hier gibts ein recht gutes (englisches) Einsteiger-Buch zum Thema Shaderprogrammierung: http://www.moon-labs.com/ml_book2.htm

@BlackSnake:
Soweit so richtig. Nur das kann eigentlich nicht funktionieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
for(unsigned int uiPass = 0; uiPass < uiNumPasses; uiPass++)
    {
        // Einstellungen aktivieren

        g_pEffect->BeginPass(uiPass);

        // Modell rendern

        g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mTranslation)); // <-- Matrix WorldView wurde vorher schon übergeben

        g_pModel->DrawSubset(0);

        g_pEffect->EndPass();
    }

Werbeanzeige