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

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

1

22.01.2007, 19:34

Beleuchtung mit Vertices aus dem Vertexbuffer

Ich habe versucht ein Paar einfache Würfel (aus 36 Vertices) mit Direct3D zu beleuchten. Aber ich sehe keine Würfel D3D erkennt scheinbar die Normalvektoren nicht, denn Kugeln und andere x-Modelle kann ich problemlos rendern. Hier mein Vertexformat:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
struct SVertex
{
    tbVector3           vPosition;  
    tbVector3           vNormal;    
    tbVector2           vTexture;   
    static const DWORD  dwFVF;      
};

const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

Beleuchtung ist übrigens eingeschaltet (sons würde man die Kugeln ja auch nicht sehen)

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

2

22.01.2007, 19:40

Die Aufgabe mit der Beleuchtung ist im Kapitel Beleuchtung zu finden. Ich habe mich natürlich auch an alle anderen "Techniken" gehalten, die in diesem Kapitel vorgestellt werden.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

22.01.2007, 19:58

zeig mal den code mit dem du das renderst ;)

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

4

22.01.2007, 20:57

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
    // Szene beginnen

    g_pD3DDevice->BeginScene();

    // ------------------------------------------------------------------


    mCamera = tbMatrixCamera(g_vCameraPosition,
                             g_vCameraPosition + tbVector3(sinf(g_fCameraAngle),
                                                           0.0f,
                                                           cosf(g_fCameraAngle)),
                             tbVector3(0.0f, 1.0f, 0.0f));
    g_pD3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)(&mCamera));

    // Das Bildseitenverhältnis berechnen

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

    // Die Projektionsmatrix erzeugen und einsetzen.

    // Das geschieht hier einmal pro Bild, weil das Sichtfeld variabel ist.

    mProjection = tbMatrixProjection(g_fFOV,    // Sichtfeld

                                     fAspect,   // Bildseitenverhältnis

                                     0.1f,      // Nahe Clipping-Ebene

                                     250.0f);   // Ferne Clipping-Ebene

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

    PointLight.Position = tbVector3(sinf(g_fTime) * 10.0f,
                                    sinf(g_fTime) * 10.0f,
                                    cosf(g_fTime) * 10.0f); // Variierende Position


    // Licht einsetzen und aktivieren

    g_pD3DDevice->SetLight(0, &PointLight);

    Material.Emissive = tbColor(0.0f, 0.0f, 0.0f);
    g_pD3DDevice->SetMaterial(&Material);
    g_pD3DDevice->LightEnable(0, TRUE);
    g_pD3DDevice->SetTexture(0, g_pTexture);

    // ------------------------------------------------------------------


    
    // Zuerst den VertexBuffer als Datenquelle aktivieren.

    g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(SVertex));

    // Zeichnen!

    hResult = g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,   
                                        0,                  
                                        3);
                                        
    if(FAILED(hResult))
    {
        // Fehler beim Zeichnen!

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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

22.01.2007, 20:58

dacht ichs mir.
da fehlt ein SetFVF() ;)

außerdem wird dein licht auch eine farbe brauchen, falls es noch keine hat.

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

6

22.01.2007, 21:08

Danke, aber falsch gedacht!!

Das Vertexformat setzte ich beim Initialisieren:

C-/C++-Quelltext

1
2
3
4
5
6
// Vertexformat setzen

    if(FAILED(hResult = g_pD3DDevice->SetFVF(SVertex::dwFVF)))
    {
        // Fehler beim Setzen des Vertexformats!

        TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    }



Genauso wie die Farbe des Lichtes

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    ZeroMemory(&PointLight, sizeof(D3DLIGHT9));
    PointLight.Type         = D3DLIGHT_POINT;                               // Punktlicht

    PointLight.Diffuse      = tbColor(1.0f, 1.0f, 1.0f);                    // Weiße Streufarbe

    PointLight.Ambient      = tbColor(1.0f, 1.0f, 1.0f);                    // Weiße Hintergrundfarbe

    PointLight.Specular     = tbColor(1.0f, 1.0f, 1.0f);                    // Weiße Glanzfarbe

    PointLight.Range        = 1000.0f;                                      // 1000 Einheiten Reichweite

    PointLight.Attenuation0 = 0.0f;                                         // Lichtabschwächung

    PointLight.Attenuation1 = 0.025f;                                       // ...

    PointLight.Attenuation2 = 0.0f;                                         // ...

    
    
    
    Material.Diffuse    = tbColor(0.75f, 0.75f, 0.75f); // Hellgraue Streufarbe

    Material.Ambient    = tbColor(0.25f, 0.25f, 0.25f); // Dunkelgraue Hintergrundfarbe

    Material.Emissive   = tbColor(0.0f, 0.0f, 0.0f);    // Keine Eigenfarbe

    Material.Specular   = tbColor(0.25f, 0.25f, 0.25f); // 25% hellere Glanzfarbe als Streufarbe

    Material.Power      = 20.0f;                        // Glanzfaktor variiert

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

22.01.2007, 21:12

ist die kamera auch sicher auf das dreieck gerichtet und das dreieck wird auch ganz sicher nicht weggecullt?

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

8

22.01.2007, 21:40

ja die Kugeln renderts ja auch:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(SVertex));

    hResult = g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,   
                                        0,                      
                                        3);
                                        
    if(FAILED(hResult))
    {
        // Fehler beim Zeichnen!

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

g_pSphereModel->DrawSubset(0);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

22.01.2007, 21:44

du zeichnest da also auch noch D3DXMeshes.
hat dein mesh auch das gleiche vertex format wie dein dreieck?

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

10

23.01.2007, 18:31

es ist ja noch nicht einmal mein mesh sondern das aus den D3D Samples
(sphere.x)

Werbeanzeige