Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

11

19.01.2012, 13:16

Das geht ja hier in einem Affen Zahn, wow. :)

Siehe meinen edit und verwende ich deine Änderung, und benutzte statt den Pixel des Original Bildes (this._pixels) "memory", bekomme ich diesen Output: http://imageshack.us/photo/my-images/254/emptyo.png/

Zur Sicherheit nochmal der angepasste Code jetzt: http://www.rswhite.de/code/index.php?q=d…c54a6d0d48a7875

P.S.: ändere ich wieder von "memory" in "this._pixels" haben wir wieder das gleiche, nicht optimale Ergebnis von Anfangs.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

19.01.2012, 13:21

Nein, das schwarz dürfte stimmen. Mach mal das "subimage" genauso groß wie den Viewport und kopiere alles. Dann siehst du eventuell, was ich ganz oben mit "2)" meinte. Fehler #1 dürfte jedenfalls geklärt sein. Also einfach w und h auf die Größe des Viewports setzen (400). Wenn ich Recht hatte, steht dein Viewport dann scheinbar auf dem Kopf.

Note:
Ich habe jetzt gleich Scrum-Retrospektive, bin also erstmal nicht mehr da.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

13

19.01.2012, 13:29

Mit einem Viewport von 128x128 erhalte ich ebenso die Ausgabe des schwarzen Quadrats in der Größe des Original Textur (ist ja auch die Größe der Original Textur, wollte es aber einfach mal erwähnen). Mit 400x400 (zur Kontrolle der Code: http://www.rswhite.de/code/index.php?q=3…51d830170c91bcb) bekomme ich das hier als Output: http://imageshack.us/photo/my-images/215/viewport400.png/

edit:
Wenn ich diesen Code hier habe: http://www.rswhite.de/code/index.php?q=0…79acf8eb5140b89 Sehe ich nur ein schwarzes Quadrat in der Größe von 80x80, hatten wir ja schon: http://imageshack.us/photo/my-images/607/blackrhumb.png/

Kommentiere ich die Zeilen 20 - 26 aus, also:

Quellcode

1
2
3
4
5
6
7
8
9
/*
glGenTextures(1, &Screen);
glBindTexture(GL_TEXTURE_2D, Screen);
    
// Daten in den Speicher, Lineares Filtering aktivieren
glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, memory);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
*/


erhalte ich meine Original Textur in der Größe von 80x80: http://imageshack.us/photo/my-images/827/thumbfs.png/
Es scheint also so, als würde das generieren und leere Erstellen der Textur die später den Teilausschnitt beherbergen soll, die aktuell gebundene Textur schwarz färben. Dann könnte mein Code bzw. unsere Versuche richtig sein, aber man sieht natürlich nichts, da wir ja von einer schwarzen Textur ein Subimage holen, was wiederum schwarz sein muss.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Architekt« (19.01.2012, 13:48)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

19.01.2012, 15:34

Nein, das klingt nicht logisch. Wenn Du den Code da oben weg lässt, dann wird keine Textur erstellt und keine gebunden und du renderst mit der alten (this) ganz normal den Inhalt. Das Copy scheint also nicht korrekt zu laufen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

15

19.01.2012, 16:32

Hm, dann bin ich mit meinem Latein am Ende. Klang für mich am plausibelsten, dass die neu erstellte & gebundene Texutur die alte irgendwie schwarz färbt/überschreibt.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

16

19.01.2012, 17:03

Volles Kommando zurück, ich hab' einen beknackten Fehler gehabt. Um Texturen nicht immer und immer wieder zu binden, habe ich nach jedem binden die ID in eine statische Exemplarvariable gepackt und dann bei jedem bindungs versuch erst geprüft, ob die Textur momentan gebunden ist. Das hat zu dem schwarzen Quadrat geführt.
Ich habe dafür nun die Methode bind_anyway und ich habe nun mit nachfolgenden Code diesen Output, sieht schon eher nach etwas aus, aber immer noch nicht das wahre: http://imageshack.us/photo/my-images/542/firstresultat.png/ . Sieht mehr aus wie ein Thumbnail des Original Bildes im Schatten der Original Bildgröße.

Code:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Texture subimage() {
    assert(this._pixels !is null);
    
    const ushort w = 80;
    const ushort h = 80;
    /*
    GLuint Screen;
    glGenTextures(1, &Screen);
    glBindTexture(GL_TEXTURE_2D, Screen);
    
    // Daten in den Speicher, Lineares Filtering aktivieren
    glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, this._pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    */
    void * memory = GC.malloc(w * h * 4);
    
    GLuint Screen;
    glGenTextures(1, &Screen);
    glBindTexture(GL_TEXTURE_2D, Screen);
    
    // Daten in den Speicher, Lineares Filtering aktivieren
    glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, memory);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    
    GC.free(memory);
    
    glClearColor(0.0, 0.0, 0.0,0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glViewport(0, 0, w, h);
    glBindTexture(GL_TEXTURE_2D, Screen);
    
    this.bind_anyway();
    
    glBegin(GL_QUADS);
        // top left
        glTexCoord2i(0, 0);
        glVertex2f(0, 0);
        // top right
        glTexCoord2i(0, 1);
        glVertex2f(w, 0);
        // bottom right
        glTexCoord2i(1, 1);
        glVertex2f(w, h);
        // bottom left
        glTexCoord2i(1, 0);
        glVertex2f(0, h);
    glEnd();
    
    glViewport(0, 0, 400, 400);
    
    glBindTexture(GL_TEXTURE_2D, Screen);
    glCopyTexImage2D(GL_TEXTURE_2D, 0, this._format, 0, 0, w, h, 0);
    
    // Löschen des Color-Buffers. Deaktiviert sieht man eine weitere Textur unten.
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glBindTexture(GL_TEXTURE_2D, Screen);
    
    const ubyte d = 5;
    
    glBegin(GL_QUADS);
        // top left
        glTexCoord2i(0, 0);
        glVertex2f(d, d);
        // top right
        glTexCoord2i(0, 1);
        glVertex2f(w + d, d);
        // bottom right
        glTexCoord2i(1, 1);
        glVertex2f(w + d, h + d);
        // bottom left
        glTexCoord2i(1, 0);
        glVertex2f(d, h + d);
    glEnd();
    
    glDeleteTextures(1, &Screen);
    
    //return new Texture(null, Screen, this);
    return null;
}


edit:
Ob ich nun

Quellcode

1
glCopyTexImage2D(GL_TEXTURE_2D, 0, this._format, 0, 0, w, h, 0);
oder

Quellcode

1
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, w, h);
verwende, scheint keinerlei Unterschied zu machen. o.O

