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

09.01.2016, 10:13

Beleuchtungsproblem mit OpenGL

Hey
Ich bin mir nicht ganz sicher ob ich hier in dem Bereich genau richtig bin.
Ich versuche momentan mit Hilfe von OpenGL und C++ ein Spiel zu programmieren, dabei habe ich allerdings enorme Problme mit dem Licht. Mittlerweile habe ich nach etlichen Versuchen endlich hinbekommen, ein Licht 'einzuschalten' und mit Werten(Diffuse,Ambient, Specular,Position) auszustatten. Wenn ich die Werte entsprechend verändere, hat auch alles in meiner Welt einen rot-,grün- oder blau-Stich.
ABER wenn ich die Spielwelt oder Teile dieser drehe, dann bekommt dieselbe Fläche die Immer noch genauso zu dem Licht steht, eine Komplett andere Helligkeit.
An folgendem Bild kann man dies wohl am besten erkennen.
Die noch recht leere Welt hat bereits ein paar Straßen.

(Link)

Die Kurve wird einfach um 90°,180° oder 270° gedreht und an anderer Position neu gezeichnet.
Allerdings sind sie auch entsprechend ihrer Rotation komplett anders Beleuchtet.
Wenn ich die ganze Spielwelt drehe sieht man auch, das dies mit jedem Straßen Abschnitt genauso passiert.
(Die Straße, die rechts etwas höher gelegen ist, habe ich für die Kollisionerkennung etwas höher gesetzt(Sie kann ignoriert werden))

Meine Init-Funktion.

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
int InitGL(GLvoid)
{
    glShadeModel(GL_SMOOTH);

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glClearDepth(1.0f);

    glEnable(GL_DEPTH_TEST);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);


    glDepthFunc(GL_LESS);

    GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    GLfloat ambientLight[] = { 0.2, 0.2, 0.2, 1.0 };
    GLfloat diffuseLight[] = { 1.0,1.0,1.0,1.0 };
    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };

    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat mat_shininess[] = { 50.0 };
    GLfloat mat_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
    GLfloat mat_diffuse[] = { 0.4, 0.4, 0.4, 1.0 };



    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

/*Folgende 4 Zeilen haben keinerlei Auswirkung auf die Szene. Selbst wenn ich sie direkt vor das Zeichnen setze*/
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);


    glLightfv(GL_LIGHT0, GL_DIFFUSE, (diffuseLight));
    glLightfv(GL_LIGHT0, GL_AMBIENT, (ambientLight));
    glLightfv(GL_LIGHT0, GL_SPECULAR, (specular));
    glLightfv(GL_LIGHT0, GL_POSITION, (light_position));


    return TRUE;


Meine Funktion fürs Zeichnen der Rasen Fläche(Straßen werden genauso gezeichnet nur mit mehr Flächen für den Bürgersteig bzw die Linien in der Mitte)

Straßen.zeichnen() Funktion

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
glTranslatef(posx, posy, posz);

    glRotatef(rotx, 1.0f, 0.0f, 0.0f);
    glRotatef(roty, 0.0f, 1.0f, 0.0f);
    glRotatef(rotz, 0.0f, 0.0f, 1.0f);

                                  
    glBegin(GL_QUADS);
    //Wiese
    if (straßenart == 0)
    {
        glColor3f(0, 0.5, 0);

                                                                   
        glVertex3f(16, 0, -16);
        glVertex3f(16, 0, 16);
        glVertex3f(-16, 0, 16);
        glVertex3f(-16, 0, -16);


    



    }
glEnd();


//Zurück drehen
   glRotatef(-rotz, 0.0f, 0.0f, 1.0f);
   glRotatef(-roty, 0.0f, 1.0f, 0.0f);
   glRotatef(-rotx, 1.0f, 0.0f, 0.0f);
//zurück Positionieren
   glTranslatef(-posx, -posy, -posz);


