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

Aktuelle Zeit: Sa Jun 08, 2024 13:02

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Mär 08, 2012 22:46 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Bei dem folgenden Code erhalte ich diese Ausgabe, rechts sieht man die kleine Textur die in die linke große reinkopiert werden soll.
Allerdings ist das kopieren schief und wie sehr ich auch versuche, dies zu korrigieren gelingt es mir nicht.
Das kopierte ist das blaue T links unten in der großen Textur.

Bild

Code:
Code:
  1.  
  2.     void Copy(const Texture tex, Rect rect = null) const {
  3.         if (rect is null) {
  4.             rect = new Rect(0, 0, tex.width, tex.height);
  5.         }
  6.  
  7.         int[4] vport;
  8.         glGetIntegerv(GL_VIEWPORT, vport.ptr);
  9.  
  10.         glPushAttrib(GL_VIEWPORT_BIT);
  11.  
  12.         glViewport(0, 0, rect.width, rect.height);
  13.  
  14.         if (!glIsEnabled(GL_TEXTURE_2D)) {
  15.             glCheck(glEnable(GL_TEXTURE_2D));
  16.         }
  17.  
  18.         tex.Bind();
  19.  
  20.         glBegin(GL_QUADS);
  21.             glTexCoord2f(1, 1); glVertex2f(rect.x, rect.y);
  22.             glTexCoord2f(0, 1); glVertex2f(rect.x, rect.y + vport[3]);
  23.             glTexCoord2f(0, 0); glVertex2f(rect.x + vport[2], rect.y + vport[3]);
  24.             glTexCoord2f(1, 0); glVertex2f(rect.x + vport[2], rect.y);
  25.         glEnd();
  26.  
  27.         this.Bind();
  28.  
  29.         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, rect.x, rect.y, 0, 0, rect.width, rect.height);
  30.  
  31.         glPopAttrib();
  32.     }
  33.  


Hat jemand vllt. einen Tipp wo ich was ändern muss?
Danke im voraus.

P.S.: Ist der Code eig. so performant oder gibt es was zu optimieren? :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mär 09, 2012 00:54 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Also ich verstehen das Problem noch nicht so ganz - bzw. vorallem das Foto nicht.

Nur zum Punkt optimieren sag ich mal was:
- glBegin, glVertex, glEnd etc. sind langsam. Bei einem 4-Eck jetzt natürlich nicht so super entscheident aber in Zukunft lieber auf Vertex Arrays setzen
- glPushAttribut sowie Pop ist auch nicht gerade schnell
- Auch glCopyTexSubImage2D ist langsam, Performance sollte mit einem FBO wesentlich höher sein


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mär 09, 2012 08:32 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Was verstehst du nicht?
Ich hab die große Textur links und möchte einen Ausschnitt (in diesem Fall aber alles) der zweiten kleineren Textur rechts hinein blitten.
Dies klappt auch, leider ist aber das kopierte (links unten das blau in der großen Textur) rotiert/gespiegelt und mus korrekt ausgerichtet werden und zwar so, wie es die kleine Textur links schon zeigt. So sollte es auch in die große Textur kopiert werden.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mär 09, 2012 10:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Versuch mal andere Texturkoordinaten. Mir scheint, du müsstest mal 1, 1 und 0, 0 vertauschen. Aber ganz sicher bin ich mir nicht, zumal ich noch nicht ganz verstanden habe, was das Bild zeigen soll (wo ist da ein T?)

greetings

