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

Aktuelle Zeit: Mi Jul 16, 2025 19:35

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



Ein neues Thema erstellen Auf das Thema antworten  [ 46 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Transparenz mit TGLBitmap
BeitragVerfasst: Do Mär 11, 2004 13:05 
Offline
DGL Member

Registriert: Do Mär 11, 2004 12:33
Beiträge: 24
Hallo!

ich benutze die glaux.dll um Texturen zu laden.
jetzt möchte ich, dass eine bestimmte Farbe der Textur transparent dargestellt wird, ich hab aber keine Ahnung wie das mit glaux geht.

ich habe schon versucht das mit Tglbitmap zu machen aber da schaffe ich es nicht mal ganz normal ne Textur anzuzeigen, aber da weiss ich das man bestimmte Farben transparent machen kann.
könnte ihr mir entweder sagen wie ich das mit glaux oder tglbitmap hinbekomme? (Tglbitmap wäre mir lieber, da man sich die anschauen kann was bei der dll schlecht geht)

vielen Dank schon mal
mfg mandumoal


Zuletzt geändert von mandumoal am Do Mär 11, 2004 14:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 13:10 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich arbeite auch gerade mit der glBitmap.
Dein Fehler hatte ich auch. Das liegt daran, dass du nicht TglBitmap sondern TglBitmap2D (für 2D Texturen) verwenden musst.
Dann ganz normal die reihenfolge:
Create [Pfad]
[Load wenn nicht schon bei Create]
genTexture
Bind

Und erst beim Programmende die Texturvariable freigeben.
Wenn du mehrer Texturen verwenden willst solltest du dir ein Feld (eventuell auch dynamisch) anlegen, wo alle TglBitmap2D drinliegen die du brauchst.
Dann aber nur 1x alle Texturen laden.

Zum Alpha Chanel: Zu aller erst brauchst du mal ne Textur die das hat. Zum Bsp. Png (glaube ich) und dann wes ich auch net weiter, da ich das bis Dato net brauchte. Lass mich aber gern belehren.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 13:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja. Soweit ist das auch richtig. Als Bilder kannst du TGA's nehmen. In denen kannst du einen Alphakanal speichern. Weiß nicht ob png das kann. Du kannst den aber auch mit der glBitmap hinzufügen. Sofern es sich nur um eine Farbe handelt.

Dort gibt es eine Methode namens AddAlphaFromColorKey(). Der übergibst du einen Rot, Grün und Blauwert. Und schon wird der da ein Alphakanal erstellt. Mit dem Parameter Deviation kannst du noch eine maximal zulässige Abweichung von dem Farbwert angeben. Bei JPG's kann es durch die Komprimierung zu einer Farbveränderung kommen.

Zum Zeichnen musst du die Textur Binden. Und eine Alphafunc einstellen. Und diesen dann auch noch aktivieren. Anschließend kannst du deine Flächen zeichnen.

Code:
  1. Textur.Bind;
  2. glAlphaFunc(GL_GREATER, 0.1);
  3. glEnable(GL_ALPHA_TEST);
  4. // zeichnen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 13:41 
Offline
DGL Member

Registriert: Do Mär 11, 2004 12:33
Beiträge: 24
Danke erstmal für die Antwort!

ich bekomme es noch nicht ganz hin:

das ist der Code

Code:
  1.  
  2.  
  3. tex : gluInt;
  4.  
  5.  
  6. procedure LoadTextures;
  7. var
  8. textur : tglbitmap2d;
  9. begin
  10.  
  11. textur.Create;
  12. textur.LoadFromFile('textur2.bmp');
  13.  
  14. glGenTextures(1, tex);
  15. glBindTexture(GL_TEXTURE_2D, tex);
  16. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_linear);
  17. glTexImage2D(GL_TEXTURE_2D, 0, 3, textur.Width  , textur.Height , 0, GL_RGB,
  18. GL_UNSIGNED_BYTE, ???  ); // <----  was muss hier als letzer Parameter angegeben werden?
  19.  
  20. end;


ist denn der code prinzipiell richtig?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 13:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Code:
  1. procedure LoadTextures;
  2. var
  3. textur : tglbitmap2d;
  4. begin
  5.  
  6. textur.Create;
  7. textur.LoadFromFile('textur2.bmp');
  8.  
  9. texture.GenTextures;
  10. glBindTexture(GL_TEXTURE_2D, texture.TextureID);
  11.  
  12. //objekt Zeichen
  13.  

Versuch das mal

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 13:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
NEIN. Ist er nicht.

So wie du den Constructor (Create) aufrufst ist das vollkommen Falsch.

Du musst es so machen.
Code:
  1. Texture := TglBitmap2D.Create;


Das ist nicht nur bei meiner Klasse so. Das musst du bei allen Klassen so machen.

