Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 07, 2025 22:02

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Mär 07, 2007 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
Hallo,

also ich bin mir sicher wenigstens in der richtigen Sparte diese Frage zu stellen, da ich seit einer Woche mich, dank der Tutorials, mit OpenGL beschäftige. Ich bin nun dabei einen 2D Bildschirmschoner (wegen Übungszwecken) zu programmieren. Dabei soll am Anfang des Programmstarts ein Screenshot gemacht werden und nachher auf ein Rechteck (das genausogroß wie der Bildschirm ist) "geklebt" werden.
Also der Screenshot ist kein problem und er wird auch korrekt in das TBitmap gespeichert. (Ich habe dazu mal es in eine Datei ausgeben lassen)
Das rechteck ist ebenfalls kein Problem und es hat auch die richtige Größe und Position. (auch sicher, da ich es mit mal verzerrt angeschaut habe)

Doch das texturieren macht echte Probleme, denn ich führe folgenden Code aus und es passiert nichts außer, dass alle Farben kräftigh dunkler werden und keine Textur angezeigt wird.
Code:
  1. procedure TBackground.LoadTexture;
  2. begin
  3.   //OpenGL-Textur erstellen und aktivieren
  4.   glGenTextures(1, @screenshotID);
  5.   glBindTexture(GL_TEXTURE_2D, screenshotID);
  6.   //Filter setzen
  7.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  8.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  9.  
  10.   //Texturdaten in den Grafikkartenspeicher schieben
  11.   glTexImage2D(GL_TEXTURE_2D, 0, 3, screenshotbmp.Width, screenshotbmp.Height, 0, GL_BGR, GL_UNSIGNED_BYTE, screenshotbmp.ScanLine[screenshotbmp.Height-1]);
  12. end;
  13.  
  14.  
  15.  
  16. function TBackground.createQuad:cardinal;
  17. begin
  18.   result := glGenLists(1);
  19.   glNewList(result, GL_COMPILE_AND_EXECUTE);
  20.  
  21.   glpushmatrix;
  22.  
  23.   AStandardPRS;
  24.   glTranslatef(0,0,-1);
  25.   glColor3f(0,0,0);
  26.  
  27.   glBegin(GL_Quads);
  28.  
  29.   glTexCoord2f(0,0);    glVertex3f(Bigrect.Left,Bigrect.Bottom,0);
  30.   glTexCoord2f(1,0);    glVertex3f(Bigrect.Right,Bigrect.Bottom,0);
  31.   glTexCoord2f(1,1);    glVertex3f(Bigrect.Right,Bigrect.Top,0);
  32.   glTexCoord2f(0,1);    glVertex3f(Bigrect.Left,Bigrect.Top,0);
  33.  
  34.   glEnd;
  35.  
  36.   glpopmatrix;
  37.  
  38.   glEndList;
  39. end;


Was mache ich falsch?

Gruß Alexander

PS: Natürlich rufe ich die durch createQuad erstellte Liste auch auf.

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 07, 2007 16:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was meinst du mit alle Farben werden "kräftig Dunkler"?

Du musst sicher stellen, dass deine Textur auch 24 Bit Farbtiefe hat. Beim Zeichnen würde ich GL_TEXTURE_2D explizit aktivieren. Oder dort wo du die Liste verwendest. Damit OpenGL auch weiß, dass er eine Textur benutzen soll. Außerdem bei einem glColor3f(0,0,0); wird sowieso nichts mehr angezeigt. Die Farbe des Vertex und die der Texturen werden multipliziert und 0 mal irgendwas ist und bleibt 0. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 07, 2007 18:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
Hi,

also es wird nun was angezeigt aber dummerweise klappt es nicht so ganz.
Es werden das Hintergrundbild (Screenshot) irgendwie total falsch dargestellt.
Außerdem werden die Farben der Tropfen (blaue kreise) viel zu dunkel dargestellt.

Woran kann das liegen?

Gruß Alexander

PS: Wie das dann aussieht ist im Anhang