edit2:
Mit diesem Code erhalte ich folgenden Output: http://imageshack.us/photo/my-images/196/secondresult.png/
Ändere ich glViewport (Zeile 32) von

Quellcode

1
glViewport(0, 0, this._width, this._height);
auf

Quellcode

1
glViewport(0, 0, w, h);
bekomme ich so etwas: http://imageshack.us/photo/my-images/259/secondresult2.png/
Also immer noch keine wirkliche Sub Textur. Aber immerhin schon mal etwas.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Architekt« (19.01.2012, 17:23)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

19.01.2012, 17:21

Die Skalierung kann ich irgendwie nicht erklären, die Koordinaten scheinen ok. Die Rotation des Bildes ist aber durchaus erklärbar, denn Du hast die Koordinaten vergurkt. Die Vertices passen nicht zu den Kommentaren und die Textur-Koordinaten passen nicht zu den Vertices. ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

18

19.01.2012, 17:24

Die Skalierung kann ich irgendwie nicht erklären, die Koordinaten scheinen ok. Die Rotation des Bildes ist aber durchaus erklärbar, denn Du hast die Koordinaten vergurkt. Die Vertices passen nicht zu den Kommentaren und die Textur-Koordinaten passen nicht zu den Vertices. ;)

Siehe edit. Oder bezieht dein Beitrag sich bereits darauf?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

19.01.2012, 17:26

Ach nach Deinem Edit stimmt es nicht :P
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

20

19.01.2012, 17:32

Oh du hast natürlich völlig recht. Ich habe es eben mal unter dem angegeben Link geändert.
Es heißt nun

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
this.bind_anyway();

glBegin(GL_QUADS);
    // top left
    glTexCoord2i(0, 0);
    glVertex2f(0, 0);
    // top right
    glTexCoord2i(1, 0);
    glVertex2f(this._width, 0);
    // bottom right
    glTexCoord2i(1, 1);
    glVertex2f(this._width, this._height);
    // bottom left
    glTexCoord2i(0, 1);
    glVertex2f(0, this._height);
glEnd();


und

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
glBindTexture(GL_TEXTURE_2D, Screen);

const ubyte d = 5;

glBegin(GL_QUADS);
    // top left
    glTexCoord2i(0, 0);
    glVertex2f(d, d);
    // top right
    glTexCoord2i(1, 0);
    glVertex2f(w + d, d);
    // bottom right
    glTexCoord2i(1, 1);
    glVertex2f(w + d, h + d);
    // bottom left
    glTexCoord2i(0, 1);
    glVertex2f(d, h + d);
glEnd();


Output: http://imageshack.us/photo/my-images/208/secondresult4.png/

bzw. mit glViewport(0, 0, w, h); : http://imageshack.us/photo/my-images/846/secondresult3.png/
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige