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

Aktuelle Zeit: Fr Mär 29, 2024 13:36

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TexturID übeprüfen
BeitragVerfasst: Fr Dez 12, 2014 20:38 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ist dies richtig, wen FID = 0 ist, das keine Textur geladen ist ?
Es geht vor allem um glDeleteTextures.
Code:
  1. constructor TTexturBuffer.Create;
  2. begin
  3.   FID := 0;
  4.   Width := 0;
  5.   Height := 0;
  6.   geladen := False;
  7. end;
  8.  
  9. procedure TTexturBuffer.LoadTextures(w, h: integer; const Dat: array of GLenum);
  10. var
  11.   l: integer;
  12. begin
  13.   if FID <> 0 then begin
  14.     glDeleteTextures(1, @FID);
  15.   end;
  16.   l := Length(Dat);
  17.   Width := w;
  18.   Height := h;
  19.   if l <> 0 then begin
  20.     SetLength(Data, l);
  21.     Move(Dat[0], Data[0], l * 4);
  22.   end;
  23.   format := GL_RGBA;
  24. end;
  25.  
  26. function TTexturBuffer.GetID: GLuint;
  27. begin
  28.   if FID = 0 then begin
  29.     glGenTextures(1, @FID);
  30.     glBindTexture(GL_TEXTURE_2D, FID);
  31.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, format, GL_UNSIGNED_BYTE, Pointer(Data));
  32.  
  33.     glGenerateMipmap(GL_TEXTURE_2D);
  34.   end;
  35.  
  36.   Result := FID;
  37. end;
  38.  
  39. destructor TTexturBuffer.Destroy;
  40. begin
  41.   if FID <> 0 then begin
  42.     glDeleteTextures(1, @FID);
  43.   end;
  44.   inherited Destroy;
  45. end;

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Fr Dez 12, 2014 21:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das ist ziemlich ineffizient. Ich würde glGenTextures nur einmal aufrufen, und glDeleteTextures auch nur einmal (im Destruktor). Statt dessen glTexImage2D bzw am besten sogar glTexSubImage2D verwenden, um die Daten an die Grafikkarte schicken.

Ansonsten sieht der Code korrekt aus (FID = 0 => keine Textur geladen).

viele Grüße,
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: Re: TexturID übeprüfen
BeitragVerfasst: So Dez 14, 2014 23:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Statt dessen glTexImage2D bzw am besten sogar glTexSubImage2D verwenden

Was bringt mir glTexSubImage2D für einen Vorteil ?

Zitat:
Ich würde glGenTextures nur einmal aufrufen, und glDeleteTextures auch nur einmal (im Destruktor).

Code:
  1. constructor TTexturBuffer.Create;
  2. begin
  3.   inherited Create;
  4.   FID := 0;
  5.   Width := 0;
  6.   Height := 0;
  7.   Tex_in_VRAM := False;
  8.   glGenTextures(1, @FID);
  9. end;
  10.  
  11. destructor TTexturBuffer.Destroy;
  12. begin
  13.   glDeleteTextures(1, @FID);
  14.   inherited Destroy;
  15. end;
  16.  
  17. procedure TTexturBuffer.LoadTextures(w, h: integer; const Dat: array of GLenum);
  18. var
  19.   l: integer;
  20. begin
  21.   l := Length(Dat);
  22.   Width := w;
  23.   Height := h;
  24.   if l <> 0 then begin
  25.     SetLength(Data, l);
  26.     Move(Dat[0], Data[0], l * 4);
  27.   end;
  28.   format := GL_RGBA;
  29.   Tex_in_VRAM := False;
  30. end;
  31.  
  32. function TTexturBuffer.GetID: GLuint;
  33. begin
  34.   if not Tex_in_VRAM then begin
  35.     Tex_in_VRAM := True;
  36.     glBindTexture(GL_TEXTURE_2D, FID);
  37.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, format, GL_UNSIGNED_BYTE, Pointer(Data));
  38.  
  39.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
  40.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
  41.  
  42.     glGenerateMipmap(GL_TEXTURE_2D);
  43.   end;
  44.  
  45.   Result := FID;
  46. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mo Dez 15, 2014 10:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich würde mich auf den Artikel berufen und sagen, 0 ist ein invalid object.
Üblicherweise wird bei 1 angefangen zu zählen.