_________________
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  
BeitragVerfasst: Fr Mär 09, 2012 12:33 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Zugegeben, das blaue sieht nicht wirklich aus wie ein T, soll es aber sein.
Dort links unten in der großen Textur sieht man die kleine Textur reinkopiert. Sie liegt aber falsch und müsste nach links gedreht werden.
Das mit dem tauschen der Textur Koordinaten habe ich schon soweit probiert.
Ich werde das ganze nachher mal mit einer anderen Grafik probieren, ich hoffe dann könnt ihr mir besser helfen. :)
Danke soweit schonmal.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Mär 10, 2012 18:27 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Soo ich habe kein besseres gefunden, aber euch den Ausschnitt der in die große Textur geblittet wurde mal dunkelrot markiert. Passend dazu auch das "original" was ich ebenso rot markiert habe.
Bild
Vllt ist es ja jetzt etwas eindeutiger. :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Mär 10, 2012 23:05 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Für mich sieht es so aus, als ob das oben rechts im Ergebnisbild die eingefügte Textur wäre.
Dann würde alles stimmen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Mär 10, 2012 23:10 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Nein, das mag verwirren, aber dort habe ich die Pixel Farbe verändert.
Hier nochmal ohne die "updatePixels" Methode (sorry für die Verwirrung):
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 11, 2012 18:52 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Wie wärs denn mal, wenn du irgendetwas "normales" darstellen lässt und uns ein Foto zeigst anstatt irgendwelche wilden Linien :?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 11, 2012 21:19 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ok, hab das mal mit eurem Logo gemacht, aber ich erhalte auf einmal diese Ausgabe:
Bild
Das Bild liegt also auf der Seite.
Der Render Code sieht so aus:
Code:
  1.  
  2.     void Render(const Rect dst) const {
  3.         assert(dst !is null);
  4.  
  5.         if (!glIsEnabled(GL_TEXTURE_2D)) {
  6.             glCheck(glEnable(GL_TEXTURE_2D));
  7.         }
  8.  
  9.         float tx = 0.0;
  10.         float ty = 0.0;
  11.         float tw = 1.0;
  12.         float th = 1.0;
  13.        
  14.         if (this.HasViewport()) {
  15.             tx = this._viewport.x / cast(float) this._width;
  16.             ty = this._viewport.y / cast(float) this._height;
  17.  
  18.             tw = tx + (cast(float) this._viewport.width / this._width);
  19.             th = ty + (cast(float) this._viewport.height / this._height);
  20.         }
  21.  
  22.         this.Bind();
  23.  
  24.         glBegin(GL_QUADS);
  25.             glVertex2i(dst.x, dst.y);
  26.             glTexCoord2f(tx, ty);
  27.  
  28.             glVertex2i(dst.x, dst.y + dst.height);
  29.             glTexCoord2f(tx, ty + th);
  30.  
  31.             glVertex2i(dst.x + dst.width, dst.y + dst.height);
  32.             glTexCoord2f(tx + tw, ty + th);
  33.  
  34.             glVertex2i(dst.x + dst.width, dst.y);
  35.             glTexCoord2f(tx + tw, ty);
  36.         glEnd();
  37.     }
  38.  

Kann mir erstmal jemand sagen, wieso das auf der Seite liegt?
Dann würde ich nochmal das kopieren probieren.
Danke schon einmal. :) Und sorry für das miese Bild vorhin, wenn man es selbst vor Augen hat ist es wohl leichter zu sehen was da falsch läuft. ^^


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 11, 2012 21:36 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Ich habe so das Gefühl, dass du die Texture falsch auf das Quad mappst!
Also der Part hier:
Code:
  1.         glBegin(GL_QUADS);
  2.             glVertex2i(dst.x, dst.y);
  3.             glTexCoord2f(tx, ty);
  4.  
  5.             glVertex2i(dst.x, dst.y + dst.height);
  6.             glTexCoord2f(tx, ty + th);
  7.  
  8.             glVertex2i(dst.x + dst.width, dst.y + dst.height);
  9.             glTexCoord2f(tx + tw, ty + th);
  10.  
  11.             glVertex2i(dst.x + dst.width, dst.y);
  12.             glTexCoord2f(tx + tw, ty);
  13.         glEnd();


Probier mal folgendes:
Code:
  1.     glBegin(GL_QUADS);
  2.         glTexCoord2f(tx, tx);
  3.         glVertex2f(dst.x, dst.y);
  4.         glTexCoord2f(tx + tw, ty);
  5.         glVertex2f(dst.x + dst.width, dst.y);
  6.         glTexCoord2f(tx + tw, ty + th);
  7.         glVertex2f(dst.x + dst.width, dst.y + dst.height);
  8.         glTexCoord2f(tx, ty + th);
  9.         glVertex2f(dst.x, dst.y + dst.height);
  10.     glEnd();


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 11, 2012 21:41 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
...
Ich hatte
glCheck(glEnable(GL_CULL_FACE));
glCheck(glCullFace(GL_BACK));