PPS: Ach ja der Code:
Code:
  1. procedure TBackground.LoadTexture;
  2. begin
  3.   glEnable(GL_TEXTURE_2D);    
  4.   //OpenGL-Textur erstellen und aktivieren
  5.   glGenTextures(1, @screenshotID);
  6.   glBindTexture(GL_TEXTURE_2D, screenshotID);
  7.   //Filter setzen
  8.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  9.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  10.  
  11.   //Texturdaten in den Grafikkartenspeicher schieben
  12.   glTexImage2D(GL_TEXTURE_2D, 0, 3, screenshotbmp.Width, screenshotbmp.Height, 0, GL_BGR, GL_UNSIGNED_BYTE, screenshotbmp.ScanLine[screenshotbmp.Height-1]);
  13. end;
  14.  
  15.  
  16.  
  17. function TBackground.createQuad:cardinal;
  18. begin
  19.   result := glGenLists(1);
  20.   glNewList(result, GL_COMPILE_AND_EXECUTE);
  21.  
  22.   glpushmatrix;
  23.  
  24.   AStandardPRS;
  25.   glTranslatef(0,0,-1);
  26.   glColor3f(1,1,1);
  27.  
  28.   glBegin(GL_Quads);
  29.  
  30.   glTexCoord2f(0,0);    glVertex3f(Bigrect.Left,Bigrect.Bottom,0);
  31.   glTexCoord2f(1,0);    glVertex3f(Bigrect.Right,Bigrect.Bottom,0);
  32.   glTexCoord2f(1,1);    glVertex3f(Bigrect.Right,Bigrect.Top,0);
  33.   glTexCoord2f(0,1);    glVertex3f(Bigrect.Left,Bigrect.Top,0);
  34.  
  35.   glEnd;
  36.  
  37.   glpopmatrix;
  38.  
  39.   glEndList;
  40. end;


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 07, 2007 18:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Kreise sind von dir per OpenGL gezeichnet?

Aber ich tippe mal darauf, dass das Format des Bitmaps nicht stimmt. Prüfe mal nach glTexImage2D auf Fehler. Das geht mit glGetError.
Und wie gesagt vor dem Hochladen mal folgendes bei deinem Bitmap ausrufen

Code:
  1. Bitmap.PixelFormat := pf24Bit;
  2. Bitmap.HandleType := bmDIB;

Oder evtl sogar bevor du das Bild kopierst das könnte evtl auch noch schneller sein.

Zur Not Speicher das Bild mal vor dem Hochladen mit glTexImage einmal auf die Platte. Evtl ist das Bild ja schon kappt. Glaube ich zwar nicht.

Wenn das alles nichts hilft dann weiß ich so spontan auch nicht weiter. Sonst sieht der Code eigentlich okay aus. Evtl müsstest du dann mal den Code zur Verfügung stellen, dass sich das Einer mal anschauen kann.

PS: Code war doch oben schon mal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 07, 2007 19:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
Ahh... ich weiß auch nicht wieso auf einmal, aber jetzt klappt es plötzlich.
Ich hatte das offenbar vergessen:
Code:
  1.   screenshotbmp.Width:=screen.Width;
  2.   screenshotbmp.Height:=screen.Height;
  3.  

Ich Idiot. :oops:

Klappt gut. Nur das die Farben der Tropfen ist seltsam.

Ich habe mal die Screenshots in den Anhang gestellt, was mit und ohne Textur los ist.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 09, 2007 18:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
Keiner eine Idee, wieso diese komische Farbveränderung auftritt? :?

Gruß Alexander

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 09, 2007 20:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Nicht wirklich. Aber schicke mir das Project mal bitte per Mail zu. Finden kannst du meine E-Mail Adresse auf der Teamseite. Dann schaue ich mir das mal genau an. Ich denke das wird der einfachste Weg sein.

Bitte aber mit allen zum Kompilieren benötigten Quellen und Resourcen. Bilder etc.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 10, 2007 09:27 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Und wie werden die Kreise gezeichnet? Warscheinlich musst du, bevor du sie zeichnest, zu OpenGL sagen, es solle die Textureinheit deaktivieren. So:
Code:
  1. glDisable(GL_TEXTURE_2D);
oder vielleicht so:
Code:
  1. glBindTexture(GL_TEXTURE_2D, 0);

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 10, 2007 10:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
Ja das wars!!! :D :D :D
Jetzt kalppt's.

Vielen Vielen Dank.

Gruß Alexander

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 10, 2007 10:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe mir die quellen mal angsehen und ein paar Sachen gefunden. Die Vermutung die Sniper hatte trifft da auch zu. Das Beste wäre es, wenn du nach dem Zeichnen des Hintergrundes die Textur wieder deaktivierst. Code ganz unten.

Du machst in deinem Code aber auch noch folgendes.
Code:
  1. glColor3f(getRvalue(color), getGvalue(color), getBvalue(color));


