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

Aktuelle Zeit: Fr Jul 18, 2025 11:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 20, 2008 07:56 
Offline
DGL Member

Registriert: Mo Jun 12, 2006 14:47
Beiträge: 75
Programmiersprache: Object FPC
Schon wieder ich...

Also ich hab gestern noch Kräftig rumprobiert und gerechnet und am schluss lief dann das Multitextureing.

ich Glücklich wie ein schulkind am ersten Schultag, das ganze auf mein Notebook kopiert und wollte feierabend machen.

Aber so geschwind noch starten aufm Laptop das mus schon sein.

Und da kam dann leider wieder ein böses Erwachen

es gab eine Riesen Accesviolation in dieser Zeile hier

Code:
  1. glActiveTexture(GL_TEXTURE1);



Klar dachte ich mir meien SuperSavage im Laptop unterstützt halt kein Multitextureing

aber weit ggefehlt den lasse ich diesen Code hier im Programm ablaufen so kommt die Messaegbox nicht
Code:
  1.  
  2. glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, @TMUs);
  3. if TMUs < 2 then begin
  4.   ShowMessage('Sorry!Your card doesn''t support Multitexturing');
  5.   Close;
  6. end;


ich habs mir mim debugger angesehn in TMUs steht der wert 2. Trotzdem gehts nicht.

Hat da das Tutorrial ein Fehler, oder gibt es noch etwas zu beachten was so nicht erwähnt wurde ?

_________________
Try my 3D-Game (new Version 2) Balanced2 v2.02
or See my other Stuff at http://www.Corpsman.de


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

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi,
vllt hilft es wenn du glActiveTexture(GL_TEXTURE1_ARB); verwendest...

_________________
http://texelviews.delphigl.com


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

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das wird nichts ändern. Bei einer Konstante kann keine AV auftreten. Wenn aber glActiveTexture nur als Erweiterung unterstützt wird, solltest du die Erweiterungsfunktion nehmen:
Code:
  1. glActiveTextureARB(GL_TEXTURE1_ARB);


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 Mär 20, 2008 12:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Um da noch mal etwas mehr ins Detail zu gehen. Multitexturig war zu erst eine Extension. Diese ist aber seit OpenGL 1.3 fest im Kern integriert. Das bedeutet, dass du entweder auf eine OpenGL Version prüfen musst > 1.3 (oder GL_VERSION_1_3 = true) und wenn das nicht der Fall ist, dann muss die Extension GL_ARB_multitexturing existieren. Bzw gleichnamige Kostante gesetzt sein.

Je nachdem gibt es dann auch 2 Paar Konstanten und Methoden. Die Methoden / Konstanten mit ARB am Ende gehören zu der Extension. Die ohne sind die vom Kern. Die Konstanten sind eigentlich immer identisch. Spielt also keine Rolle. Aber bei den Methoden ist es wichtig das die genommen werden die unterstützt werden. Also entweder kern oder Erweiterung. Es passiert selten, dass eine Extension für den Kern verändert wird aber ist schon mal passiert. Logischer Weise ist die Extension eigentlich immer früher da als der Kern, denn wenn sie bereits im Kern ist muss keine Extension mehr erstellt werden.

Das trifft auf alle Extension zu die in den Kern gewandert sind.

Das Abfragen der maximalen TMUs sollte auch nur dann stattfinden, wenn die Extension existiert, denn ansonsten wird ein OpenGL Fehler ausgelöst. Also für die, die die Fehler überprüfen. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 20, 2008 16:59 
Offline
DGL Member

Registriert: Mo Jun 12, 2006 14:47
Beiträge: 75
Programmiersprache: Object FPC
*g*

super danke nu geht zumindest das nutzen der Extencion.

Du hast tatsächlich recht gehabt. habe alle Befehle auf ARB umgestellt und mein Laptop hats gefressen ;)

nur heist die Extencion "gl_arb_multitexture" auf die man Prüfen mus bei OpenGL ver >= 1.3 ;)