Du kannst dir beim glDeleteTextures die prüfung auf 0 sparen, da diese schon im Befehl gemacht wird und die ausführung überspringt, wenn es 0 ist.
Du solltest auch noch eine Tabelle führen, welche Pixelformate du verwendest, wenn du bestimmte Texturformate bekommst, denn GL_RGBA ist nicht immer gut.
Bei einigen Kombinationen fängt der Treiber an zu swizzeln und das will man eigentlich vermeiden.
Das generieren von Mipmaps ist unnötig, wenn man z.B. DDS mit liefert und die Qualität ist doch noch ein bisschen besser.
Es ist am besten OpenGL Objekte wieder zu verwenden, da sonnst der VRAM fragmentiert und entsprechend über zeit die Leistung sinkt.
Die GPU Memory Allocator, sind sehr anfällig dagegen, im vergleich zu CPU Memory Allocator, da diese nicht auf solche nutzung ausgelegt sind.
Im Zero Driver Overhead Präsi auf der GDC hatte Nvidia, Intel und AMD zusammen dies als großes Problem bei Spielen und Software angeprangert und empfiehlt vorallem Shader und Textur Objekte wieder zu verwenden, statt sie zu zerstören und neue zu erzeugen.
Shader Objekte können nach dem linken an den Programm Objekt wieder für andere Shader verwendet werden.
Du solltest also die generierung und zerstörung auf eine Factory auslagern und nur das setzen von Daten und States in dem TexturBuffer Objekt machen.

glTexSubImage2D <- Kann bei Nvidia und schätze auch Intel und AMD auf anderen Threads ausgeführt werden, als den wo der Rendercontext registriert ist und es ist erzeugt kein Sync point(Befehle die gegen die GPU syncen müssen, wie z.B. glGenTextures und dauern >1us).

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mo Dez 15, 2014 23:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Du solltest auch noch eine Tabelle führen, welche Pixelformate du verwendest, wenn du bestimmte Texturformate bekommst, denn GL_RGBA ist nicht immer gut.
Dies habe ich im Klassenkopf gespeichert.
Code:
  1.   TTexturBuffer = class(TObject)
  2.   private
  3.     Tex_in_VRAM: boolean;
  4.     FID: GLuint;
  5.     Width, Height: GLuint;
  6.     format: GLenum;  // format
  7.     Data: packed array of packed record
  8.       case byte of
  9.         0: (r, g, b, a: byte);
  10.         1: (i: GLenum);
  11.         2: (ar: packed array[0..3] of byte);
  12.     end;
  13.     function GetID: GLuint;
  14.     ......

Zitat:
Das generieren von Mipmaps ist unnötig, wenn man z.B. DDS mit liefert und die Qualität ist doch noch ein bisschen besser.

Wen ich glGenerateMipmap(GL_TEXTURE_2D); weglasse, dann bleibt die Textur schwarz.

Zitat:
Es ist am besten OpenGL Objekte wieder zu verwenden, da sonnst der VRAM fragmentiert und entsprechend über zeit die Leistung sinkt.

Bei meinen jetzigen Programmen, werden die Texturen beim Programmstart einmal geladen und am Ende freigegeben.
Bei einem Games mit verschiedenen Levels sieht dies natürlich anders aus.

Zitat:
empfiehlt vorallem Shader und Textur Objekte wieder zu verwenden, statt sie zu zerstören und neue zu erzeugen.

Willst du damit sagen, man sollte zur Laufzeit des Programmes möglichst keine Shader neu laden und freigeben.
Wen man viele Texturen hat, wie soll man verhindern, das zur Laufzeit Texturen geladen und freigegeben werden ?

Zitat:
Shader Objekte können nach dem linken an den Programm Objekt wieder für andere Shader verwendet werden.

Heisst das, man sollte möglichst auf glDeleteShader(ShaderObject); verzichten ?

Zitat:
glTexSubImage2D <- Kann bei Nvidia und schätze auch Intel und AMD auf anderen Threads ausgeführt werden,

Ich werde mir glTexSubImage2D mal genauer angucken.

PS: Wen man die obigen Optimierungen einhalten will, wird der Quellcode recht kompliziert und unübersichtlich.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mo Dez 15, 2014 23:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

