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

04.10.2011, 20:36

Open GL mehrere Lichter...

Hallo,

ich komme mal direkt zum Problem, undzwar versuche ich derzeit mit SFML und Open GL mehrere Lichter zu erstellen,
jedoch wird komischerweise immer nur ein Licht angezeigt.

Ich hab mir gedacht das es so funktionieren könnte mehrere Lichter
über eine Schleife zu erstellen und anzuzeigen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
for(int i = 0; i < 4; i++)
{
    LightPosition[0] = 200 * i;
    LightPosition[1] = 200 * i;

    glLightfv(GL_LIGHT0 + i, GL_AMBIENT,   LightAmbient);  
    glLightfv(GL_LIGHT0 + i, GL_DIFFUSE,    LightDiffuse);   
    glLightfv(GL_LIGHT0 + i, GL_SPECULAR, LightSpecular);
    glLightfv(GL_LIGHT0 + i, GL_POSITION,  LightPosition);
}

Das halt immer nachdem ein Licht erstellt und gesetzt wurde die Variable i mit 1 addiert wird und es
so mit dem nächsten Licht weitemacht nur funktioniert das nicht...

Leider gibt es dazu auch wenig gute Referenzen im Netz wo ich mich hätte umschauen können, jedenfalls finde ich keine guten..
mein Gefühl ist das es allgemein bei OpenGL so ist... selbst auf Nehe´s Seite ist leider viel veralteter Code den man nicht mal mehr Compilieren kann...

Deswegen frage ich hier und hoffe auf etwas Hilfe
bevor ich vor Verzweiflung umkippe und mich auf DirectX stürze, da gibt es immerhin genügend
gute Dokumentationen, Beispiele etc. was man wie gesagt bei OpenGL irgendwie nicht sagen kann...

Vielen Dank im Voraus!

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

2

04.10.2011, 21:19

Hast Du die Lichter auch angeschaltet? Probier mal
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
etc. für die verschiedenen Lichtquellen.
Beste OpenGL-Doku gibt es in Buchform, die sowohl Referenz als auch Einsteigslektüre ist:
Red Book (Standardwerk über OpenGL)
Orange Book (Standardwerk über GLSL)
Golden Book (Standardwerk über OpenGL ES/GLSL ES)

3

04.10.2011, 21:36

Vor allem konfigurierst du immer wieder die Quelle GL_LIGHT0 und daher behält sie ihren letzten Status, da musst du schon mehrere Quellen anschalten und verwenden.

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

4

04.10.2011, 22:10

ne, das Konfigurieren passt schon, er macht ja GL_LIGHT0 + i und i wird hochgezählt.

5

04.10.2011, 22:15

Hoppla hab nur auf den ersten Blick das + i nicht gesehen, entschuldigung.

6

05.10.2011, 08:46

Danke, für die antworten, jedoch habe ich die Lichter auch schon enabled, habs nur oben im Code vergessen...
So sieht mein derzeitiger Code aus:

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//Do Light Settings
Light.SetPosition(Mouse.GetPosition().x, Mouse.GetPosition().y, 10.0f);
Light.SetAmbient(0.5, 0.5, 0.5, 255.0);
Light.SetDiffuse(1.0, 1.0, 1.0, 255.0);
Light.SetSpecular(1.0, 1.0, 1.0, 255.0);

//Iterator
list<CLight>::iterator iterator = List_Light.end();

//....weiter im Code

