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

Aktuelle Zeit: Fr Jul 18, 2025 08:53

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2003 13:41 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Kurze Frage: Gibt es irgendwelche Freeware-Programme, mit denen man Texturen mit Alpha Kanal malen kann?

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2003 14:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Auf Anhieb fällt mir da keines ein.

Du kannst den Alphakanal aber auch seperat in eine andere Textur legen und die dann mittels einer guten Texturunit zusammfügen. Allerdings gibt es eine glBmp.pas von Jason Allen (delphigl.cfxweb.net). Die hat aber ein paar echt dumme Eigenschaften. Der Alphakanal ist immer mit dabei und steht standard auf 255. :-( und die Textur liegt permanent im Speicher. Freigeben der Klasse hätte auch Löschen der Textur zur Folge. Und die TextureUnit von Jan Horn kann Alpha allerdings nur wenn der Alpha Kanal in der Textur liegt. Und das geht irgendwie nur bei TGA.

Da ich allerdings mit beiden Versionen nicht so super zu Frieden bin hatte ich mir in den letzten Paar Tagen "mal eben so" (wenn Programmierer lange weile haben) eine eigene Klasse geschrieben. Diese ist zwar noch nicht 100%tig fertig aber hat (wie ich meine) schon ein paar ganz brauchbare Funktionalitäten.
- Tga (24 Bit u. 32 Bit Uncompressed), Bmp, Jpg (Ladbar aus Datei, Resourecename, ResourceID, Stream und TBitmap)
- wählbares Texturformat (Grafikkartendefault, 16 Bit und 32 Bit) auch setzbar als Default für alle folgenden Texturen.
- Vollständiges Entfernen der Clientdaten nach Generierung der Texturen. (Somit bleibt die Klasse an sich erhalten frisst aber so gut wie keinen Speicher mehr)
- Seperat behandelbarer Alphakanal. Wird nicht erstellt sofern er auch nicht existiert.
- Sauberes Klassenkonzept. (1D Textur (vielleicht sogar 3D Textur) ist noch geplant)
- Klasse kann freigegeben werden ohne das die Textur zerstört wird.
- Invertieren des Bildes (Seperat wählbar RGB und oder Alpha)
- Kompatibel mit TBitmap

- Texturkompression ist geplannt und in Arbeit.
- Bildschirmoperationen via glReadPixels. (evtl auch glWritePixels)

Falls daran interesse bestehen sollte kann ich die Klasse vorab schon mal hier veröffentlichen. Bzw. in ein paar Tagen wird sich das ganze auch auf meiner Webseite wieder finden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2003 17:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
*wartet darauf* :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2003 17:08 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Klingt wirklich gut, muss ich schon sagen.
Bin selbst immer am pendeln zwischen Textures.pas und GLBmp.pas, konnte mich aber noch nicht dazu durchringen eine der beiden jetzt entgültig zu nutzen und an meine Bedürfnisse anzupassen. Wenn Du deine also veröffentlichen solltest, würde ich da doch mal einen Blick drauf werfen. Was ich aber unbedingt benötigen würde, wäre eine Funktion ähnlich der ColorKey der GLBmp.pas, also einen Farbwert Transparent zu machen, bzw. jedem Pixel der einen bestimmten Farbwert hat den Alphawert zu setzen (erspart es das in einem Bildbearbeitungsprogramm zu erstellen und als TGA zu speichern).

Auf jeden Fall hast Du immer die gerade passenden Units die man gerade braucht scheint mir :D

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 28, 2003 17:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Thunderman hat geschrieben:
Was ich aber unbedingt benötigen würde, wäre eine Funktion ähnlich der ColorKey der GLBmp.pas, also einen Farbwert Transparent zu machen, bzw. jedem Pixel der einen bestimmten Farbwert hat den Alphawert zu setzen (erspart es das in einem Bildbearbeitungsprogramm zu erstellen und als TGA zu speichern).

Derzeit ist es schon so, dass man beim Hinzufügen eines Alphakanals (eigenständiges Bild) eine Funktion übergeben kann. Diese bekommt Rot, Grün und Blau als Parameter und liefert den Alphawert zurück. Diese Methode könnte ich noch ein wenig aufbohren und diese auch ohne Eingangbild aufrufen. Somit ist jedem freigestellt wie er seinen resultierenden Alphawert berechnen möchte. :D

Thunderman hat geschrieben:
Auf jeden Fall hast Du immer die gerade passenden Units die man gerade braucht scheint mir :D

kann gut möglich sein. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 30, 2003 08:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
So ich habe euch mal die aktuelle Version hochgeladen.
Hier auch noch ein ganz kurze Erklärung dazu. Genaueres folgt später auf meiner Seite.

Es befinden sich (derzeit) 2 Klassen in der Unit.
TglBitmap und TglBitmap2D

TglBitmap ist die Basisklasse und implementiert Grundfunktionalitäten. Verwaltung vom internen Speicher, Vorbereiten der Streams etc.

TglBitmap2D überschreibt nur eine Hand voll Funktionen die für das Laden der Bilder zuständig sind. So zum Beispiel AssignFromBitmap. Das ist die einzige Methode der Klasse die ein Bild in den internen Speicher lädt. Alle anderen Methoden laden die Daten erst einmal temporär in ein TBitmap. Was bei bmp und jpg sogar notwendig ist. Beim tga allerdings ein wenig unnütz ist. Allerdings das musste ich zwecks Objektorientiertem Konzept in kauf nehmen.
Das interne TBitmap wird nur über Scanlines angesprochen wodurch die gesamte Klasse ziemlich performant gestaltet sein sollte.

Beim Hinzufügen eines Alphakanals (File, Stream, Resource oder sogar ohne Bild) kann (teilweise muss) eine Funktion übergeben werden. Wenn diese nicht angeben ist wird der durchschnitt von RGB verwendet. Wenn diese angegeben wurde wird diese für jedes Pixel aufgerufen. Als Parameter bekommt sie Rot, Grün, Blau und wenn vorhanden noch den Alphawert des Bildes. Und einen Pointer auf spezifische Informationen. Und der Alphawert muss zurückgegeben werden.
Schön kann man das an der Funktion "AddAlphaFromColorKey" sehen. Dort wird eine interne Alphafunktion verwendet die nichts weiter macht als mithilfe einer Toleranz die Pixel entweder auf Schwarz oder Weiß zu setzen.

Wenn ich Lust und Laune habe dann werde ich so etwas evtl noch für die RGB Daten implementieren. Texturkompression existiert auch noch nicht.

<a href='http://www.dev-center.de/download.php?cat=header&file=glBitmap.zip' target='_blank'>download</a> 5Kb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 15, 2003 15:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Sag mal, kann es sein, dass Du die Texturen genau andersherum lädst als die Textures.pas, etc?
Ich muss gerade alle Texturkoordinaten anpassen, sprich bei dem t-Wert immer ein 1- davor setzen...
Bzw. in deiner Funktion AssignFromBitmap nicht
Code:
  1. for Row := 0 to Height-1 do
sondern
Code:
  1. for Row := Height-1 downto 0 do

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 15, 2003 16:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das ist eine berechtigte Frage die mich selber ein wenig verwirrt hat. Aber ich habe mal ein wenig rumgesucht und ein wenig meinen Hexeditor gequält. Und auch wenn dir die Antwort nicht gefallen wird. Die anderen machen das Falsch. ;)
Nein es gibt kein Richtig oder Falsch. Ich benutze zum Laden der Bilder intern ein TBitmap und lese mich von oben nach unten durch. In einem Bitmap sind aber paradoxer Weise die Zeilen genau anders herum gespeichert. Die unterste Zeile ist die oberste in der Datei. Und die Unit von Jan Horn und Jason Allen machen ein Blockread auf die Datei und somit liegt bei ihnen das Bild vertikal gespiegelt im Speicher. Bei mir allerdings nicht.

