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

Aktuelle Zeit: Sa Jul 19, 2025 12:33

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: gluScaleImage
BeitragVerfasst: Di Jul 17, 2007 07:12 
Offline
DGL Member

Registriert: Do Mai 18, 2006 21:35
Beiträge: 4
hi, die angeführte funktion klappt bis auf den gluScaleImage-befehl möchte aber auch "non power of two" texturen bzw. bilder laden können.

bitte um hilfe (korrekter syntax?) - danke

Code:
  1.  
  2. procedure TglForm.LoadTex(tex:gluInt;filename:string);
  3. var
  4.   img : PSDL_Surface;
  5. begin
  6.  
  7.   img := IMG_Load(PChar(filename));
  8.  
  9.  if assigned(img) then
  10.   begin
  11.     -> wirft error: gluScaleImage(GL_RGBA,img^.w,img^.h,GL_UNSIGNED_BYTE,@img,512,512,GL_UNSIGNED_BYTE,@img);
  12.     glBindTexture(target, tex);
  13.     glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  14.     glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  15.     glTexImage2D(target,0,GL_RGBA,img^.w,img^.h,0,GL_RGB,GL_UNSIGNED_BYTE,img^.pixels);
  16.     SDL_FreeSurface(img);
  17.   end;
  18.  
  19. end;
  20.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 17, 2007 08:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also für NPOT Texturen brauchst du eigentlich nichts weiter tun als das gluScaleImage wegzulassen. Wenn du ein 300x200 Pixel großes Bild an glTexImage2D übergibst wird es als NPOT behandelt. natürlich nur sofern die Grafikkarte das auch kann. Und die können das ab OpenGL 2.0 oder der Extension GL_ARB_texture_non_power_of_two. Du solltest aber evtl über einen fallback nachdenken. Also sofern NPOT nicht unterstützt ist dann muss das Bild skaliert werdern.

Das würde dann in etwa so aussehen.
Code:
  1. IMG_Load(...)
  2.  
  3. if not (GL_ARB_texture_non_power_of_two or GL_VERSION_2_0) then
  4.   gluScaleImage(...)
  5.  
  6. glTexParameteri(...)
  7. glTexImage2D(...)


Wo wir aber beim nächsten Thema sind. gluScaleImage geht deswegen nicht, weil die glu mit sdl nicht zu tun hat. Und die gluScaleImage möchte als Parameter gerne einen Pointer auf die Bilddaten. Du übergibst aber einen Pointer auf ein SDL Surface. Somit hat er 4Bytes die er als Bild betrachtet. Du musst wie du das bei glTexImage2D schon gemacht hast also img^.pixels übergeben. ABER auch nur für das eingehende Bild. Für das ausgehende Bild musst du in jedem Falle einen eigenen Speicherbereich erstellen, da die Bilder ja nicht die gleichen größen haben werden sondern es durchaus größer etc werden kann. Und dann greift die glu auf einen nicht existierenden Speicher zu.
Also mit GetMem einen Speicherblock anfordern der die gewünschten Maße (512x512x4) hat. Und den musst du an die glu funktion übergeben bzw auch an glTexImage dann. Nach glTexImage solltest du den Speicherbereich dann aber auch wieder frei geben. Das geht mit FreeMem.

Aber etwas am Rande ein fixes Skalieren eines Bildes auf 512x512 halte ich für nicht so gut. Aber evtl solltest du das auf POT anpassen. Also zum Beispiel 256x512 oder so was. Je nachdem wo es besser reinpasst. Aber selbst das würde ich nur machen wenn es keine andere Möglichkeit gibt, denn man bekommt so immer qualitätsverluste. Und je nach Textur sieht das dann gar nicht mehr schön aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 17, 2007 20:40 
Offline
DGL Member

Registriert: Do Mai 18, 2006 21:35
Beiträge: 4
danke - theorie verstanden (speicher fürs neue bild reservieren) - ich habs aber leider noch nicht so mit den variablen typen:

Code:
  1. var
  2.   Buffer: PByteArray;
  3. begin
  4. GetMem(Buffer,512*512*4);
  5. gluScaleImage(GL_RGBA,img^.w,img^.h,GL_UNSIGNED_BYTE,img^.pixels,512,512,GL_UNSIGNED_BYTE,Buffer);

...
so kalppst leider nicht. welchen typ benötige ich nun für mein bild im speicher?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 17, 2007 22:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was klappt denn nicht? Ist immer hilfreich zu wissen. Bzw eigentlich fast immer sehr wichtig.

Aber vom Prinzip her ist der Typ des Pointers egal, da jeder Pointer nur die Adresse speichert an der der Speicher liegt. Der Typ des Pointers ist nur von interesse wenn man später selber noch auf den Inhalt zugreifen möchte. Ich benutze aber ganz gerne immer PByte.

Etwas woran es evtl liegen könnte. Hat dein Bild einen Alphakanal? Denn gluScaleImage setzt einen RGBA Bild vorraus. Also weil du das angegeben hast. Und sollte dein Bild aber nur RGB haben dann fehlt ein ganzer Kanal und somit auch 1/4tel des Speichers. Das kann auch ein Grund dafür sein, dass es kracht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 18, 2007 05:22 
Offline
DGL Member

Registriert: Do Mai 18, 2006 21:35
Beiträge: 4
Es lag wirklich am fehlenden Alpha - mit GL_RGB klappts jetzt. super vielen dank!

lg
christian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 18, 2007 07:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du solltest aber aufpassen. Sobald du so jetzt natürlich ein Bild anpassen möchtest was einen Alphakanal hat wird es zwar keinen Fehler geben aber das resultierende Bild wird auch unbrauchbar sein. Solange die Bilder alle von dir sind und du das berücksichtigen kannst ist es okay. Aber wenn es zur Laufzeit oder durch den Benutzer verändert werden kann wirst du wohl schnell Probleme bekommen können.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 18, 2007 08:42 
Offline
DGL Member

Registriert: Do Mai 18, 2006 21:35
Beiträge: 4
verwende nur jpg-bilder (für eine diashow) - da solltes keine probleme geben. sonnst hängts wohl vom dateityp ab ....


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]