Das ist aber nicht richtig. glColor3f erwartet normierte Werte. Also Werte im Bereichen zwischen 0 und 1. Also müsstest du entweder / 255 rehnen oder etwas benutzten was andere Werte erwartet. glColor3ub zum Beispiel erwartet Werte im Bereich von 0 und 255.

Mir sind in dem Code aber noch ein paar andere Sachen aufgefallen.

Dein Hintergrundbild dürfte nicht überall so ohne weiteres Funktionieren. Der Grund ist, dass die Texturengrößen normal eine Potenz von 2 sein müssen. Es gibt aber auch andere möglichkeiten. Das Einfachste in deinem Falle dürfte sein, wenn du dafür Textur Rectangles vorraussetzt und benutzt. Dazu musst du ein anderes Target benutzen. Also anstelle von GL_TEXTURE_2D müstest du dann überall GL_TEXTURE_RECTANGLE_ARB benutzen. Die andere Alternative wäre, dass du deinen Bildschirm in Bereiche zerschneidest dessen Größe eine Potenz von 2 ist. Dann würdest du aber auch mehr als eine Textur haben.

Code:
  1. procedure TBackground.LoadTexture;
  2. begin
  3.   glEnable(GL_TEXTURE_RECTANGLE_ARB);        
  4.   //OpenGL-Textur erstellen und aktivieren
  5.   glGenTextures(1, @screenshotID);
  6.   glBindTexture(GL_TEXTURE_RECTANGLE_ARB, screenshotID);
  7.   //Filter setzen
  8.   glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  9.   glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  10.  
  11.   //Texturdaten in den Grafikkartenspeicher schieben
  12.   glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 3, screenshotbmp.Width, screenshotbmp.Height, 0, GL_BGR, GL_UNSIGNED_BYTE, screenshotbmp.ScanLine[screenshotbmp.Height-1]);
  13. end;


den Code zum Rendern würde ich dann wie folgt anpassen.

Code:
  1. function TBackground.createQuad:cardinal;
  2. begin
  3.   result := glGenLists(1);
  4.   glNewList(result, GL_COMPILE_AND_EXECUTE);
  5.  
  6.   glBindTexture(GL_TEXTURE_RECTANGLE_ARB, screenshotID);  // NEU
  7.   glEnable(GL_TEXTURE_RECTANGLE_ARB);   // NEU
  8.  
  9.   glpushmatrix;
  10.  
  11.   AStandardPRS;
  12.   glTranslatef(0,0,-1);
  13.   glColor3f(1,1,1);
  14.  
  15.   glBegin(GL_Quads);
  16.  
  17.   glTexCoord2f(0,0);    glVertex3f(Bigrect.Left,Bigrect.Bottom,0);
  18.   glTexCoord2f(1280,0);    glVertex3f(Bigrect.Right,Bigrect.Bottom,0);
  19.   glTexCoord2f(1280,1024);    glVertex3f(Bigrect.Right,Bigrect.Top,0);
  20.   glTexCoord2f(0,1024);    glVertex3f(Bigrect.Left,Bigrect.Top,0);
  21.  
  22.   glEnd;
  23.  
  24.   glpopmatrix;
  25.  
  26.   glDisable(GL_TEXTURE_RECTANGLE_ARB);  // NEU
  27.  
  28.   glEndList;
  29. end;

Damit wäre die Textur auch nur noch dann aktiv, wenn sie wirklich benutzt werden soll. Wichtig dabei aber. Bei Texture Rectangle sind die Texturkoordinaten nicht normiert. Also nicht im Bereich von 0 und 1 sondern sind angaben in Pixel. Im obrigen Code eben hardcodiert auf die Größe meines Monitors. Wie du das anstellst überlasse ich dann mal deine Phantasie.

eine Sache zu den Kreisen. So wie du das jetzt hast kannst du das nicht auf ewig lassen. Irgendwann sind das zu viele Kreise. Dann wird es einfach nur noch richtig langsam. Da würde ich die Anzahl der Maximalen Kreise beschränken.

[edit] mist ich schreibe zu viel und zu langsam. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 10, 2007 13:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
Super klappt auch!!!

Habe den Code umgeschrieben.

Ja das mit dem zu viel werden ist mir klar. ich habe auch vor das zu regulieren.
Ist halt bis jetzt nur nicht drin.


Echt vielen Dank für eure Hilfe.

Tschüss

Alexander

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]