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

Aktuelle Zeit: Fr Jul 18, 2025 12:39

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Apr 24, 2008 10:05 
Offline
DGL Member

Registriert: Mi Mär 31, 2004 15:24
Beiträge: 114
Hallo Leute!

Ich habe eine Frage zur Realisierung von Transparenz in Texturen. Ich möchte, dass nur eine Farbe in der Textur als transparent angezeigt wird, der Rest soll undurchsichtig sein. Es geht hierbei um Gras-Texturen, die in der Gegend "stehen" sollen. Ich hab da auch schon einige Vermutungen. Hat es vielleicht irgendwas mit dem Alpha-Test und dem Alpha-Kanal einer Textur zu tun? Ich benutze die glBitmap von LossyEx, funktioniert das irgendwie mit "AddAlphaFromFunc" oder ähnlich?


Viele Grüße,


Rüdiger


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 10:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Um mit der glBitmap eine Farbe als Transparenz festzulegen musst du nach dem Laden der Datei AddAlphaFromColorKey* aufrufen. Welche Methode davon ist egal, denn die haben nur unterschiedliche Eingangswerte. Diese Methode erstellt, dann einen Alphakanal und trägt entweder 0 oder 1 für die entsprechende Farbe ein.

In OpenGL benötigst du zum Darstellen dann außederdem entweder noch den Alphatest oder aber Blending. Der Alphatest schneidet nur hart ab wärend das Blending weich ausblendet.

ABER: Stellst du die Texturen pixelgenau dar oder nicht? Denn AddAlphaFromColorKey hat bei Texturen die nicht 1:1 dargestellt werden einen mitunter unschönen Nebeneffekt. Dadurch, dass in OpenGL die Texturen geglättet werden verlaufen die Farben innerhalb der Kanäle. Wenn du also Pink als Transparenzfarbe benutzt, dann verlaufen die Ränder des Grases zu Pink. Die Transparenz aber auch. Aber bevor die Texel (Pixel der Textur) ganz verschwunden sind kann man noch so ein bisschen pink erkennen. Dein Gras hätte also einen kleinen Pinken rand. Das passiert bei allen farben. Nur manchmal zeigt es sich besser (pink) als bei anderen Farben.

Wenn das der Fall sein sollte, dann solltest du das Gras mit einem Grafikprogramm bearbeiten und dort den Alphakanal hinzufügen. Bzw auch dafür sorgen, dass die RGB Werte etwas in die Transparenz reichen. Falls du nicht genau weißt was ich meine, dann kannst du das Bild auch eben anhängen, dann kann ich oder jemand anderes das auch eben machen und dir dann zeigen wie das gemeint war.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 10:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
oder du benutzt den AlphaTest mit Alpha = 1.0, dann hast du auch keine Ränder.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 10:59 
Offline
DGL Member

Registriert: Mi Mär 31, 2004 15:24
Beiträge: 114
Wie benutze ich denn den Alpha-Test vernünftig?

Ich filtere glaub ich linear - also keine pixelgenaue darstellung. Das "Verlaufen" wäre auch nicht so schlimm, dann benutze ich als Hintergrundfarbe (welche dann die Transparenz darstellt) einfach eine sehr ähnliche Farbe. Das würde doch auch gehen, oder?
Als Texturen lade ich Bitmaps in TBitmaps rein. Die haben doch nativ keinen Alpha-Kanal, oder doch? Wenn ich die Transparenz dann in einem Programm machen wollte, müsste ich auf ein anderes Texturformat umsteigen, oder?

Die Grastextur hab ich noch nicht erstellt.

Wie könnte ich denn nun genau vorgehen?

Etwa so?

- Ich erstelle die Textur so, dass Transparenz eine Farbe erhält, die den anderen Farben ähnlich ist oder bereits in der Textur enthalten ist.

- Ich erschaffe mit AddAlphaFromColorKey einen Alphakanal in meiner Textur (wenn noch nicht vorhanden)
- Ich sortiere die Flächen nach Entfernung
- Ich schalte den Alphatest ein?
- Ich rendere die Flächen.


Viele Grüße,

Rüdiger


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 15:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du kannst natürlich auch eine ähnliche Farbe nehmen. Dann würde es leicht dazu verlaufen. Was dann aber nicht mehr auffallen sollte.