Aber um dein Problem zu Lösen würde es sich tatsächlich anbieten, dass du diese eine Zeile änders oder du machst deine Texturkoordinaten anders. Die Unit von Jason Allen hat auch noch Hilfsfunktionen mit denen du ein Bild horizontal oder vertikal spiegeln kannst. Könnte ich evtl auch noch einbauen. Nur dummerweise fehlt mir dazu ein wenig die Zeit.

PS: Intern verwende ich das Format BGR(A) die beiden anderen swappen die Farben noch einmal (nach (RGB). Aber da so ziemlich alle (auch TNT2) BGR(A) als Texturenformat akzeptieren habe ich mal bewusst darauf verzichtet. Ist dadurch ja auch noch ein bissel schneller.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 13:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich hatte doch ein bisschen Zeit bzw. es ging schneller als ich gedacht hätte. Hier also ein kleines Update.
Folgende Features sind zu der Unit hinzugekommen.
- Sofern das Format BGR(A) von der Grafikkarte nicht unterstützt wird (kein GL_EXT_bgra und kein OpenGL1.2) wird das Format intern in RGB gewandelt. Andernfalls wird es nicht getan, weil die Bilder in diesem Format vorliegen und die Karten damit klar kommen. Wäre sonst nur unnötig verschwendete CPU Leistung.
- Ich habe funktionen hinzugefügt die das Bild horizontal und eine die das Bild vertikal spiegelt. Zur Kompatibilität mit anderen Units.
- Ich habe eine Funktion hinzugefügt mit der man Bilder per Funktion erstellen bzw. diese mit Hilfe einer Funktion verändern kann. So per Pixel Effekte.
Um mal ein wenig bildlicher zu sprechen. Man übergibt dieser Methode eine Funktion und diese wird für jedes Pixel aufgerufen. Einzugriff auf andere Pixel ist nicht möglich. Folgende "Effekte" habe ich damit intern gelöst.
- Das vertauschen der Kanäle (BGR zu RGB)
- Das Invertieren von RGB und oder Alpha
- Das Erstellen eines Alphakanals mit Hilfe eines Bildes und einer Farbabwichung. (ColorKey)
Und man kann damit Texturen erstellen, die berechnet werden können. Sinuswellen, Kreise, Verläufe, etc.

http://www.dev-center.de/download.php?cat=header&file=glBitmap.zip


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 16:50 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Hallo!

Erstmal danke für die neue Version.
Aber ich habe noch nen bischen was für dich ;)
Erstmal gibt es Probleme die Unit zusammen mit den OpenGL 1.5 Header hier zu nutzen. So kennen diese Header an diesem Code 2 Dinge nicht:
Code:
  1. if (GL_VERSION_1_2) then begin
  2.   Format := GL_BGR;
Zum einen gibt es in den Headern keine Variable für die OpenGL Version. Das ganze habe ich jetzt mal aus der OpenGL12.pas nachgerüstet. Zweitens gibt es das Format GL_BGR und auch GL_BGRA in der OpenGL15 nicht. Mit der Erweiterung _EXT allerdings schon. Die sind auch von dem Wert der Konstanten identisch. In der OpenGL12 kommen sie auch doppelt vor. Daher denke ich, dass in der OpenGL15 entweder nur vergessen wurde die doppelt (einmal als Extension, einmal als Kern) anzugeben, oder die OpenGL12 hat das nur so gemacht, und es gibt sie nur mit _EXT.
Also die OpenGL15 sollte man wohl um die GL_VERSION_1_X Variablen ergänzen, und was die Konstanten GL_BGR... angeht entweder musst Du deine Texturunit anpassen oder die OpenGL15 Header müssen ergänzt werden. Wäre jedenfalls sinnvoll, wenn die Units zusammenlaufen und auch mit anderen Units kompatibel sind.

Zudem: wie steht's mit Texturenkompression? Sonst bau ich mir das selbst ein, ist auch nicht so wichtig.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 16:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zur Wahrung der Forenübersicht hab ich mir mal die Freiheit genommen und die relevanten Postings im Bezug auf LossyExs Texturenlibrary aus dem alten Thread rausgelöst und in einen neuen gepackt, hoffe mal ihr seid mir deshalb nicht böse :twisted:

@Thunderman :
Ne neue OpenGL15.pas ist bereits in Arbeit und wird auch etwaige Diskrepanzen und Fehler des bisherigen Headers bereinigen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 17:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
@SOS: Danke dafür. 8)

@Konstanten: Das ist richtig die fehlen in der Opengl15.pas. Die wurden einfach nur vergessen. Die sind ein Bestandteil von OpenGL 1.2 und GL_EXT_bgra. Die Werte davon sind identisch nur der Form wegen habe ich die getrennt.
Derzeit wird es wohl besser sein, du hängst an die beiden betroffenen Variablen mal ein _EXT an. Dann sollte es wieder gehen.

@Texturkompression: Ich habe schon einige Schritte deswegen unternommen aber aber das ist noch nichts Halbes und Ganzes. Wie du an einigen Kommentaren siehst ist es in Arbeit. Das war allerdings nur mal eine Testimplementation und stützt sich auf die GL_EXT_texture_compression_s3tc. Mir persönlich ist aber die ARB_texture_compression lieber. Nur dummerweise erhalte ich dort immer ein weißes Bild. Das Selbe wenn ich normal glTextImage2d verwende. :evil:
Aber ich schätze mal, dass ich in den nächsten paar Tagen (spätestens am WE) eine Version bereitstellen kann die auch Texturkompression unterstützt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
@Texturenkompression :
Ich nutze ja ne modifizierte Textures.pas (Original von Jan Horn), und hab dort auch noch ein paar praktische Sachen selbst eingebaut, darunter auch Texturenkompression via GL_ARB_texture_compression.
Die "Implementation" ist dabei aber mehr als simpel, und evtl. hast du nur irgendwo nen dummen Fehler gemacht der dir nicht auffällt.So erstell ich die komprimierten Mipmaps :
Code:
  1. gluBuild2DMipmaps(GL_TEXTURE_2D, GL_COMPRESSED_RGBA_ARB, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)

Und das funzt einwandfrei (siehe NapalmBomber3D).Im Prinzip muss man ja nur eine Konstante ändern und prüfen ob die Graka die Extension kennt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich hatte die glCompressedTexImage2DARB und die glTexImage2D ausprobiert und war beide Mal weiß. Aber gut dann muss ich mir das mal anschauen. Dann wirds wahrscheinlich schon mprgen was. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2003 17:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Die Funktion glCompressedTexImage2DARB ist nicht dazu gedacht, eine Textur zu komprimieren, sondern eine bereits im S3TC-Format komprimiert gespeicherte Textur (DDS) zu GL hochzuladen.Wenn du also damit versuchst eine unkomprimierte Textur zu laden, klappt das natürlich nicht
Mehr Infos dazu gibts übrigens in diesem Dokument von NVidia.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] 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.

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