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

1

18.12.2016, 13:04

[OpenGL] Probleme mit TextureAtlas/TexCoord

Hallo Zusammen,

ich habe folgendes Problem mit GLSL bzw. OpenGL:

Ich habe einen TextureAtlas (Anhang, 1.png) erstellt.
Wenn ich diesen als Ganzes auf einem Block rendere (vec2 textureCoords = TexCoords;), wird das gesamte Bild dargestellt, was ja auch richtig ist (Anhang, 1-scr.png).
Wenn ich nun dieses Bild aufteile (vec2 textureCoords = TexCoords * vec2(0.5f, 1.f);), dann wird nur das erste Sprite dargestellt, was ebenfalls richtig ist (Anhang, 2.png, 2-scr.png);
Jetzt möchte ich allerdings entscheiden können, welche Fläche dieser Textur dargestellt wird.
Folgendes habe ich also gemacht:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
...

uniform int textureOff;

void main()
{
    vec2 textureCoords = TexCoords * vec2(0.5f, 1.f);
    textureCoords.x += textureOff * 8; //Wobei '8' in diesem Fall der Breite der jeweiligen Textur entspricht (siehe 2.png, roter Kasten)

        ....
}


Ist der Wert von textureOff gleich 0, verändert sich die X-Koordinate ja nicht (0 * 8).
Jetzt habe ich allerdings den Wert auf 1 gesetzt, folglich muss die X-Koordinate sich doch eigentlich um 8 erhöhen, siehe 3.png?!

Das Resultat bleibt allerdings das selbe wie in 2-scr.png.

Was mache ich falsch?



»Tucker« hat folgende Bilder angehängt:
  • 1.png
  • 1-scr.PNG
  • 2.png
  • 2-scr.PNG
  • 3.png

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

18.12.2016, 14:16

Textur-Koordinaten gehen nicht von 0..8 oder 0..256 oder 0..2048, sondern von 0..1. Alles danach wiederholt sich einfach.
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]

3

18.12.2016, 15:10

Klar, danke dir :thumbsup:

4

07.01.2017, 13:27

Wie BlueCobold schon sagte, wird das ganze in Prozent angegeben.

Hier mal ein Beispiel, um einen Ausschnitt aus einer Texture zu zeichnen (nur TexCoords):

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
33
protected void updateTexCoords (ReadonlyImageRegionInfo imageView) {
        //create new list for texture coordinates
        List<Float> textCoords = this.cachedTextCoords;
        textCoords.clear();

        //GameLogger.debug("OpenGL2DTextureRegion", "updateTexCoords, startX: " + imageView.getStartX() + ", startY: " + imageView.getStartY() + ", width: " + imageView.getWidth() + ", height: " + imageView.getHeight());

        /**
         * (0, 0) is left bottom and (1, 1) right top of texture
         */

        final float textureWidth = this.texture.getWidth();
        final float textureHeight = this.texture.getHeight();

        //left top vertex
        textCoords.add(imageView.getStartX() / textureWidth);
        textCoords.add(imageView.getStartY() / textureHeight);

        //left bottom vertex
        textCoords.add(imageView.getStartX() / textureWidth);
        textCoords.add((imageView.getStartY() + imageView.getHeight()) / textureHeight);

        //right bottom vertex
        textCoords.add((imageView.getStartX() + imageView.getWidth() ) / textureWidth);
        textCoords.add((imageView.getStartY() + imageView.getHeight()) / textureHeight);

        //right top vertex
        textCoords.add((imageView.getStartX() + imageView.getWidth() ) / textureWidth);
        textCoords.add(imageView.getStartY() / textureHeight);

        float[] textCoordsArr = ArrayUtils.convertFloatListToArray(textCoords);
        this.getMesh().setTextureCoordinatesVBO(textCoordsArr);
    }


Hier ist der komplette Source: https://github.com/JuKu/rpg-2dgame-engin…tureRegion.java
Game Engine Ankündigung: https://jukusoft.com/2016/12/10/java-2d-game-engine/ (mittlerweile schon nen paar Versionen höher)
Indie Game-Dev Programmierer beim 2D MMORPG Pentaquin | Pentaquin Foren Vorstellung

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

09.01.2017, 15:00

Wie BlueCobold schon sagte, wird das ganze in Prozent angegeben.

Nein, nicht in Prozent (das wäre von 0 bis 100), sondern von 0 bis 1.

Werbeanzeige