Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
hallo
ich habe ein problem mit dem Texturenladen oder auch Binden, ich habe jetzt schon sicher 5h an dem herumgerätselt aber OpenGL bleibt irgendwie stur
soviel ich weiss lädt er die textur, denn im ram wird speicher beansprucht. Ausserdem zeigt er eine kugel, auf der eine textur sein sollte, ganz normal an, einfach ohne Textur.
das laden sieht so aus:
Code:
glenable(GL_TEXTURE_2D);
glGenTextures(2,@TexNrArray);
CreateImageBMP('Zwinger256.bmp',Breite,Hoehe,PBitmap);// verweist auf unten stehende prozedur
dann wird in einer objekt prozedur die textur auf eine kugel "projeziert":
Code:
Quadric:=gluNewQuadric;
gluQuadricDrawStyle(Quadric,GLU_FILL);
gluQuadricTexture(Quadric, GL_TRUE);
glEnable(GL_TEXTURE_2D);
glMatrixMode(GL_TEXTURE);
glLoadIdentity;
glBindTexture(GL_TEXTURE_2D,TexNrArray[1]);
glScalef(1,1,0);
glMatrixMode(GL_MODELVIEW);
gluSphere(Quadric,3,50,50);
ich weiss überhaupt nicht woran es liegt das dies nicht funktioniert, habe schon einige programme angeschaut in denen prozeduren geladen werden und in denen wirds immer irgendwie ähnlich bis fast gleich gemacht.
ich hoffe auf eine baldige antwort
wie gesagt, er stellt die kugel ganz normal dar, wenn ihr wollt, kann ich auch noch die lighting, createprozeduren usw hier abliefern...
mfg gaukler
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das hat dj3hut1 schon gut erkannt. Das glTexImage ist ein bisschen überflüssig. Wobei ich persönlich mittlerweile die gluBuildMipMaps nur noch in Extremsituationen benutzen würde. Mip maps kann man seit OpenGL 1.4 von seiner Grafikkarte erzeugen lassen. Was wesentlich schneller ist. Und mir fällt gerade auf, dass du durch deine Filterung die MipMaps auch gar nicht aktiviert hast.
Aber noch ein Wort in Ehren. Die Methode CreateImageBMP solltest du auf jeden Fall so schnell wie möglich ändern! Ich persönlich halte es für gefährlich einen Speicherbereich zu erstellen und desen Pointer als var parameter oder über result zurückgeben zu lassen. Aber wenn man sich an gewisse Dinge hält mag das noch gehen. Was bei dir aber richtig schlimm ist ist die Tatsache, dass der Speicherbereich nicht mal manuell erstellt wurden ist sondern von einem TMemoryStream stammt. TMemoryStream ist nur eine Kappselung eines Speicherbereichs damit es als TStream benutzt werden kann. Was für Texturen aber absolut nicht notwendig ist. Und dann belässt du den Stream auch einfach im Speicher. Bei einer 512x512 x RGBA Textur entsteht so ein Speicherloch von mal eben 1 MB. Da die Textur dann aber eigentlich bereits auf der Grafikkarte ist wäre das absolut verschwänderisch und äußerst unsauber. Ich hoffe du hast verstanden worauf ich hinaus möchte.
Zusätzlich kommt noch hinzu, dass glTexImage normalerweise nur die Pixeldaten bekommen möchte. Und dabei benötigst du keinen Header mehr. Zusätzlich finde ich den Weg mit dem DC des Desktops ziemlich extrem, wenn man bedenkt, dass ein TBitmap einem einen direkten Zugriff auf dessen Speicher ermöglicht. Dann dein TRGBRec. Diese dürfte mitunter 4 oder 8 Bytes groß sein. Je nachdem was in deinem delphi eingestellt ist. Du solltest dabei packed als zusatz angeben. Aber da du den Pointer eh umständlich berechnest könntest du damit sogar noch glück haben. Wobei das aber wieder ein wenig überflüssig wäre. Die Grafikkarten kennen ab OpenGL 1.2 (das konnte sogar meine uralte TNT 2) auch BGR Texturen. Also genau das was in einem BMP gespeichert ist.
Hat es eigentlich einen Grund warum du mit glGenTextures 2 Texturen erstellst?
Zum Testen ob deine Textur funktioniert würde ich dir im ürbigen auch ein Quad empfehlen, da du so sehr gut sehen kannst ob sie auch genau so ist wie sie sein sollte.
Da ich auch mehr als meckern kann hier mal ein Stück Code aus meiner glBitmap. Sehr stark verändert. Ich lade mittlerweile (noch nicht veröffentlicht) aus einem Bitmap 5 verschiede Formate. Auf die Codes gibt es keine Garantie, da ich sie hier im Editfeld des Forums zusammengefummelt habe.
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
könnte es evtl auch sein, das es da dran liegt, das ich nach jedem texturenladen wieder ein neuer createrenderingcontext mache usw dann damit irgendwie die texturen lösche?
Weil ich rufe jedes mal beim ändern vom objekten das ganze eigentlich neu auf.
ich weiss das es schlecht programmiert ist, aber für 2 texturen sollte es vorerst reichen, wollte damit mal n bisschen rumspielen, nur dumm war das ich keine textur auf den bildschirm brachte...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hmmm. Das könnte es natürlich auch noch sein. Wobei du die Texturen nicht löscht. Die existieren dann so bis du den Kontext löscht. Wenn du aber nur einen Neuen erstellst, dann kennt er die Texturen. Der andere aber schon. Und somit würdest du wohl so etwas von massig an Speicher auf der Grafikkarte verbraten. Mal ganz zu schweigen von dem Bildschirmbuffern. Die ja dann auch noch existieren.
Also du solltest in jedem Fall nur ein mal einen Kontext erzeugen. Außer du veränderst das Fenster so sehr, dass es nicht mehr gültig ist und du einen neuen Kontext erstellen musst.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Am allereinfachsten Texturen lädt man so:
1. Man nimmt sich das 1.5er Template von der Seite hier oder baut sich eins wie's im Quickstart beschrieben ist.
2. Man lädt sich die glBitmap.pas oder besser gleich den ganzen DGLSDK runter (http://wiki.delphigl.com/index.php/DGLSDK)
3. Du baust dir eine Liste mit Instanzen der TglBitmap2D Klasse. Jede instanz für eine Textur.
4. Du rufst nur noch TexArray[n].bind auf und deine Textur ist geladen.
Also...grob. Aber mit der Texturunit bist du auf der sicheren seite.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
hab mal angefangen sdl zu proggen. das ist echt sehr gut gemacht und wenn ich ehrlich bin auch einfach wenn man mal die grundlagen kennt und ein gescheites template hat
und jetzt gehts auch endlich, kann mal was darstellen mit sdl *freu* waren ein paar stunden arbeit, aber ich denke es hat sich gelohnt!
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.