Das nächste ist, dass du glGenTextures nicht direkt aufrufen musst. Das macht die glBitmap für dich schon. Du musst dann nur noch folgendes aufrufen.
Code:
  1. Textur.GenTexture;


um deinen Alphakanal noch hinzufügen müsstest du VOR Textur.GenTextur noch AddAlphaFromColorKey aufrufen. Das wars.

PS: Flash. Es existiert auch eine Methode namens Bind bei der Klasse. ;-)
Aber dein Code funktioniert auch nicht.

Also hier mal für alle den Kompletten Code!!!

Code:
  1. procedure LoadTextures;
  2. var
  3.   Textur: TglBitmap2D;
  4. begin
  5.   Textur := TglBitmap2D.Create;
  6.   Textur.LoadFromFile('textur2.bmp'); // Besser sind Absolute Pfadangaben
  7.   // Textur.LoadFromFile(ExtractFileDir(ParamStr(0)) + '\textur2.bmp');
  8.   Textur.AddAlphaFromColorKey(0, 255, 0); // Farbe Grün
  9.  
  10.   Textur.GenTextures;
  11. end;
  12.  
  13. // Später beim Rendern
  14.  
  15. Texture.Bind;
  16. // glEnable(GL_TEXTUR_2D) wird automatisch von Bind auch aufgerufen.
  17. // Evtl. Muss man aber andere TexturTarget wie 1D oder 3D deaktivieren.
  18.  
  19. // Flächen Zeichnen.
  20.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 14:19 
Offline
DGL Member

Registriert: Do Mär 11, 2004 12:33
Beiträge: 24
vielen dank nochmals...

ich habe das jetzt so gemacht aber bekomme bei

Code:
  1. Textur.GenTextur
eine EAccessViolation Zugriffsverletzung.

Das ganze passiert hier:
Code:
  1. procedure TglBitmap2D.GenTexture(TestTextureSize: Boolean);
  2. var
  3.   Comps: Integer;
  4.   Format: Cardinal;
  5.   TexSize: TGLint;
  6. begin
  7.   if Assigned(GetData()) then begin
  8.     // Check Texture Size
  9.     if (TestTextureSize) then begin
  10.       glGetIntegerv(GL_MAX_TEXTURE_SIZE, @TexSize); //<------hier
  11.  
  12.       if ((Height > TexSize) or (Width > TexSize))
  13.         then raise EglBitmapSizeToLargeException.Create('TglBitmap2D.GenTexture - The size for the texture is to large. It''s may be not conform with the Hardware.');
  14.     end;
  15.      


mfg mandumoal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 14:53 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Natürlich sollte zum Zeitpunkt des Texturenladens OpenGL bereits initialisiert sein.
Das PNG Format unterstützt übrigens auch einen Alphakanal, und ist für Texturen an sich perfekt geeignet, da verlustfreie Kompression (wie GIF) und Echtfarbbilder sowie Alphakanal möglich sind.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


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

Registriert: Do Mär 11, 2004 12:33
Beiträge: 24
OpenGl ist zu diesem Zeitpunkt initialisiert.

könnte mal jemand einen Code posten mit seiner initialisierung und einem Quad + texturiert(tglbitmap)?
das wäre sehr nett

mfg mandumoal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 17:57 
Offline
DGL Member

Registriert: Do Mär 11, 2004 12:33
Beiträge: 24
Hallo!

