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:
IMG_Load(...)
if not (GL_ARB_texture_non_power_of_two or GL_VERSION_2_0) then
gluScaleImage(...)
glTexParameteri(...)
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.
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.
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.
Mitglieder in diesem Forum: 0 Mitglieder und 9 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.