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:
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 network • my 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
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.
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:
Procedure Tlevel.Damage(x, y, radius:integer);
Var
c:ArrayOfByte;
w, h, i, j, k:integer;
r: Trect;
Begin
// Rechteck Berechnen , mit Clipping am bildrechteck ;
r.left:=max(0, x - radius);
r.right:=min(fwidth, x + radius);
r.top:=max(0, y - radius);
r.bottom:=min(fheight, y + radius);
// Berechnen der neuen Breite und Höhe des SubImages
w := r.right- r.left;
h := r.Bottom- r.Top;
// Phytagoras erfordert Radius^2
radius := radius * radius;
// Erzeugen der Collisionsdaten
setlength(c, w * h);
// Ablaufen unseres Rechteckes
For j := r.topTo r.bottom-1Do
For i := r.leftTo r.right-1DoBegin
k :=(j - r.top)* w +(i - r.left);
If(k < 0)Or(k > high(c))Then// Zum schauen ob ich nen Überlauf hab
Raise Exception.create('Fehler');// Diese Exception wird aber nicht geworfen, da ist der Fehler also nicht ...
// Prüfen ob der Punkt in Kreis Liegt
If(sqr(i - x)+sqr(j - y)) <= Radius ThenBegin
c[k]:=255;// Setzen der Transparents für die Textur
FSurface[i, j]:=True;// Merken das wir auf Transparent gesetzt haben.
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:
setlength(d, w * h);
// Ablaufen unseres Rechteckes
For j := r.topTo r.bottom-1DoBegin
// Pointer auf Die Bilddaten
p := FTempbitmap.ScanLine[j];
// an die Richtige Position fahren
inc(p, r.left);
For i := r.leftTo r.right-1DoBegin
k :=(j - r.top)* w +(i - r.left);
d[k,0]:= p^.r;
d[k,1]:= p^.g;
d[k,2]:= p^.b;
// Prüfen ob der Punkt in Kreis Liegt
If(sqr(i - x)+sqr(j - y)) <= Radius ThenBegin
d[k,3]:=255;// Setzen der Transparents für die Textur
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 network • my 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
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 network • my 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
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.