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.
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.
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.
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:
Bitmap.PixelFormat:= pf24Bit;
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.
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.
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.
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.
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.
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.