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

DrthM2001

Alter Hase

  • »DrthM2001« ist der Autor dieses Themas

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

1

08.01.2005, 18:22

Frage zu OpenGL Blending

Nah langer und harter arbeit hat meine opengl engine ein recht hübsches partikelsystem. doch es hakt noch beim blending. ich benutze:

C-/C++-Quelltext

1
2
glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE);

Funzt auch ganz gut. aber meine textur hat keinen alphakanal, da ist einfach ein weißer stern auf schwarzem untergrund. jetzt ist immer das schwarze viereck außendrum mit gerendert. sind etwas seltsam aus. kann ich nicht einfach die farbwerte addieren?!?? welche blendingparameter etc muss ich da einsetzen ich hab schon viel probiert. mein texturloader kann leider noch keine alphakanäle mitladen aber ich denke es müsste doch auch so gehen!

DrthM2001

Alter Hase

  • »DrthM2001« ist der Autor dieses Themas

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

2

09.01.2005, 13:43

Ok anscheinend hat hier niemand verstanden was ich meine. Folgendes Problem:

(Link)

Man sieht hier, die partikel haben diese umrandung. weiß jemand welche blendingparameter ich verwenden muss damit die farbwerte addiert werden? dann müsste es doch funktionieren!

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

3

09.01.2005, 13:51

Hast Du es mal mit GL_ONE für beide Parameter ausprobiert?
"Games are algorithmic entertainment."

DrthM2001

Alter Hase

  • »DrthM2001« ist der Autor dieses Themas

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

4

09.01.2005, 14:06

Ja das bringt auch nichts
EDIT: Ich habe eine idee. doch bevor ich an die aufwändige realisierung gehe möchte ich euch fragen obs denn richtig ist. kann es sein dass ich die partikel beim rendern erst ordnen muss, dass die erst gezeichnet werden die weiter weg sind? Denn: das viereck um die partikel ist ja nicht schwarz, sondern das dahinter ist nicht sichtbar (ok auch unlogisch aber vielleicht liegts daran)
EDITno²:
Das ist mein rendercode:

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
glBindTexture( GL_TEXTURE_2D, Texture); //Textur aktivieren

    float quadratic[] =  { 1.0f, 1.0f, 50.0f };
    glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic );
    float maxSize = 1.0f;
    glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize );
    glPointSize( maxSize );
    glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, maxSize );
    glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 1.f );
    glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );
    glEnable( GL_POINT_SPRITE_ARB );
    glBegin( GL_POINTS );
    {
          for(unsigned int i=0;i!=numParticles;i++)
          {
                float alpha=1.0f;
                if(Particles[i].age>=fade)
                {
                    alpha=maxAge-Particles[i].age;
                    alpha=alpha/(maxAge-fade);
                }
                glColor4f(1.f,1.f,1.f,alpha);
                //glColor4f(FloatRand(1.f),FloatRand(1.f),FloatRand(1.f),alpha);

                glVertex3f(Particles[i].Position.x,Particles[i].Position.y,Particles[i].Position.z);
          }
    }

    glEnd();
    glDisable( GL_POINT_SPRITE_ARB );
    glDisable(GL_BLEND);

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

5

09.01.2005, 16:25

Ok, nächster Versuch ;p

Schalt mal das SCHREIBEN in den ZBuffer für die Partikel ab. Auswerten soll er Ihn aber noch, damit die Partikel hinter einem Objekt verdeckt sind. Bringt wahrscheinlich das selbe wie Dein Sortieren, isr aber schneller.
"Games are algorithmic entertainment."

DrthM2001

Alter Hase

  • »DrthM2001« ist der Autor dieses Themas

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

6

09.01.2005, 16:40

Danke für die Hilfe! Aber ich verstehe leider nicht ganz was du meinst. Ich habe mit

C-/C++-Quelltext

1
2
3
glDisable (GL_DEPTH_TEST)
//und

glEnable (GL_DEPTH_TEST)
Denn zBuffer deaktiviert, und es sieht auch sehr gut und wie gewollt aus. doch wie du schon sagtest sind die objekte davor nicht vor den partikeln gezeichnet!

Zitat

Auswerten soll er Ihn aber noch, damit die Partikel hinter einem Objekt verdeckt sind.

Aber wenn für die partikel gar keine information im buffer drin ist, woher soll opengl dann wissen obs davor oder dahinter ist?

7

09.01.2005, 16:50

Ließ nochmal genau durch was Osram grad gesagt hat.

SCHREIBEN deaktivieren und TESTEN aktivieren.

Du brauchst GL_DEPTH_TEST und GL_DEPTH_WRITEMASK ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

8

09.01.2005, 16:56

DrthM2001, ich gehe mal davon aus, dass Du die Partikel zum Schluß malst?
"Games are algorithmic entertainment."

DrthM2001

Alter Hase

  • »DrthM2001« ist der Autor dieses Themas

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

9

09.01.2005, 17:05

Ich muss zugeben dass ich jetzt sehr verwirrt bin. Ich bin auch noch nicht so erfahren in opengl. mein derzeitiger rendercode 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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
glDisable(GL_DEPTH_WRITEMASK);
    glEnable (GL_DEPTH_TEST);

    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
    glEnable(GL_BLEND);

    unsigned int counter=0;
    while(counter!=numParticles)
    {
    //****Partikel werden bewegt***//


    glBindTexture( GL_TEXTURE_2D, Texture); //Textur aktivieren

    float quadratic[] =  { 1.0f, 1.0f, 100.0f };
    glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic );
    float maxSize = 1.0f;
    glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize );
    glPointSize( maxSize );
    glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, maxSize );
    glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 1.f );
    glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );
    glEnable( GL_POINT_SPRITE_ARB );
    glBegin( GL_POINTS );
    {
          for(unsigned int i=0;i!=numParticles;i++)
          {
                float alpha=1.0f; //am ende ihres lebens sollen die partikel verglühen

                if(Particles[i].age>=fade)
                {
                    alpha=maxAge-Particles[i].age;
                    alpha=alpha/(maxAge-fade);
                }
                glColor4f(1.f,1.f,1.f,alpha);
                //glColor4f(FloatRand(1.f),FloatRand(1.f),FloatRand(1.f),alpha);

                glVertex3f(Particles[i].Position.x,Particles[i].Position.y,Particles[i].Position.z);
          }
    }

    glEnd();
    
    glDisable( GL_POINT_SPRITE_ARB );
    
    glEnable(GL_DEPTH_WRITEMASK);
    glEnable (GL_DEPTH_TEST);

    glDisable(GL_BLEND);


Und es funktioniert genausoviel wie vorher. Wenn ich depthtest irgendwo deaktivere gibts immer grafikfehler. und writemask scheint auch nichts zu bewirken. Wäre toll wenns da noch jemand gäbe der ne idee parat hat :wirbel:


EDIT: Ja ich male sie erst zum schluss.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

10

09.01.2005, 17:20

Ich hab dies in der Hilfe gefunden :) :

glDepthMask(GL_FALSE);

Das sollte das schreiben ausschalten IMVHO.
"Games are algorithmic entertainment."

Werbeanzeige