wir haben doch nen tollen Textur-Loader (glBitmap). Warum nimmst du den nich?
Ich seh immer wieder das die Leute was eigenes baun anstatt die fertige Lösung der Community zu nehmen :(
Da fragt man sich natürlich warum? Zu groß? Zu komplex? Zu wenig Doku? Oder sollte es sein das die gar nicht bekannt ist (was ich mir nicht vorstellen kann so oft wie die hier verlinkt ist)?

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Di Dez 16, 2014 00:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Zitat:
Wen ich glGenerateMipmap(GL_TEXTURE_2D); weglasse, dann bleibt die Textur schwarz.

Wenn du keine MipMaps zur verfügung hast, dann generierst du diese natürlich mit dem Befehl aber solltest du welche mit liefern(bei DDS üblich), dann musst du das maximale Mipmap Level fest legen und die einzelnen Texturen auf die entsprechenden MipMap Level hoch laden.
Sonnst bleiben diese Schwarz(default).

Zitat:
Willst du damit sagen, man sollte zur Laufzeit des Programmes möglichst keine Shader neu laden und freigeben.
Wen man viele Texturen hat, wie soll man verhindern, das zur Laufzeit Texturen geladen und freigegeben werden ?

Man muss zwischen Shader Objekten und Programm Objekten unterscheiden, Program Objects sind die fertig gelinkten shader und diese sollte man nicht wieder abräumen und behalten und Shader Objekte sollte man einfach wieder verwenden, da kommt einfach der neue Shader Code rein und dann linkt man diese wieder gegen neue Program Objekte.
Nach dem Linken sind die Shader Objekte wieder für andere Shader Texte verwendbar.
Man gibt schon Texturen frei und lädt auch neue aber man sollte es möglichst gering halten, z.B. ein Textur Objekt Pool und Textur Arrays helfen ungemein.
Dabei zerstört man die Textur nicht sondern legt sie im Pool ab und sollte ein Request kommen, der die gleiche Auflösung und Pixel Format kann man einfach die Bilddaten rein laden.
Die anzahl an verschiedenen Texturauflösungen und Formaten kann man an einer Hand abzählen.
Nvidia sagt man sollte TexturArray benutzen, weil man so die bindings noch reduzieren kann und diese sind auch nicht günstig.

Zitat:
Heisst das, man sollte möglichst auf glDeleteShader(ShaderObject); verzichten ?

Ja! Am besten gucken welches Shader Model man fährt und entsprechend Objekte im Pool erzeugen.
Also z.b. Vertex, Fragment und Compute Shader Objekt und diese immer wieder verwenden.
Die Shader Programme werden in der Regel eh immer wieder verwendet und da glänzt z.B. Physical Based Rendering, es brauht nur 2 Programme(Transparent und Opaque). Die States werden per Texturen geliefert und die Texturen liegen in Textur Array Objekten.
Du brauchst natürlich kein PBR nun implementieren oder umbeding auf Textur Array Object setzen aber mit seinen vorhanden Resourcen gut um zu gehen ist eigentlich kaum mehraufwand und erspart ein Ruckler beim laden.
Das erzeugen und vorallem das löschen kosten viel Sync Zeit auf der GPU und blockt den Render Thread, sowie die Treiber Threads.

Zitat:
PS: Wen man die obigen Optimierungen einhalten will, wird der Quellcode recht kompliziert und unübersichtlich.

Da ist das Problem von Optimierungen, sie kosten immer Aufwand und man sollte immer abwegen wieviel Zeit ist man bereit rein zu stecken und kann ich dinge wiederverwendbar bauen.
Diese Vorschläge sind wie gesagt Vorschläge um deine Anwendung zu verbessern und nicht um sie zum laufen zu bekommen.

Nvidia hat in ihrer letzten Präsi Zero Driver Overhead 2.0 Command List auch mal Zahlen genannt.
Große Spiele haben in der Regel 2500 Draw calls und 11k-12k Function Calls.
Man hat also auf jeden Draw call ca 5 state changes Funktionen und viele von den kosten soviel wie der Draw call.
Jedes BindTexture, BindShader oder gluniform ist ein State change.
Daher ist es auch besser State changes zu reduzieren und das macht man üblicherweise durch sortieren der Objekte und Draw calls nach deren Shader und Texturen.
Diese sortierung ist um einiges einfacher und bringt so unglaublich viel für den Aufwand.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mi Dez 17, 2014 16:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Da fragt man sich natürlich warum? Zu groß? Zu komplex? Zu wenig Doku?

Alles ein bisschen.
Ich wollte die glBitmap ausprobieren, aber ich stehe schon an dieer Zeile an:
Code:
  1. {$MESSAGE error 'Hey. I''m the glBitmap.pas and i need to be configured. My master tell me your preferences! ;)'}


Wie muss man das Teil konfugurieren ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mi Dez 17, 2014 17:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Mhh, ich hab mal in den Header geguckt und mir fallen da noch ein paar mehr Gründe ein diese nicht zu verwenden.

Viele Schalter, sehr viele Schalter und dann auch alle für unterschiedliche Aufgaben, wie z.B. OpenGL, lesen von Datein, schreiben von Formaten oder schlicht für Kompatibilität. Viele sind gut dokumentiert aber bei der großen Anzahl vieleicht doch der falsche Weg.

Monolitischer Code ist vieleicht für den Compiler toll aber hier macht ja eine Unit einfach mal alles und das betrifft auch den vorigen Punkt, mehr Units und weniger Aufgaben pro Unit macht das einfacher zu verstehen und richtig zu nutzen.
Wenn ich da nur eine Sache vermisse oder nicht Funktioniert, würde ich eine einfachere Lib suchen oder selber machen, weil ich angst hätte dort zig neue Stellen auf zu reißen und kaputt zu machen.

OpenGL funktionen zu laden halt ich auch für overdosed, dazu hat man doch OpenGL wrangler libs bzw. OpenGL Header z.B. DGL Header.

Eine menge von Funktionalität geht einfach in der Masse unter und auch wie ich die Unit überhaupt verwenden soll.

Es läuft eigentlich immer wieder auf zerlegen in viele Units die die einzelnen Layer enthalten und modularisieren.

Gut find ich den Support von verschiedenen Formate, das ist für Anfänger Hilfreich und das ich später alle abschalten kann und nur mit DDS laufen kann.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mi Dez 17, 2014 18:51 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Ich hab mir meinen eigenen glBitmap Fork geschrieben, in dem ich 50% der Unit aussortiert habe. Das habe ich aber auch nur als temporäre Lösung, bis ich die Zeit finde mir meine eigene Unit hierfür zu schreiben.

(Meine Unit verwendet nur SDL_image und den glBitmap-eigenen DDS Loader, weiterhin wurde auch der OpenGL Wrapper rausgeschmissen.)

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mi Dez 17, 2014 19:29 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
So wie es aussieht, werde ich momentan auch meine eigene Routine verwenden, welche die Daten aus TBitmap holt. Lazarus kann fast alle gängigen Format in TBitmap umwandeln. Alphablending wird dabei auch unterstützt.
Es wird sicher Sachen haben, welche ich TBitmap abgucke.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mi Dez 17, 2014 19:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
mathias hat geschrieben:
So wie es aussieht, werde ich momentan auch meine eigene Routine verwenden, welche die Daten aus TBitmap holt. Lazarus kann fast alle gängigen Format in TBitmap umwandeln. Alphablending wird dabei auch unterstützt.
Es wird sicher Sachen haben, welche ich TBitmap abgucke.

Was ich so gesehen habe würde ich dir lieber empfehlen es wie end zu machen und lieber dinge raus zu sortieren die du nicht brauchst, weil dort ist ne menge nützlicher kram drin die man so nicht im Kopf hat aber am Anfang in der Regel braucht.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mi Dez 17, 2014 22:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

@mathias: wie du das konfigurieren kannst steht doch (als Kommentar) über der Meldung? Unter der Meldung sind einige Compiler-Schalter, die die Funktionen die du möchtest aktivieren. Imi Wiki gibts auch einen Artikel zur Nutzung.

@TAK: Bei den Schaltern muss ich dir Rechte geben, am Anfang da duch zu blicken ist nicht einfach. Dafür unterstützt die glBitmap aber auch haufen Systeme und Funktionen. Was de Units betrifft sehe ich es eigentlich mehr als Vorteil, das alles aus einer Unit kommt und ich nich erst 100 Datein mitschleppen muss. Ich wüsste jetzt auch gar nicht wie ich das ordentlich aufteilen sollte. Die FormateDescriptoren könnte man vlt noch auslagern, aber mehr macht meiner Meinung nach wenig Sinn. Was die OpenGL Funktionen betrifft geb ich dir Recht, die sind eigentlich nur noch drin, weil sie mal drin waren. Für sinnvoll halte ich das auch nicht.

Unterm Strich würde ich sagen die Unit ist einfach zu komplex für Einsteiger, oder zumindest zu komplex wirkt.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TexturID übeprüfen
BeitragVerfasst: Mi Dez 17, 2014 22:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Zum Thema eine Datei Bildformate kann ich mal auf stb verlinken.
Dort kann man z.B. in die Unit Test gucken um die verwendung zu erkennen bzw. den boiler plate am Anfang lesen.

Ich hab alle Demos auch aus meinen Framework geworfen und man kann in den Unit, Smoke und Performance Tests gucken, wie man dinge verwendet werden.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 40 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.080s | 17 Queries | GZIP : On ]