Deswegen hatte das auch nie funktioniert.
Danke schön für das darauf hinweisen. Ich bin wirklich neu in GL.^^


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 11, 2012 21:51 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Gut dann nochmal zum kopieren, nun bekomme ich mit diesem Code
Code:
  1.    
  2. void Copy(const Texture tex, Rect rect = null) const {
  3.         const GLuint previous_texture = this.CurrentlyBound();
  4.  
  5.         if (rect is null) {
  6.             rect = new Rect(0, 0, tex.width, tex.height);
  7.         }
  8.  
  9.         int[4] vport;
  10.         glGetIntegerv(GL_VIEWPORT, vport.ptr);
  11.  
  12.         glPushAttrib(GL_VIEWPORT_BIT);
  13.  
  14.         //glCheck(glCullFace(GL_BACK));
  15.  
  16.         glViewport(0, 0, rect.width, rect.height);
  17.  
  18.         if (!glIsEnabled(GL_TEXTURE_2D)) {
  19.             glCheck(glEnable(GL_TEXTURE_2D));
  20.         }
  21.  
  22.         tex.Bind();
  23.  
  24.         glBegin(GL_QUADS);
  25.             glTexCoord2f(0, 0); glVertex2f(rect.x, rect.y);
  26.             glTexCoord2f(0, 1); glVertex2f(rect.x, rect.y + vport[3]);
  27.             glTexCoord2f(1, 1); glVertex2f(rect.x + vport[2], rect.y + vport[3]);
  28.             glTexCoord2f(1, 0); glVertex2f(rect.x + vport[2], rect.y);
  29.         glEnd();
  30.  
  31.         this.Bind();
  32.  
  33.         glCheck(glCopyTexSubImage2D(GL_TEXTURE_2D, 0, rect.x, rect.y, 0, 0, rect.width, rect.height));
  34.  
  35.         glPopAttrib();
  36.  
  37.         //glCheck(glCullFace(GL_FRONT));
  38.  
  39.         this._ReBind(previous_texture);
  40.     }
  41.  


diese Ausgabe, also nur schwärze:
Bild

Also habe ich eben mal probiert das Culling vorher auf BACK und danach wieder auf FRONT umzustellen, dann bekomme ich das hier:
Bild

Die Frage ist: soll das so sein bzw. muss ich das machen?

edit:
Habe das nun mit dme Viewport geregelt, sprich so:
Code:
  1.    
  2. void Copy(const Texture tex, Rect rect = null) const {
  3.         const GLuint previous_texture = this.CurrentlyBound();
  4.  
  5.         if (rect is null) {
  6.             rect = new Rect(0, 0, tex.width, tex.height);
  7.         }
  8.  
  9.         int[4] vport;
  10.         glGetIntegerv(GL_VIEWPORT, vport.ptr);
  11.  
  12.         glPushAttrib(GL_VIEWPORT_BIT);
  13.  
  14.         glViewport(0, 0, rect.width, rect.height);
  15.  
  16.         tex.Render(Rect(0, 0, vport[2], vport[3]));
  17.  
  18.         this.Bind();
  19.  
  20.         glCheck(glCopyTexSubImage2D(GL_TEXTURE_2D, 0, rect.x, rect.y, 0, 0, rect.width, rect.height));
  21.  
  22.         glPopAttrib();
  23.  
  24.         this._ReBind(previous_texture);
  25.     }


Bekomme aber die selbe Ausgabe:

Bild

Wie kann ich es "zurück" drehen?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 11, 2012 23:49 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Hab es. Habe einfach verkehrt herum in die Textur gerendert. Sorry für den Aufwand und danke an alle die geholfen haben. :)


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 » Einsteiger-Fragen


Wer ist online?

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