Nu habe ich aber leider schon wieder das nächste Problem.

Ich habe also nun meinen glTexSubImage2D code geschrieben und dieser Functioniert wunderbar. Auser mein zu Refreschendes Rechteck Berührt den Linken bzw Rechten Rand der Textur dann übergibt der nur Blödsinn, zur Veranschaulichung ein Screenshot und der entsprechende Source.

Erhlichgesagt verstehe ich nicht wieso dieser Fehler auftritt. Bei Oben Unten passiert es übrigens nicht.

Code:
  1.  
  2. Procedure Tlevel.Damage(x, y, radius: integer);
  3. Var
  4.   c: Array Of Byte;
  5.   w, h, i, j, k: integer;
  6.   r: Trect;
  7. Begin
  8.   // Rechteck Berechnen , mit Clipping am bildrechteck ;
  9.   r.left := max(0, x - radius);
  10.   r.right := min(fwidth, x + radius);
  11.   r.top := max(0, y - radius);
  12.   r.bottom := min(fheight, y + radius);
  13.   // Berechnen der neuen Breite und Höhe des SubImages
  14.   w := r.right - r.left;
  15.   h := r.Bottom - r.Top;
  16.   // Phytagoras erfordert Radius^2
  17.   radius := radius * radius;
  18.   // Erzeugen der Collisionsdaten
  19.     setlength(c, w * h);
  20.     // Ablaufen unseres Rechteckes
  21.     For j := r.top To r.bottom - 1 Do
  22.       For i := r.left To r.right - 1 Do Begin
  23.         k := (j - r.top) * w + (i - r.left);
  24.         If (k < 0) Or (k > high(c)) Then // Zum schauen ob ich nen Überlauf hab
  25.           Raise Exception.create('Fehler');// Diese Exception wird aber nicht geworfen, da ist der Fehler also nicht ...
  26.         // Prüfen ob der Punkt in Kreis Liegt
  27.         If (sqr(i - x) + sqr(j - y)) <= Radius Then Begin
  28.           c[k] := 255; // Setzen der Transparents für die Textur
  29.           FSurface[i, j] := True; // Merken das wir auf Transparent gesetzt haben.
  30.         End
  31.         Else Begin
  32.           // beim Nichtsetzen mus die Fsurface dominieren
  33.           If FSurface[i, j] Then
  34.             c[k] := 255
  35.           Else
  36.             c[k] := 0;
  37.         End;
  38.       End;
  39.     glEnable(GL_TEXTURE_2D);
  40.     glBindTexture(gl_texture_2d, FTransparentMask);
  41.     glTexSubImage2D(GL_TEXTURE_2D, 0, r.left, r.top, w, h, GL_ALPHA, GL_UNSIGNED_BYTE, @c[0]);
  42. End;
  43.  


Wenn man sich diese Pseudo muster die da entstehen ansieht könnte man meinen das da die Falsche Breite übergeben wird. Aber die Berechne ich an sich ja richtig ...


[Edit]

Also ich habe es gerade mal ohne Multitexturing ausprobiert also mittels 4 Fachen Datenoverhead und übergabe RGBA da ist der Fehler nicht ..

Der Code dazu ist identisch.