void Light()
{
   //If the Light Button was Clicked
   if(   Button_Light.GetStatus("Clicked") == true
      && LightButtonClicked == false)
   {
       //Push Back
       List_Light.push_back(Light);

          iterator = List_Light.end();

         //Set first Parameter
        //Set Param macht nichts anderes als diesen ersten Parameter
        //für alle in der Klasse augerufenen Funktionen zu setzen:
        //glEnable(SETTEDPARAM);
        //glLightfv(SETTEDPARAM, GL_POSITION, LightPosition);
        //usw.
    iterator->SetParam(GL_LIGHT0 + LightCounter);

    //Light Counter
    LightCounter += 1;

    //Light Variable true
    LightButtonClicked = true;
   }

   //If it is true
   if(LightButtonClicked == true)
 {
    //Enable Lighting
    glEnable(GL_LIGHTING);

    //Set Position
    iterator->SetPosition(Mouse.GetPosition().x, Mouse.GetPosition().y, iterator->GetLightZoom());

    //Set "Light Zoom"
    if(App.GetInput().IsKeyDown(sf::Key::Up))
    {
        //Set Z Param
        iterator->SetLightZoom(iterator->GetLightZoom() + 1);
    }
    else if(App.GetInput().IsKeyDown(sf::Key::Down))
    {
        //Set Z Param
        iterator->SetLightZoom(iterator->GetLightZoom() - 1);
    }

    if(App.GetInput().IsKeyDown(sf::Key::Return))
    {
        //Disable Lighting
        glDisable(GL_LIGHTING);

        //Set Position
        iterator->SetPosition(Mouse.GetPosition().x, Mouse.GetPosition().y, iterator->GetLightZoom());

        //Set it
        LightButtonClicked = false;
    }
  }
}

//...weiter im Code

//Clear...
App.Clear(sf::Color(0, 0, 0, 1));

//Get the Status and Handle
//..Hier wird die Funktion von Oben aufgerufen
Light();

//This fix display Problems
glEnable(GL_COLOR_MATERIAL);

//Clear
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

//GL Clear
glLoadIdentity();

Sorry für die Formatierung, aber der Code Tab ist ein bisschien komisch...

Das ganze übrigens brauche ich für meinen Level Editor, da ich mehrere Licht Quellen
setzen möchte, aber wie gesagt nur eine wird angezeigt... obwohl ich ja eig. alle Enable..
Das Enable läuft in der Klasse und funktioniert ja auch beim ersten... sieht so aus:

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
void CLight::SetParam(GLenum Param)
{
    //Set
    m_Param = Param;

    //Enable
    glEnable(Param);
}

void CLight::SetPosition(float X, float Y, float Z)
{
    //Set
    LightPosition[0] = X;
    LightPosition[1] = Y;
    LightPosition[2] = Z;
    LightPosition[3] = 1.0f;

    //Position of the light
    glLightfv(m_Param, GL_POSITION, LightPosition);
}

//...usw

Ich hoffe man versteht an dem Code was ich versuche und hoffe das mir
jemand helfen kann...

Ps.: Danke für die Links zu den Büchern, ich werde mir warscheinlich
demnächst eins kaufen und hoffen das es gut ist. :)

7

05.10.2011, 20:04

Hat keiner eine Idee woran es liegen könnte?
Ich habe es leider immer noch nicht hinbekommen... :(

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

8

05.10.2011, 21:45

Sorry, Arbeit und so halten vom posten in Foren ab ;)

Setzt Du die Abnahmefunktionsparameter (GL_[CONSTANT|LINEAR|QUADRATIC]_ATTENUATION)? Hast Du gute Farbwerte gesetzt? Zum Testen setze einfach mal alles auf 1.0f. Evtl. solltest Du auch noch lichttypspezifische Parameter setzen, nicht dass einer deine Lichtquelle unsichtbar macht.
Prüfst Du, ob es ein OpenGL-Fehler gibt?
Sorry, dass ich Dir nur waage Tipps geben kann, aber Ich bin nicht mehr wirklich in der Fixed-Pipeline mehr drin - ich mache zur Zeit zu viel OpenGL ES 2.0, da muss man alles selber in Shadern implementieren und bei normalen OpenGL mache ich es inzwischen auch immer, aus Gewohnheit und weil es besser aussieht :)

Werbeanzeige

Ähnliche Themen