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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

31

19.01.2012, 18:51

Ändere den ersten glViewport auf (0,0,400,400), den zweiten lass weg. Render das erste Quad dann mit 400 Kantenlänge. Was kommt raus? :)
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

32

19.01.2012, 19:01

Du meinst so?

Quellcode

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
this.bind_anyway();

/*
glBegin(GL_QUADS);
    // top left
    glTexCoord2f(0.25, 0.25);
    glVertex2f(0, 0);
    // top right
    glTexCoord2f(0.8, 0.25);
    glVertex2f(w, 0);
    // bottom right
    glTexCoord2f(0.8, 0.8);
    glVertex2f(w, h);
    // bottom left
    glTexCoord2f(0.25, 0.8);
    glVertex2f(0, h);
glEnd();
*/
glBegin(GL_QUADS);
    // top left
    glTexCoord2f(0.25, 0.25);
    glVertex2f(0, 0);
    // top right
    glTexCoord2f(0.8, 0.25);
    glVertex2f(400, 0);
    // bottom right
    glTexCoord2f(0.8, 0.8);
    glVertex2f(400, 400);
    // bottom left
    glTexCoord2f(0.25, 0.8);
    glVertex2f(0, 400);
glEnd();


Dann erhalte ich diesen Output: http://imageshack.us/photo/my-images/703/finishdi.png/
Aber entspricht das wirklich dem Ausschnitt von 0.25 - 0.8 der Textur? Oder habe ich etwas missverstanden?

edit: Alles klar, mit den Koordinaten rumspielen hab' ich zwar noch nicht ganz raus, aber es läuft. Danke Kobold, vor allem für die Geduld. :)
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, 19:33)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

33

19.01.2012, 19:42

Ich sag ja, die Textur-Koordinaten "stehen auf dem Kopf". Deswegen ergab sich da auch ein schwarzes Quadrat. Es wurde nicht der Bereich kopiert, den Du geglaubt hast zu kopieren. Mit der Textur über den vollen Viewport wollte ich Dir das klar machen. :)
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

34

19.01.2012, 19:52

Muss ich nun aber nicht bei jeglichen Aufruf von subimage auch die Größe des aktuellen Fensters mit angeben oder lässt sich da noch was machen?
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

35

19.01.2012, 20:03

Die Größe des Fensters ist doch gar nicht relevant. Relevant ist nur der zu kopierende Ausschnitt und dessen Dimensionen.
Wenn Du natürlich das Ausgangsbild skalierst (glScale oder glViewport z.B.), dann änderst Du das kopierte Ergebnis natürlich ebenfalls. Genau das hast Du da oben gemacht. Du hast den Viewport kleiner gemacht und in noch kleineren Dimensionen gerendert, wodurch auch das kopierte Ergebnis Quatsch wurde.
Der kopierte Ausschnitt ist aber immer so groß, wie Du explizit angibst.
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

36

19.01.2012, 21:00

Ja aber damit muss ich mich noch einfuchsen. Ich denke das einfachste ist, ich belasse es dabei, dass der glViewport beim eigentlichen OpenGL Setup auf die Fenster Größe eingestellt wird und ich meine Textur Klasse benachrichtige, welche Größen das Fenster hat (übergangsweise).

Aber damit sich auch entsprechend jmd. der mal dasselbe Problem hat zurechtfindet, hier der Abschlusscode:

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
85
Texture subimage() {
    assert(this._pixels !is null);
    
    const ushort w = 52;
    const ushort h = 52;
    const ushort fromx = 31;
    const ushort fromy = 38;
    
    GLuint Screen;
    glGenTextures(1, &Screen);
    //writefln("gen. Id for Sub.: %d", 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, null);
    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);
    
    glBindTexture(GL_TEXTURE_2D, Screen);
    
    this.bind_anyway();
    
    const ushort vp_w = Texture._window_width;
    const ushort vp_h = Texture._window_height;
    
    const float percent_x = cast(float)(vp_w) / this._width;
    const float percent_y = cast(float)(vp_h) / this._height;
    
    //glViewport(0, 0, vp_w, vp_h);
    
    glBegin(GL_QUADS);
        // top left
        glTexCoord2f(0, 0);
        glVertex2f(0, 0);
        // top right
        glTexCoord2f(1, 0);
        glVertex2f(vp_w, 0);
        // bottom right
        glTexCoord2f(1, 1);
        glVertex2f(vp_w, vp_h);
        // bottom left
        glTexCoord2f(0, 1);
        glVertex2f(0, vp_h);
    glEnd();
    
    //glViewport(0, 0, 400, 400);
    
    glBindTexture(GL_TEXTURE_2D, Screen);
    glCopyTexImage2D(GL_TEXTURE_2D, 0, this._format, cast(uint)(fromx * percent_x), cast(uint)(fromy * percent_y), 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);
    
    // Zeichnen der Kopie
    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();
    
    glDeleteTextures(1, &Screen);
    
    //return new Texture(Rect(fromx, fromy, w, h), Screen, this);
    return null;
}


Und der darauffolgende Output (Ausgangs Textur sieht man ja im Startpost): http://imageshack.us/photo/my-images/685/finish1.png/

Danke nochmal an den blauen Kobold. ;)
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

37

19.01.2012, 21:14

Na das wird den Weihnachtsmann doch freuen ;)
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

38

19.01.2012, 22:30

;)
Eine letzte Frage noch:
Ich habe gelesen, dass glCopyTexSubImage2D glCopyTexImage2D vorzuziehen ist, da es schneller sein soll. Ist da etwas dran, also weiß das jemand aus persönlicher Erfahrung?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

39

19.01.2012, 22:40

Was genau willst du denn anstellen? Wenn es um Performance geht, dann würd ich mir mal drüber Gedanken machen warum überhaupt glCopyTexImage2D()!?

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

40

19.01.2012, 22:43

Geht nur um die simple Frage was schneller ist und wie vertrauenswürdig mein "Hören Sagen" so ist.
Um Performance geht es nicht, bei diesem kleinen Experiment ging es nur darum, etwas zu lernen.

P.S.: dein "!?" wirkt immer sehr abschreckend und irritierend.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige