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

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

21.12.2008, 00:12

Licht auf 2D Texturen

hi wollt fragen wie ich mit OpenGL
Lichter so erstellen kann das diese sich in 2D Texturen "ein brennen"
so das man nur ein Licht verwenden kann.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//bind texture

//set LightColor,Pos. ,Dif.

glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT1);
        glLightfv(GL_LIGHT1, GL_AMBIENT,LightColor);
        glLightiv(GL_LIGHT1, GL_POSITION,LightPosition);
        glLightfv(GL_LIGHT1, GL_DIFFUSE,LightDiffuse);
//render 2d texture

/*
  glBegin(GL_QUADS);
        glTexCoord2f...
         glColor4ub...
         glVertex3f...
*/
glDisable(GL_LIGHT0);
    glDisable(GL_LIGHT1);
    glDisable(GL_LIGHTING);
    glDisable(GL_COLOR_MATERIAL);


Und den code soll man jetzt bei mehreren Texturen verwenden und das nur mit Light1
und die Farbe vom Licht soll auf der Texture bleiben.

Ich hab das schon so probiert nur es klappt nicht,
es passiert eben nix.
vll sind die Light Positionen falsch oder ich mach etwas anderen falsch.

Anonymous

unregistriert

2

21.12.2008, 08:30

Ah, du willst das Licht also in die Textur brennen, joa...
Ich frag mal ganz stumpf ob du überhaupt LightColor, LightPosition und LightDiffuse überhaupt und mit richtigen Werten definiert hast. Ansonsten schmeiss

C-/C++-Quelltext

1
2
3
4
5
6
glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT1);
        glLightfv(GL_LIGHT1, GL_AMBIENT,LightColor);
        glLightiv(GL_LIGHT1, GL_POSITION,LightPosition);
        glLightfv(GL_LIGHT1, GL_DIFFUSE,LightDiffuse); 
in die Init und lass das disablen weg, dass sieht nach Quatsch aus, sollte aber keine potenzielle Fehlerquelle sein...

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

3

21.12.2008, 12:59

ich bin mir bei den positionen nicht sicher,
das sind die selber koord. wie bei der texture
und die farbwerte sind von 0-255

C-/C++-Quelltext

1
2
3
4
5
6
float LightColor[] = { static_cast<float>(rgb[0])/255.0f,
                           static_cast<float>(rgb[1])/255.0f,
                           static_cast<float>(rgb[2])/255.0f,
                           1.0f };
         int LightPosition[] = { x,y,z,1};
         float LightDiffuse[] = {1.0f,1.0f,1.0f,1.0f,};


und wenn ich das licht in der init einschalte dann ist alle dunkel

Anonymous

unregistriert

4

21.12.2008, 16:36

In der Init wird's aber erst richtig initialisiert...daher ist das schon richtig. Ich weiss jetzt nicht welche Werte die Elemente von "rgb[]" haben, aber das "/255.0f" sieht gefährlich aus. Außerdem würde ich mal gerne wissen warum du castest und nicht gleich ein float-Array anlegst. Probier's mal so:

C-/C++-Quelltext

1
2
3
GLfloat LightAmbient[]= { 0.3f, 0.5f, 0.4f, 0.9f };
GLfloat LightDiffuse[]= { 0.9f, 0.9f, 1.0f, 1.0f }; 
GLfloat LightPosition[]= { 0.0f, 0.0f, 1.8f, 1.0f };

Wenn's so geht, weisst du das es an deinem rgb-Array liegt.

Mfg.
Coders-Square

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

5

21.12.2008, 16:57

es liegt doch an den
LightAmbient

aber wie kann ich dann einen wert von (ubyte)0-255 in (float)0.0f - 1.0f umwandeln
den es gibt ja kein
glLightubv

Anonymous

unregistriert

6

21.12.2008, 17:16

Wenn du 0.0f haben möchtest:

C-/C++-Quelltext

1
2
3
float LightColor[]= {static_cast <float> ((rgb[0]/rgb[0])-1),
                                     static_cast <float> ((rgb[1]/rgb[1])-1),
                                     static_cast <float> ((rgb[2]/rgb[2])-1)};


Wenn 1.0 dann natürlich nur:

C-/C++-Quelltext

1
2
3
float LightColor[]= {static_cast <float> (rgb[0]/rgb[0]),
                                     static_cast <float> (rgb[1]/rgb[1]),
                                     static_cast <float> (rgb[2]/rgb[2])};


Hab's noch nicht getestet, bin nicht zu Hause, sollte aber funktionieren.

Mfg.
S. Wegener

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

7

21.12.2008, 17:23

ja ber der wert kann auch zwisch 0 und 1 sein also
static_cast<float>(rgb[0])/255.0f

aber ich sehen keine veränderung
es wird nur dunkel

wenn ich aber fester werte von 0.0-1.0 nehmen dann klappt es

Anonymous

unregistriert

8

21.12.2008, 17:41

Das geht so ohne weiteres nicht. Du willst von einer Fabrtabelle in die andere "switchen". Du kannst nicht einfach durch 255.0f teilen, denn was ist, wenn rgb[0]=45 ist? Ich hab mal ein wenig rumgerechnet, könnte so gehen: (ungetestet!)

C-/C++-Quelltext

1
2
3
4
5
6
7
float color_1=rgb[0]/100; //Wenn 40, dann 0,4

float color_2=rgb[1]/100; //Wenn 100, dann 1

float color_3=rgb[2]/100; //Wenn 25, dann 0,25


float LightColor[]= {static_cast <float> (((rgb[0]/rgb[0])-1)+color_1), 
                             static_cast <float> (((rgb[1]/rgb[1])-1)+color_2), 
                             static_cast <float> (((rgb[2]/rgb[2])-1)+color_3)};

Nur kann ich dir gerade garnicht sagen ob das auch wirklich so funktioniert wie ich mir das vorstelle. Nach der Rechnung, bekommst du erstmal 0.0f, color_1-3 besorgt dir dann ein Kommawert. Dieser wird dann plus diese 0.0f gerechnet. Dann hätteste Werte zwischen 0.0f-1.0f. Wenns > 100 geht, müssteste dir eben ne kleine Abfrage basteln, die abfragt ob sich die rgb[0-2]-Werte über 100 befinden und dann durch 1000, anstatt durch 100 teilt. Naja ist alles ungetestet, ich bin später zu Hause.

Mfg.
S. Wegener

9

21.12.2008, 18:37

Zitat

Das geht so ohne weiteres nicht. Du willst von einer Fabrtabelle in die andere "switchen". Du kannst nicht einfach durch 255.0f teilen, denn was ist, wenn rgb[0]=45 ist?

Wo ist denn hier das Problem? Wieso sollte eine Division durch 255 nicht ausreichen?

Anonymous

unregistriert

10

21.12.2008, 18:41

Er möchte die Werte am Ende von 0.0f-1.0f haben, wenn du durch 255.f teilst, bekommste ne Ellenlange Zahl heraus.
Mfg.
S. Wegener

Werbeanzeige