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

  • »Wümpftlbrümpftl« ist der Autor dieses Themas

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

1

16.08.2006, 16:33

Terrain Beleuchtung

Hi,

ich arbeite derzeit an einer Terrainklasse. Vorerst will ich das Terrain noch Brute Force rendern. Ich kann bereits Heigh und Colormaps laden und anwenden. Jetzt wollte ich allerdings das fleckchen Land Beleuchten. Damit später eventuell auch Tag und Nacht möglich ist, verzichte ich dabei auf eine Lightmap.

Also berechne ich die Normalen ... aber scheinbar stimmen die nicht, denn das Terrain hüllt sich bei einen Richtungslicht in Dunkelheit.

Um die Normalenvektoren zu berechnen hab ich folgende Schleife geschrieben (Positionen wurden bereits davor ausgerechnet) :

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
for(int y=0; y<m_iResolution; y++)
{
    for(int x=0; x<m_iResolution; x++)
    {
        // Umliegende Verts holen

        STerrainVertex Vertex1, Vertex2, Vertex3, Vertex4, Vertex5;
        m_pVertexBuffer->GetVertex(GetVertexIndex(x, y), &Vertex1);
        if(x-1>=0) m_pVertexBuffer->GetVertex(GetVertexIndex(x-1, y), &Vertex2);
        if(y-1>=0) m_pVertexBuffer->GetVertex(GetVertexIndex(x, y-1), &Vertex3);
        if(x+1<m_iResolution) m_pVertexBuffer->GetVertex(GetVertexIndex(x+1, y), &Vertex4);
        if(y+1<m_iResolution) m_pVertexBuffer->GetVertex(GetVertexIndex(x, y+1), &Vertex5);
        
        // Umliegende Normalen berechnen

        bool b1 = false;
        bool b2 = false;
        bool b3 = false;
        bool b4 = false;
        short sNumTriagles = 0;
        gve::Vector3 vNorm1, vNorm2, vNorm3, vNorm4;
        if(y+1<m_iResolution && x+1<m_iResolution)
        {
            vNorm1 = gve::ComputeTriangleNormal(Vertex1.vPosition, Vertex4.vPosition, Vertex5.vPosition);
            b1 = true; sNumTriagles++;
        }
        if(x-1>=0 && y+1<m_iResolution)
        {
            vNorm2 = gve::ComputeTriangleNormal(Vertex1.vPosition, Vertex2.vPosition, Vertex5.vPosition);
            b2 = true; sNumTriagles++;
        }
        if(x-1>=0 && y-1>=0)
        {
            vNorm3 = gve::ComputeTriangleNormal(Vertex1.vPosition, Vertex2.vPosition, Vertex3.vPosition);
            b3 = true; sNumTriagles++;
        }
        if(y-1>=0 && x+1<m_iResolution)
        {
            vNorm4 = gve::ComputeTriangleNormal(Vertex1.vPosition, Vertex3.vPosition, Vertex4.vPosition);
            b4 = true; sNumTriagles++;
        }           
        // Durchschnitt berechnen

        gve::Vector3 NewNormal = gve::Vector3(0.0f);
        if(b1) NewNormal += vNorm1;
        if(b2) NewNormal += vNorm2;
        if(b3) NewNormal += vNorm3;
        if(b4) NewNormal += vNorm4;
        NewNormal /= sNumTriagles;
        Vertex1.vNormal = NewNormal;
        m_pVertexBuffer->SetVertex(GetVertexIndex(x, y), &Vertex1);
    }
}


Nur für den Fall das ich was beim Licht und Material vercheckt hab:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
D3DLIGHT9 Light;
ZeroMemory(&Light, sizeof(D3DLIGHT9));
Light.Type = D3DLIGHT_DIRECTIONAL;
Light.Diffuse       = gve::Color(1.0f, 1.0f, 1.0f);                 
Light.Ambient       = gve::Color(1.0f, 1.0f, 1.0f);             
Light.Specular      = gve::Color(1.0f, 1.0f, 1.0f);             
Light.Direction     = gve::Vector3(-1.0f);  
D3D->SetLight(0, &Light);

D3DMATERIAL9 Mat;
Mat.Ambient = gve::Color(0.1f);
Mat.Diffuse = gve::Color(1.0f);
Mat.Emissive = gve::Color(0.1f);
Mat.Power = 0.0f;
Mat.Specular = gve::Color(0.0f);
D3D->SetMaterial(&Mat);


Ich hoffe die Funktionen die ich da verwende sind selbsterklärend.

So und das jetzt die Frage nicht fehlt ... Was mach ich falsch :?:

Schon jetzt danke an alle, die sich das durchlesen... :)

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

16.08.2006, 16:52

Da kann es viele Dinge geben, die falsch laufen können.

Am besten versuchst du das mal an einen sehr kleinen Gitter (3x3 Stützstellen z.B.) und schaust im Debugger, ob die Normalen auch richtig sind.

In solchen Fällen fange ich auch immer erst mit einer Ebene als Terrain an, weil man da schnell ausschliessen kann, dass man irgendwelche Render-States falsch gesetzt hat.

Dinge, die du überprüfen solltest:

[list]
* zeigen die Normalenvektoren auch in die richtige Richtung? (möglichst zum Betrachter hin)
* Zeigt die Lichtrichtung möglichst vom Betrachter zum Objekt hin?
* Der berechnete Normalenvektor ist nicht normiert (das sollte aber nicht das Problem sein)
* Ist die Lichtquelle auch eingeschaltet? (LightEnable (0, TRUE), setzen allein reicht nicht)
* Fehlt vieleicht der RenderState "SetRenderState (D3DRS_LIGHTING, TRUE);"?
[/list]
Mehr fällt mir eben aus dem Stand nicht ein...

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

  • »Wümpftlbrümpftl« ist der Autor dieses Themas

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

3

16.08.2006, 17:01

Hmm die Normalen scheinen sogar zu stimmen... ich hab die ganze Heigthmap schwarz gemacht und alle Normalen sind wie erwaret 0.0 1.0 0.0

Ja dann muss ich wohl irgendwas beim Licht verecheckt haben ?!
Also ich sehs nich.... :oops:

  • »Wümpftlbrümpftl« ist der Autor dieses Themas

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

4

16.08.2006, 18:05

:oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops:

hupsidupsi
D3D->LightEnable(0, TRUE);

@ rklaffehn
sry hab ich überlesen

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

5

16.08.2006, 19:24

Na bitte, geht doch ;)
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Werbeanzeige