Befehle fürs Zeichnen die jeden Frame ausgeführt werden sollen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                
                    glLoadIdentity();
                
                    karte1.zeichnen();
                    glLoadIdentity();
                    player1.zeichnen();
                

                

                    SwapBuffers(hDC);

Die Funktion karte1.zeichnen(); beinhaltet einfach nur eine Schleife wo für jede Straße der Befehl zeichnen ausgeführt wird. Bei player1.zeichnen() wird einfach der Spieler gezeichnet.

Ich hoffe mir kann einer Helfen
Ich bin für jeden Hilfeversuch dankbar.

domdog

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

09.01.2016, 10:31

Wo übergibst du denn deine Normalvektoren?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

09.01.2016, 12:28

Ja das wird auch das Problem sein. Wundert mich, dass dann überhaupt was funktioniert. Generiert etwas OpenGL normalen, wenn keine da sind aber HW-Beleuchtung eingeschaltet ist?!

Krane

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

4

09.01.2016, 13:14

Ist zwar keine Antwort auf deine Frage, aber du verwendest ein sehr altes OpenGL.
glBegin() und glEnd() sind Funktionen die vor allem in der OpenGL Community nicht gern gesehen sind.

Mein Tipp: Lies ein Buch zum Thema Modern OpenGL. Modern OpenGL ist alles ab OpenGL 3.2.
Die fixed funtion pipeline wird dabei von einer shader pipeline ersetzt und du erhältst somit mehr Kontrolle über die Berechnung des Lichtes.
Und was noch viel wichtiger ist, du lernst dabei sehr viel.

hanhau

Treue Seele

Beiträge: 80

Wohnort: St. Pölten, Österreich

Beruf: schueler

  • Private Nachricht senden

5

12.01.2016, 20:07

Ich kann mich Krane nur anschließen, ich tu mir in Sachen Beleuchtung mit Shadern um einiges leichter, der Aufwand lohnt sich echt ! 8)
Oft denke ich an sie, niemals habe ich sie gefragt, niemals etwas gesagt,
nur verzweifelt am PC gesessen und dabei die Zeit vergessen, sie ist weg.

6

17.01.2016, 23:06

Ah okay
Erstmal danke für den Hinweis.
Ich werde mir mal modernes OpenGL anschauen.
Kennt ihr irgendwelche Tutorials welche das moderne OpenGL gut erklären?
kann auch englisch sein solange es nicht zu umfangreich geschrieben ist. ^^

Krane

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

7

18.01.2016, 19:51

Ich habe diese Tutorial Reihe verwendet um meine DirectX Kenntnisse in OpenGL zu übersetzen.
Solltest du noch nie mit einer modernen Grafik API gearbeitet haben, empfehle ich dir ein anständiges Buch darüber zu lesen. Im Notfall auch das kostenlose OpenGL Wikibook.

8

19.01.2016, 00:14

Ich habe nie verstanden, wie man sich freiwillig Video-Tutorials antun kann. Text kann man so schön in seinem Tempo lesen, man kann schnell zu relevanten Stellen springen, man kann sich schnell einen Überblick verschaffen, man kann Codeschnipsel direkt kopieren.....

Aber egal. Folgende Seite ist glaube ich ein guter Startpunkt:

http://www.opengl-tutorial.org
Lieber dumm fragen, als dumm bleiben!

hanhau

Treue Seele

Beiträge: 80

Wohnort: St. Pölten, Österreich

Beruf: schueler

  • Private Nachricht senden

9

20.01.2016, 00:41

Auch richtig gut fand ich www.learnopengl.com . Es gibt noch zwei gute Seiten, aber die fallen mir gerade nicht ein.
Oft denke ich an sie, niemals habe ich sie gefragt, niemals etwas gesagt,
nur verzweifelt am PC gesessen und dabei die Zeit vergessen, sie ist weg.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

10

20.01.2016, 00:52

Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige