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

Aktuelle Zeit: Di Mai 14, 2024 14:01

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Dez 13, 2011 19:37 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Hallo erstmal.
Ich versuche mich schon eine ganze Weile daran, einen Teil eines Bildes von einer Textur in eine andere zu "warpen".
In SDL ist es sehr einfach: man erstellt eine neue, kleinere SDL_Surface und mittels SDL_BlitSurface kopiert man den entsprechenden Ausschnitt der Quellsurface in die neue, kleinere Surface.
In OpenGL müsste so etwas ja auch gehen, aber irgendwie klappt das kopieren mittels glCopyTexSubImage2D nicht...
Mein Verfahren bisher: Ich lade ein Bild per SLD_Surface und übergebe die Pixelsturktur an eine Textur. Klappt wunderbar, lässt sich auch zeichnen.
Nun will ich davon einen kleineren Ausschnitt:
Ich generiere mir wieder eine entsprechende Textur Id, binde sie und lege sie mittels glTexImage2D an, nur das ich an stelle von Pixel Daten null/nil übergebe, also nur Speicher reserviere.
Nun binde ich meine Quelltextur, die das Bild enthält bzw. deren Pixel, und rufe glCopyTexSubImage2D auf, weil nach meinem Wissen durch das binden des Bildes dessen Pixel nun im Framebuffer liegen, aus dem glCopyTexSubImage2D kopiert. Ist dies nicht so? Denn mein Verfahren klappt nicht.
Kann mir jmd. meinen Fehler verraten oder mir sagen wie es richtig geht?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Dez 13, 2011 20:27 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Versuchs mal so:

-Zeichne die Quelltextur auf ein Quad
-Binde die Zieltextur
-glCopyTexSubImage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Dez 14, 2011 00:02 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich hab es jetzt so, sollte so sein, wie du beschrieben hast:

Code:
  1.  
  2.     Texture my_sub_image(const Rect rect) {
  3.         GLuint subId;
  4.         glGenTextures(1, &subId);
  5.  
  6.         // Binden den Zieltextur
  7.         glBindTexture(GL_TEXTURE_2D, subId);
  8.  
  9.         // Parameter der Zieltextur
  10.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  11.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
  12.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  13.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  14.  
  15.         glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
  16.  
  17.         glTexImage2D(GL_TEXTURE_2D, 0, this._format, rect.width, rect.height, 0,
  18.             this._format, GL_UNSIGNED_BYTE, null);
  19.  
  20.         // Quelltextur binden
  21.         this.bind();
  22.  
  23.         // Quelltextur zeichnen
  24.         glBegin(GL_QUADS);
  25.             // top left
  26.             glTexCoord2i(0, 0);
  27.             glVertex2f(0, 0);
  28.             // bottom left
  29.             glTexCoord2i(0, 1);
  30.             glVertex2f(0, rect.height);
  31.             // bottom right
  32.             glTexCoord2i(1, 1);
  33.             glVertex2f(rect.width, rect.height);
  34.             // top right
  35.             glTexCoord2i(1, 0);
  36.             glVertex2f(rect.width, 0);
  37.         glEnd();
  38.  
  39.         // Zieltextur binden
  40.         glBindTexture(GL_TEXTURE_2D, subId);
  41.  
  42.         // kopieren
  43.         glCopyTexSubImage2D(
  44.             GL_TEXTURE_2D,
  45.             0,
  46.             rect.x, rect.y,
  47.             0, 0,
  48.             rect.width, rect.height
  49.         );
  50.  
  51.         Texture sub = new Texture();
  52.         sub.setId(subId);
  53.  
  54.         return sub;
  55.     }
  56.  


Jedoch erhalte ich kein (sichtbares) Ergebnis.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 15, 2011 01:51 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hm, ist auch der Viewport und so richtig eingestellt?
Zum Test kann man mal "SwapBuffers" dahintersetzen um das Quad angezeigt zu bekommen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 15, 2011 17:58 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Viewport ist korrekt eingestellt, ich sehe meine anderen Bilder ja.
Ist es möglich, dass ich das ganze eventuell mit glReadBuffer lösen kann? Wenn ja, welche Buffer brauche ich denn?
Mir würde wirklich ein Tutorial dazu helfen :/ Habe die halbe Bandbreite von Google schon abgegrast ohne irgendein Tutorial dazu gefunden zu haben...
Auf eurem Wiki sind wirklich viele tolle Sachen und insbesondere beim Einstieg und bei VBO's waren eure Tutorials sehr hilfreich, aber gerade zu diesem Thema steht da nix :/


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 16, 2011 14:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Viewportgröße muss stimmen und vorallem muss die Projektion auf eine orthogonale Projektion gestellt sein (glOrtho). rect darf natürlich nicht größer als der Viewport sein (der wiederum nicht größer als dein Fenster sein darf). Am besten ists vermutlich, wenn du die Viewportgröße dort explizit umstellst (glViewport), und zwar auf die in Rect gegebenen Maße. Danach mit glOrtho die Projektion auf orthogonal umstellen, Model View Matrix wieder auf die Identität zurücksetzen (glLoadIdentity). Dann sollte das schon gehen.

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: Di Jan 10, 2012 20:44 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich wieder. Ich hatte eine Pause gemacht und es dann wieder versucht, aber immer noch nichts hinbekommen ._.
Kann mir jmd. evtl. bitte ein minimalistisches Programm schreiben, wo ich die Anwendung genau sehen kann? Das wäre absolut freundlich, ich verzweifle.

edit:
Ich will euch mal meinen letzten Versuch zeigen:
Code:
  1.  
  2. GLuint Tex;
  3.         glGenTextures(1, &Tex);
  4.        
  5.         original.bind();
  6.        
  7.         glBindTexture(GL_TEXTURE_2D, Tex);
  8.         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, selection.width, selection.height, 0);
  9.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  10.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  11.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  12.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  13.        
  14.         glBindTexture(GL_TEXTURE_2D, Tex);
  15.         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, selection.width, selection.height);
  16.  


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 13, 2012 00:53 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Da offensichtlich keiner 'ne Ahnung hat, wieso das nicht geht: vllt. kann mir jmd. bei meinem eigenen nächsten Versuchen helfen.
Wieso bekomme ich hier eine Access Violation?
Code:
  1.  
  2.                 Texture tex = new Texture();
  3.        
  4.         this.bind();
  5.        
  6.         glReadBuffer(GL_FRONT);
  7.        
  8.         void *pixels;
  9.         glReadPixels(0, 0, 50, 50, GL_RGB, GL_UNSIGNED_BYTE, pixels);
  10.        
  11.         assert(pixels !is null);
  12.        
  13.         this.bind();
  14.  
  15.         // Set the texture's stretching properties
  16.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  17.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  18.      
  19.         // Edit the texture object's image data using the information SDL_Surface gives us
  20.         glTexImage2D(GL_TEXTURE_2D, 0, bytes, width, height, 0, texture_format, GL_UNSIGNED_BYTE, pixels);
  21.        
  22.         return tex;
  23.  


glGetError liefert 0.

edit:

Mit dme folgenden Code werden alle meine bisher gezeichneten Bilder weiß, ich sehe sie also nicht mehr. Ich bekomme aber auch keine Fehlermeldung.
Kann mir das jmd. erklären?

Code:
  1.  
  2. glMatrixMode(GL_MODELVIEW);
  3.         glLoadIdentity();
  4.        
  5.         glViewport(0, 0, this._width, this._height);
  6.         //glScissor(0, 0, this._width, this._height);
  7.        
  8.         GLuint copy;
  9.         glGenTextures(1, &copy);
  10.        
  11.         glBindTexture(GL_TEXTURE_2D, copy);
  12.        
  13.         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, this._width, this._height, 1);
  14.        
  15.         glViewport(0, 0, 300, 300);
  16.        
  17.         return new Texture(copy);
  18.  


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 17, 2012 02:13 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich weiß, ich nerve, aber ich habe es nun nochmal genau so versucht, wie ich euch verstanden habe. Ich habe den Viewport korrekt eingestellt und alles weitere bedacht, aber irgendwie bekomme ich beim versuch es zu rendern immer keine Ausgabe.
Ich weiß, es ist viel verlangt aber wenn sich jmd. die Mühe machen würde, mir dabei zu helfen wäre das echt super.

