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

DJSebi

Frischling

  • »DJSebi« ist der Autor dieses Themas

Beiträge: 19

Wohnort: KÖLN!!!!!

Beruf: Musiker, Informatiker, DJ, Moderator

  • Private Nachricht senden

1

09.01.2008, 00:44

OpenGL: Nebel-Problem

Hallo zusammen,

leider hat meine Suche im Forum nichts ergeben, daher die Frage:
Ich habe Nebel in mein kleines OpenGL-Workaround eingebaut. Jetzt ist es aber so, dass die Objekte, bis auf den Boden, weiß werden und bleiben, wenn sie weiter in den Nebel reingehen. Als Code poste ich die Render-Methode und die Init-Methode.

Render-Methode:

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
int DrawGLScene( GLvoid )
{
    GLdouble eqr[] = { 0.0f, -1.0f, 0.0f, 0.0f };

    // Erst mal den Bildschirm löschen, damit nicht das alte Bild teilweise zu sehen ist

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );

    // Model-View-Matrix zurücksetzen

    glLoadIdentity();
    glTranslatef( x, y, z );

    glColorMask( 0, 0, 0, 0 );

    glEnable( GL_STENCIL_TEST );
    glStencilFunc( GL_ALWAYS, 1, 1 );
    glStencilOp( GL_KEEP, GL_KEEP, GL_REPLACE );
    glDisable( GL_DEPTH_TEST );
    DrawFloor();

    glEnable( GL_DEPTH_TEST );
    glColorMask( 1, 1, 1, 1 );
    glStencilFunc( GL_EQUAL, 1, 1 );
    glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
    glEnable( GL_CLIP_PLANE0 );
    glClipPlane( GL_CLIP_PLANE0, eqr );
    glPushMatrix();
        glScalef(  1.0f, -1.0f,  1.0f );
        glLightfv( GL_LIGHT0, GL_POSITION, lightPosition );
        glTranslatef( 1.5f, height, 0.0f );
        DrawSphere();
        glTranslatef( -1.5f, 0.0f, 0.0f );
        glRotatef( rviereck, 1.0f, 0.5f, 0.0f );
        DrawCube();
    glPopMatrix();
    glDisable( GL_CLIP_PLANE0 );
    glDisable( GL_STENCIL_TEST );

    glLightfv( GL_LIGHT0, GL_POSITION, lightPosition );
    glEnable( GL_BLEND );
    glDisable( GL_LIGHTING );
//  glColor4f( 1.0f, 1.0f, 1.0f, 0.8f );

    glColor4f( 0.0f, 0.0f, 0.0f, 0.8f );
    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
    DrawFloor();

    glEnable( GL_LIGHTING );
    glDisable( GL_BLEND );
    glTranslatef( 1.5f, height, 0.0f );
    DrawSphere();
    glTranslatef( -1.5f, 0.0f, 0.0f );
    glRotatef( rviereck, 1.0f, 0.5f, 0.0f );
    DrawCube();

    rviereck -= 0.5f;

    glFlush();

    return TRUE;
}


Init-Methode:

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
    if( !LoadGLTexture() )
    {
        return FALSE;
    }

    // Shading-Typ, macht schöne Farbverläufe

    glShadeModel( GL_SMOOTH );

    // Hintergrundfarbe

//  glClearColor( 0.0f, 0.0f, 0.65f, 1.0f );

    glClearColor( 0.5f, 0.5f, 0.5f, 1.0f ); // Nebelfarbe


    // Den Depth-Buffer (oder auch Z-Buffer) aktivieren

    glClearDepth( 1.0f );

    // Den Stencil-Buffer leeren

    glClearStencil( 0 );

    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LEQUAL );

    // Art der Perspektive festlegen, wir nehmen hier jetzt die schönste und rechenintensivste :)

    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

    // Texture Mapping aktivieren

    glEnable( GL_TEXTURE_2D );

    // Ambientes Licht setzen

    glLightfv( GL_LIGHT0, GL_AMBIENT, lightAmbient );

    // Diffuses Licht setzen

    glLightfv( GL_LIGHT0, GL_DIFFUSE, lightDiffuse );

    // Licht an die Position setzen

    glLightfv( GL_LIGHT0, GL_POSITION, lightPosition );

    // Licht zuweisen

    glEnable( GL_LIGHT0 );

    // Licht anknipsen

    glEnable( GL_LIGHTING );

    // Nebel aktivieren

    glFogi( GL_FOG_MODE, fogMode[fogFilter] ); // Ist beim Programmstart auf GL_LINEAR gesetzt

    glFogfv( GL_FOG_COLOR, fogColor );
    glFogf( GL_FOG_DENSITY, 0.03f );
    glHint( GL_FOG_HINT, GL_NICEST );
    glFogf( GL_FOG_START, 1.0f );
    glFogf( GL_FOG_END, 5.0f );
    glEnable( GL_FOG );

    // Init der Sphere

    q = gluNewQuadric();
    gluQuadricNormals( q, GL_SMOOTH );
    gluQuadricTexture( q, GL_TRUE );

    // Texture der Sphere

    glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
    glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );

    return TRUE;
}


Danke schon mal im Voraus!!!

der Sebi

2

09.01.2008, 10:37

Hallo Sebi! Mir ist beim Überfliegen deines Codes aufgefallen, daß die Variable fogColor nirgends initialisiert wurde. Ansonsten würde ich empfehlen, daß du dir die Formel zur Nebelberechnung nochmal zur Gemüte führst. Dann kannst du wahrscheinlich im Kopf nachrechnen, daß die Berechnung (bzw. Interpolation, hab die Formel nicht im Kopf) zwischen den Faktoren Vertexcolor, Kameraabstand zum Vertex, Texturcolor, FogStart, FogEnd, FogColor und Density letztendlich die Farbe Weiss ergibt. Kurzum, schraub an den Werten (besonders an den zuletzt genannten) einfach mal ein wenig herum. Verwende mal Rot als Nebelfarbe zur besseren Kontrolle.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

09.01.2008, 10:52

Das Problem hat sich gelöst.

4

09.01.2008, 11:03

Ok. Habt ihr das im Chat gelöst? Was war das Problem?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

09.01.2008, 11:18

DJSebi ist ein Kommilitone von mir.
Das Problem lag woanders ... es wurde mit Blending noch was draufgerendert, so dass es dann heller wurde.

6

09.01.2008, 11:26

Alles klar. Danke für die Info!
Dann ist Sebi ja in kompetenter Gesellschaft... :D
(so gut möcht ich's auch mal haben)

Werbeanzeige