Code:
  1.     setlength(d, w * h);
  2.     // Ablaufen unseres Rechteckes
  3.     For j := r.top To r.bottom - 1 Do Begin
  4.       // Pointer auf Die Bilddaten
  5.       p := FTempbitmap.ScanLine[j];
  6.       // an die Richtige Position fahren
  7.       inc(p, r.left);
  8.       For i := r.left To r.right - 1 Do Begin
  9.         k := (j - r.top) * w + (i - r.left);
  10.         d[k, 0] := p^.r;
  11.         d[k, 1] := p^.g;
  12.         d[k, 2] := p^.b;
  13.         // Prüfen ob der Punkt in Kreis Liegt
  14.         If (sqr(i - x) + sqr(j - y)) <= Radius Then Begin
  15.           d[k, 3] := 255; // Setzen der Transparents für die Textur
  16.           FSurface[i, j] := True; // für die Collisions
  17.         End
  18.         Else Begin
  19.           // beim Nichtsetzen mus die Fsurface dominieren
  20.           If FSurface[i, j] Then
  21.             D[k, 3] := 255
  22.           Else
  23.             d[k, 3] := 0;
  24.         End;
  25.         inc(p);
  26.       End;
  27.     End;
  28.     glEnable(GL_TEXTURE_2D);
  29.     glBindTexture(gl_texture_2d, Fimage);
  30.     glTexSubImage2D(GL_TEXTURE_2D, 0, r.left, r.top, w, h, GL_RGBA, GL_UNSIGNED_BYTE, @d[0]);
  31.  


[Edit2]

Also nach weiterem Testen habe ich rausgefunden das es wol an glTexSubImage2D direkt liegen mus

denn schalte ich Multitexturing ein und übergebe an die Transparente Maske ein 4 Tupel also
Code:
  1.  
  2.     glTexSubImage2D(GL_TEXTURE_2D, 0, r.left, r.top, w, h, GL_RGBA, GL_UNSIGNED_BYTE, @d[0]);

Dann ist der Fehler ebenfalls nicht mehr da.

Das blöde ist nur das das je eigentlich nicht passiern sollte ....


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

_________________
Try my 3D-Game (new Version 2) Balanced2 v2.02
or See my other Stuff at http://www.Corpsman.de


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

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du musst die größe deines Rechtecks dem Rand der Textur anpassen. Aktuell sieht das bei dir so aus, dass in bestimmten Sonderfällen dein zu aktualisierendes Rechteck über den Rand der Textur hinausragt. OpenGL scheint das anzupassen und dementsprechend die übergebene Rechteckbreite bzw Höhe zu verringern. Dadurch kommt es zu dieser mehr oder minder hässlichen Verschiebung beim Aktualisieren des Rechtecks.

Um das zu korrigieren musst du vor deiner Schleife prüfen, ob r.left + w > texturbreite ist und w dann entsprechend verringern, das gleiche dann für die Höhe. Das sollte dein Problem dann lösen, eventuell musst du deine Schleife noch anpassen.

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 Mär 20, 2008 22:45 
Offline
DGL Member

Registriert: Mo Jun 12, 2006 14:47
Beiträge: 75
Programmiersprache: Object FPC
Dieses Fehlers war ich mir im Klaren,

da gabs nämlich gleich ne Böse AV wenn ich den nicht korrigiert hätte
siehst, so hab ich das oben gelöst gehabt.

Code:
  1.  
  2. // Rechteck Berechnen , mit Clipping am bildrechteck ;
  3. r.left := max(0, x - radius);
  4. r.right := min(fwidth, x + radius);
  5. r.top := max(0, y - radius);
  6. r.bottom := min(fheight, y + radius);
  7.  

_________________
Try my 3D-Game (new Version 2) Balanced2 v2.02
or See my other Stuff at http://www.Corpsman.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 21, 2008 12:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Oh, das habe ich übersehen. Versuchs mal mit fheight - 1 und fwidth - 1. Wenn die Koordinaten nähmlich bei 0 beginnen, ist die höchste Koordinate fheight - 1|fwidth - 1, sonst hättest du ja fheight+1|fwidth+1 Pixel...

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: Fr Mär 21, 2008 12:36 
Offline
DGL Member

Registriert: Mo Jun 12, 2006 14:47
Beiträge: 75
Programmiersprache: Object FPC
hab ich auch schon Probiert, dann setzt er den Rechten Rand der Textur nicht.

d.h. das ist nicht Korreckt.

_________________
Try my 3D-Game (new Version 2) Balanced2 v2.02
or See my other Stuff at http://www.Corpsman.de


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


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.014s | 15 Queries | GZIP : On ]