Code:
  1.  
  2. Texture my_sub_image(const Rect rect) {
  3.         assert(rect !is null);
  4.        
  5.         /// Damit bleibt das gesamte Fenster weiß.
  6.         /*
  7.         glMatrixMode(GL_MODELVIEW_MATRIX);
  8.         glLoadIdentity();
  9.         */
  10.         glViewport(0, 0, rect.width, rect.height);
  11.        
  12.         GLuint subId;
  13.         glGenTextures(1, &subId);
  14.  
  15.         // Binden den Zieltextur
  16.         glBindTexture(GL_TEXTURE_2D, subId);
  17.        
  18.         // Parameter der Zieltextur
  19.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  20.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  21.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  22.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  23.  
  24.         //glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
  25.  
  26.         glTexImage2D(GL_TEXTURE_2D, 0, this._format, rect.width, rect.height, 0, this._format, GL_UNSIGNED_BYTE, null);
  27.        
  28.         // Quelltextur binden
  29.         this.bind();
  30.  
  31.         // Quelltextur zeichnen
  32.         glBegin(GL_QUADS);
  33.             // top left
  34.             glTexCoord2i(0, 0);
  35.             glVertex2f(0, 0);
  36.             // top right
  37.             glTexCoord2i(1, 0);
  38.             glVertex2f(rect.width, 0);
  39.             // bottom right
  40.             glTexCoord2i(1, 1);
  41.             glVertex2f(rect.width, rect.height);
  42.             // bottom left
  43.             glTexCoord2i(0, 1);
  44.             glVertex2f(0, rect.height);
  45.         glEnd();
  46.        
  47.         // Zieltextur binden
  48.         glBindTexture(GL_TEXTURE_2D, subId);
  49.  
  50.         // kopieren
  51.         glCopyTexSubImage2D(
  52.             GL_TEXTURE_2D,
  53.             0,
  54.             rect.get_x(), rect.get_x(), // x, y
  55.             0, 0,
  56.             rect.width, rect.height
  57.         );
  58.        
  59.         glViewport(0, 0, 400, 400);
  60.  
  61.         return new Texture(null, subId, this);
  62.     }
  63.  


Wenn ich diese Methode vor meiner Game Loop aufrufe und dann das besagte ergebnis anzeigen lassen will -> fail.
Rufe ich diesen Teil allerdings in jedem Frame auf sehe ich in der Tat ein Quadrat von der angegebenen Größe am rechten Rand in der Mitte. Es ist allerdings völlig schwarz.

Wenn ich weitere Bilder davor und/oder danach rendere sehe ich auf dem schwarzen Dreieck die rote Schrift der original Texturen. Es sieht praktisch aus wie ein Thumbnail. Die anderen Bilder und Texturen sind allerdings komplett schwarz und flimmern hin und wieder.

Ich hab dafür mal ein paar Bilder hochgeladen, dann sieht man sicher besser was ich meine:
Einmal wie es ohne den Versuch aussieht, also die Ausgangssituation: http://imageshack.us/photo/my-images/81 ... rwise.png/
Einmal wie es mit dem Code oben, ohne andere Texture/Primitive zu rendern, aussieht: http://imageshack.us/photo/my-images/83 ... ender.png/
Einmal wie es mit dem Code von oben mit dem rendern von anderen Texturen/Primitiven aussieht: http://imageshack.us/photo/my-images/69 ... ender.png/
Einmal, wenn ich den Code nicht (wie in den obigen 3 Situationen) _in_ der GameLoop aufrufe, sondern davor deklariere und dann in der GameLoop zeichnen möchte: http://imageshack.us/photo/my-images/40 ... rende.png/
Einmal wenn ich die Quelltextur binde und dann _nur_ das Quad zeichne: http://imageshack.us/photo/my-images/14 ... itive.png/
Und einmal wie es aussieht, wenn ich
Code:
  1.  
  2. glMatrixMode(GL_MODELVIEW_MATRIX);
  3. glLoadIdentity();
  4.  
verwenden: http://imageshack.us/photo/my-images/83 ... ntity.png/

edit: Entschuldigt, die img BBCodes scheinen nicht korrekt zu funktionieren, deswegen nur als Link.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 17, 2012 22:07 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Also entweder mag mich niemand mehr oder aber keiner weiß Rat ._.

edit: Gut da auch hier keiner eine Ahnung hat, wie es richtig geht und in zwei anderen ebenso wenig werde ich das Thema abschließen und wieder die SDL bemühen. Danke an die die sich die Mühe gegeben haben, es mir irgendwie zu erklären, einiges davon habe ich leider erst zu spät verstanden. :/ Aber dennoch: danke. :)


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


Wer ist online?

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