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

Aktuelle Zeit: Mo Jul 07, 2025 04:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Mär 14, 2007 20:37 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,

Ich habe mehrere Texturen geladen, und möchte das eine bestimmte Farbe immer Transparent ist.


Ich verwende glBitmap als Texturloader.

Ich lade meine Textur
LoadTexture('ferby.tga', Textur[1], false);

und habe diese funktion gefunden AddAlphaFromValue(100);

Allerdings kommt die Meldung [Fehler] MainUnit.pas(47): Undefinierter Bezeichner: 'AddAlphaFromValue'


Warum? Was mach ich falsch?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 14, 2007 21:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also als erstes. Du hast mit der glBitmap 2 Wege um Texturen zu laden. 1. den Proceduralen. Das ist dann nur die Methode LoadTexture. Und NICHTS weiter und dann den Objektorientierten bei dem du die Bilder noch verändern, beeinflussen kannst. Ich empfehle grundsätzlich den über die Objekte. Dann würde das ganze in etwa so aussehen.

Code:
  1. var
  2.   Tex: TglBitmap2D;
  3. begin
  4.   Tex := TglBitmap2D.Create;  // Klasse erstellen
  5.   Tex.LoadFromFile('Blahhhh');  // Datei laden
  6.   Tex.AddAlphaFromValue(100);  // fixen Alpha von 100 setzen
  7.  
  8.   Tex.GenTexture;  // Wenn alles Fertig ist dann Textur Erzeugen
  9. end;


Wenn du die Textur nicht mehr brauchst dann einfach die Textur freigeben. Binden kannst du die Textur dann mit Tex.Bind. Dabei wird auch (ohne zusatzparameter bei bind) auch gleich GL_TEXTURE_2D mit aktiviert.

PS: Wenn du lieber mit der ID der Texture arbeiten möchtest dann kannst du wie folgt die Textureklasse freigeben ohne, dass die Textur gelöscht wird.
Code:
  1. Textur[1] := Tex.ID;  // ID Holen
  2. Tex.DeleteTextureOnFree := False;  // Texturfreigabe verhindern
  3. Tex.Free;  // Instanz frei geben


PPS: Ein fixer Alphawert von 100 macht nur sehr selten Sinn. Besser und resourceschonender wäre es wohl, wenn du den Alphawert über glColor4f einstellst.

[edit] Was mir gerade noch auffällt. Wenn du eine Farbe transparent haben möchtest musst du wohl eher ColorKeys verwenden. Dabei wird bei einer bestimmten Farbe der Alphakanal gesetzt oder nicht.
Code:
  1. Tex.AddAlphaFromColorKey(0, $FF, 0); // Exaktes grün wird zu Alpha.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 14, 2007 22:03 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,

Das man die Texturen Objektorientiert laden kann, hab ich nicht gewußt.
Das ist sicher die besser Möglichkeit.

Leider funktioniert die Transparenz noch immer nicht....


Im Anhang ist mein kleinens Project. Das einizge, was ich will, ist, das das Schwarz in der Grafik Ferby.tga Transparent ist.......


Hier der Quellcode


Code:
  1.  
  2. unit MainUnit;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Forms, dglOpenGL, glBitmap, Classes, ExtCtrls, SysUtils, SimpleOpenGL;
  8.  
  9. type
  10.   TMainForm = class(TForm)
  11.     FrameTimer: TTimer;
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure FormDestroy(Sender: TObject);
  14.     procedure Render(Sender: TOBject);
  15.     procedure FormResize(Sender: TObject);
  16.   end;
  17.  
  18. var
  19.   MainForm: TMainForm;
  20.  
  21.   // OpenGL Ini
  22.   DC : HDC;
  23.   RC : HGLRC;
  24.  
  25.   // Test
  26.   Textur1: TglBitmap2D;
  27.  
  28. implementation
  29.  
  30. {$R *.dfm}
  31.                                                                                 ////////////
  32.                                                                                 // CREATE //
  33.                                                                                 ////////////
  34. procedure TMainForm.FormCreate(Sender: TObject);
  35. begin
  36.   DC:= GetDC(Handle);
  37.   RC:= CreateRenderingContext( DC,[opDoubleBuffered],32,24,0,0,0,0);
  38.   ActivateRenderingContext(DC, RC);
  39.   glEnable(GL_DEPTH_TEST);  // Tiefentest
  40.   glEnable(GL_CULL_FACE);   // nur vorderseite zeichnen (gegen urzeigersinn)
  41.   glEnable(GL_TEXTURE_2D);
  42.   glClearColor(0.2, 1, 1, 1);
  43.  
  44.   // Lade Textur
  45.   Textur1 := TglBitmap2D.Create; // Klasse erstellen
  46.   Textur1.LoadFromFile('Ferby.tga'); // Datei laden
  47.   Textur1.AddAlphaFromColorKey(0, 0, 0); // fixen Alpha  setzen
  48.   Textur1.GenTexture; // Wenn alles Fertig ist dann Textur Erzeugen
  49.  
  50.   Render(NIL);
  51. end;
  52.  
  53.                                                                                 ////////////
  54.                                                                                 // RENDER //
  55.                                                                                 ////////////
  56. procedure TMainForm.Render(Sender: TOBject);
  57. begin
  58.   // Lösche Altes Bild
  59.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  60.  
  61.   glMatrixMode(GL_PROJECTION);
  62.   glLoadIdentity;
  63.   glViewport(0,0,ClientWidth,ClientHeight);
  64.   glOrtho(0,800,600,0,0,128);
  65.  
  66.   // Ferby Schriftzug
  67.   Textur1.Bind;
  68.   glSimpleQuad(50,50,700,500,0);
  69.  
  70.   SwapBuffers(DC);
  71. end;
  72.                                                                                 ////////////
  73.                                                                                 // RESIZE //
  74.                                                                                 ////////////
  75. procedure TMainForm.FormResize(Sender: TObject);
  76. begin
  77.   glViewport(0, 0, ClientWidth, ClientHeight);
  78.   glMatrixMode(GL_PROJECTION);
  79.   glLoadIdentity;
  80.   gluPerspective(50, ClientWidth/ClientHeight, 1, 1000);
  81.  
  82.   glMatrixMode(GL_MODELVIEW);
  83.   glLoadIdentity;
  84. end;                                                                            /////////////
  85.                                                                                 // DESTROY //
  86.                                                                                 /////////////
  87. procedure TMainForm.FormDestroy(Sender: TObject);
  88. begin
  89.   DeactivateRenderingContext;
  90.   DestroyRenderingContext(RC);
  91.   ReleaseDC(Handle, DC);
  92. end;
  93.  
  94.  
  95.  
  96. end.
  97.  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 14, 2007 23:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja der Alphakanal in der Textur ist Eines aber du musst OpenGL natürlich auch noch sagen was er damit anstellen soll. Bei einem ColorKey genügt ein simpler Alphatest. Bei Semipranzparenzen sollte es dann schon Blending sein.

Das ist ein Alphatest. Das musst du setzen bevor du deine Fläche zeichnest und wenn du es nicht mehr benötigst musst du GL_ALPHA_TEST wieder deaktivieren.
Code:
  1.  glEnable(GL_ALPHA_TEST);
  2.  glAlphaFunc(GL_GREATER, 0.1);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 11:39 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,

danke jetzt geht's


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.007s | 14 Queries | GZIP : On ]