Bitmaps haben offiziell keinen Alphakanal. Gimp und die glBitmap können ihn zwar lesen und schreiben aber die WindowsAPI bzw das TBitmap verwirft ihn recht konsequent. Es gibt ihn genau genommen auch nicht so richtig. Wenn du auf das TBitmap verzichtest könntest du auch weiterhin Bitmaps verwenden allerdings könnte es sein, dass du irgendwann unachtsam bist und kurzzeitig das TBitmap benutzt und dich dann wunderst warum es nicht geht. Deswegen würde ich rein aus Sicherheit schon zu einem Alternativformat greifen. Also TGA, PNG oder DDS. Bis auf, dass DDS von Gimp nicht direkt unterstützt wird. Von PhotoShop evtl auch nicht. Das weiß ich nicht ganz.

Zum Rendern. Ja. Ich denke das sollte problemlos so gehen. Wobei ich dir eher empfehlen würde das Blending zu benutzen. Denn der Alphatest ist eine Art ausschneiden. Selbst die dünnsten Grasspitzen hätten harte Kanten. Wenn du blending benutzt, dann würden die dünnen grasspitzen schon von Hause ein bisschen ausgeblendet werden. Ich denke das es besser aussehen würde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 15:29 
Offline
DGL Member

Registriert: Mi Mär 31, 2004 15:24
Beiträge: 114
Okay, dann werd ich es mal mit dem Blenden versuchen. Danke für die Hilfe!

Dazu passend hab ich gerade auch ein Problem:

Ich benutze folgenden Code für's Blenden. Er wird ausgeführt, bevor ich meine Displaylisten rendere:

Code:
  1.  
  2.       glEnable(GL_BLEND);
  3.       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  4.       glColor4f(1,1,1,AlphaValue[0]);
  5.  


Das funktioniert auch sehr gut, obige Funktion benutze ich zum Fadeoff von Terrain. Aber: Wenn ich jetzt Licht aktiviere, funktioniert es nicht mehr. Man sieht die Blöcke, die transparent sein sollten einfach nicht mehr.
Code:
  1.  
  2.   glEnable(GL_LIGHTING);
  3.   glEnable(GL_LIGHT0);
  4.  


Vielleicht ne Idee?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 15:32 
Offline
DGL Member

Registriert: Mi Mär 31, 2004 15:24
Beiträge: 114
Ich muss mich korrigieren, man sieht sich noch - sie sind nur überhaupt nicht mehr transparent!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 15:50 
Offline
DGL Member

Registriert: Mi Mär 31, 2004 15:24
Beiträge: 114
Hat sich erledigt.

Wen's interessiert:

glEnable(GL_COLOR_MATERIAL) hat dafür gesorgt, dass die Alpha-Werte vom Licht nicht überschrieben werden. (glaub ich zumindest)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 19:32 
Offline
DGL Member

Registriert: Mi Mär 31, 2004 15:24
Beiträge: 114
Hey! Ich nochmal :) Hoffentlich liest das noch irgendwer...

Ich experimentier grad ein bisschen mit der Vegetation herum. Mein Ziel ist es ja, eine Textur teilweise transparent zu bekommen und dann richtig darzustellen. Ich möchte dann Lossy's Ratschlag folgen, und Blending einsetzen. Die Textur hat an den richtigen Stellen einen Alpha-Wert, allerdings funktioniert Blenden nicht... Könnt ihr mir behilflich sein?

Code:
  1.  
  2.   glEnable(GL_BLEND);
  3.   glBlendFunc(GL_DST_ALPHA,GL_ONE);
  4.  

Eigentlich dachte ich, dass es mit dieser Funktion klappen würde - ich multipliziere die bereits im Framebuffer liegenden Pixel mit dem Alpha-Wert der Grastextur, also kommen die Pixel nur an den transparenten Stellen durch.

Aber irgendwas mach ich offensichtlich falsch :)

Weiß jemand Rat?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 20:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
nimm
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

mit der Funktion die du hast, machst du Additives Blending und das auch noch auf eine sehr... komische weise (nähmlich abhängig davon, welchen Alphawert der Pixel im Framebuffer hat...).

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 20:32 
Offline
DGL Member

Registriert: Mi Mär 31, 2004 15:24
Beiträge: 114
Funktioniert leider nicht :/
Durch diese Fkt. wird die ganze Textur geblendet, wenn ich den Alphawert mittels glColor4f angebe. Sonst bleibt sie aber undurchsichtig.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 24, 2008 21:45 
Offline
DGL Member

Registriert: Mi Mär 31, 2004 15:24
Beiträge: 114
Okay, alles in Ordnung :)

Es funktioniert mit dem von dir gegebenen Befehl, Lord Horazont. Danke vielmals!


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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 ]