Ich interpretiere eure plötzliche Stille jetzt einfach mal so, dass ich dreist war und zuviel verlangt habe. :(

Da aber Unterschiede zu euren Quellcodes nur noch in der Initialisierung liegen können wäre ich euch dankbar wenn ihr mir mal eine von euch zeigen könntet :D

Meine ist diese hier:
Code:
  1. procedure TForm1.SetupPixelFormat;
  2. var    hHeap: THandle;
  3.   nColors, i: Integer;
  4.   lpPalette : PLogPalette;
  5.   byRedMask, byGreenMask, byBlueMask: Byte;
  6.   nPixelFormat: Integer;
  7.   pfd: TPixelFormatDescriptor;
  8. begin
  9.   FillChar(pfd, SizeOf(pfd), 0);
  10.   with pfd do begin
  11.     nSize     := sizeof(pfd);               // Länge der pfd-Struktur
  12.     nVersion  := 1;                         // Version
  13.     dwFlags   := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or
  14.                  PFD_DOUBLEBUFFER;          // Flags
  15.     iPixelType:= PFD_TYPE_RGBA;             // RGBA Pixel Type
  16.     cColorBits:= 24;                        // 24-bit color
  17.     cDepthBits:= 32;                        // 32-bit depth buffer
  18.     iLayerType:= PFD_MAIN_PLANE;            // Layer Type
  19.   end;
  20.   nPixelFormat:= ChoosePixelFormat(myDC, @pfd);
  21.   SetPixelFormat(myDC, nPixelFormat, @pfd);
  22.                                             // Farbpalettenoptimierung wenn erforderlich
  23.   DescribePixelFormat(myDC, nPixelFormat,
  24.                       sizeof(TPixelFormatDescriptor),pfd);
  25.   if ((pfd.dwFlags and PFD_NEED_PALETTE) <> 0) then begin
  26.     nColors  := 1 shl pfd.cColorBits;
  27.     hHeap    := GetProcessHeap;
  28.     lpPalette:= HeapAlloc
  29.        (hHeap,0,sizeof(TLogPalette)+(nColors*sizeof(TPaletteEntry)));
  30.     lpPalette^.palVersion := $300;
  31.     lpPalette^.palNumEntries := nColors;
  32.     byRedMask  := (1 shl pfd.cRedBits) - 1;
  33.     byGreenMask:= (1 shl pfd.cGreenBits) - 1;
  34.     byBlueMask := (1 shl pfd.cBlueBits) - 1;
  35.     for i := 0 to nColors - 1 do begin
  36.       lpPalette^.palPalEntry[i].peRed  :=
  37.         (((i shr pfd.cRedShift)  and byRedMask)  *255)DIV byRedMask;
  38.       lpPalette^.palPalEntry[i].peGreen:=
  39.         (((i shr pfd.cGreenShift)and byGreenMask)*255)DIV byGreenMask;
  40.       lpPalette^.palPalEntry[i].peBlue :=
  41.         (((i shr pfd.cBlueShift) and byBlueMask) *255)DIV byBlueMask;
  42.       lpPalette^.palPalEntry[i].peFlags:= 0;
  43.     end;
  44.     myPalette:= CreatePalette(lpPalette^);
  45.     HeapFree(hHeap, 0, lpPalette);
  46.     if (myPalette <> 0) then begin
  47.       SelectPalette(myDC, myPalette, False);
  48.       RealizePalette(myDC);
  49.     end;
  50.   end;
  51. end;
  52.  

das ist die render procedure:
Code:
  1. procedure render;
  2. begin
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
  4.   glLoadIdentity;                                      // World Matrix zurücksetzen
  5.  
  6.   SwapBuffers(form1.myDC);                             //scene ausgeben
  7. end;

ich rufe sie in einem Timer auf (interval sehr klein)
das ist die onCreate:
Code:
  1.  
  2. procedure TForm1.FormCreate(Sender: TObject);
  3. begin
  4.   form1.myDC:= GetDC(Handle);
  5.   SetupPixelFormat;
  6.   myRC:= wglCreateContext(myDC);
  7.   wglMakeCurrent(myDC, myRC);
  8.   glEnable(GL_DEPTH_TEST);
  9.  
  10.   glLoadIdentity;
  11.   glenable(gl_texture_2d); //Texturen aktivieren
  12.  
  13.   LoadTextures;            //Textur laden
  14. end;


mfg mandumoal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 17:58 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
für die Initialisierung schau dir einfach mal die Templates unter files->templates an...
da kannst du dann ganz genau vergleichen ;)

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 18:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
In der Datei dglOpenGL.pas sind bereits Funktionen für die Initialisierung enthalten. Dadurch wird die ganze Sache vereinfacht.

Code:
  1.  
  2. procedure TForm1.FormCreate(Sender:TObject);
  3. begin
  4. InitOpenGL;
  5. mydc := GetDC(Handle);
  6. myrc := CreateRenderingContext(mydc, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  7. ActivateRenderingContext(mydc , myrc);
  8. ...
  9. ...
  10. end;
  11.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 18:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wir sind nicht überfordert. Wir fahren nur gerne 260 Km quer durch Deutschland. Also zu mindest ich. ;-)

Dein Problem müsste sein, dass du zwar OpenGL Initialisiert hast aber vergessen hast due Extensions zu laden. In den RenderContextHelperFunctions (geiles Wort ;-) ) passiert das automatisch. Da du diese aber nicht benutzt musst du sie von Hand aufrufen.

Hänge das mal unter das wglMakeCurrent in deinem FormCreate.
Code:
  1.   ReadExtensions;
  2.   ReadImplementationProperties;

Dann sollte es gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 20:24 
Offline
DGL Member

Registriert: Do Mär 11, 2004 12:33
Beiträge: 24
achso :D (260km)

leider werden beide Zeilen als Undefinierte Bezeichner angesehen...
muss ich noch ne Unit einbinden?

mfg mandumoal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 11, 2004 20:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Welchen Header verwendest du denn? Ich hab das Gefühl das du in deinem Programm nen anderen OpenGL-Header (OpenGL.pas, OpenGL12.pas) verwendest, aber in der glBitmap ja unser dglOpenGL.pas-Header verwendet wird.
Wenn dem so ist, liegt hier dein Problem. Du musst projektübergreifend den gleichen Header verwenden, also am besten unsere dglOpenGl.pas die auf dem neusten Stand ist. Finden tust du die unter Files->Bibliotheken.

_________________
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  [ 46 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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