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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

20.10.2014, 16:59

[Solved|Android] Viewport und Texturen laden

So, nachdem ich entschieden habe das mir libGDX nicht gefällt, mache ich es mal wieder selbst. Damit portiere ich also meine Engine/Framework/whatever auf Java.
Nun bin ich erstmal auf zwei Probleme gestoßen, eins davon verstehe ich nicht (das kommt zu erst), das andere bekomme ich vielleicht hin, mit Hilfe gehts aber schneller ;)

So Problem 1: Warum beginnt mein Viewport nicht in der unteren linken Ecke?
Dieses quadrat habe ich auf 0|0 gesetzt (wird nicht verschoben, model Matrix = Identitätsmatrix):


(Link)


Das mit der Textur ist Fehler 2, aber erstmal verstehe ich nicht warum mein Viewport nicht bei 0|0 beginnt, wenn ich diesen auf 0, 0, Breite, Höhe setze.
Der Viewport wird auch nicht falsch gesetzt oder verändern, das hab ich schon geprüft. Also viewport einfach:

Quellcode

1
2
3
4
5
@Override
    public void setViewport(int x, int y, int width, int height){
// edit: achso, hiervor wird auch noch glViewport aufgerufen ;)
        camera.setViewport(x, y, width, height);
    }


Die orthogonale Projektion wird so erstellt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
public void ortho(float x, float y, float width, float height){
        if(x != width && y != height){
            identity();

            values[0] = 2.0f/(width-x);
            values[4] = 2.0f/(height-y);
            values[6] = -(width+x)/(width-x);
            values[7] = -(height+y)/(height-y);
            values[8] = 1.0f;
        }
    }


Funktioniert absolut genauso, wie in der JavaScript und C++ Version. Also, wo ist das Problem?
Vielleicht im Shader?

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
public static String spriteVertex =
        "uniform mat3 o, m;"+
        
        "attribute vec2 vertex;"+
        "attribute vec2 texCoord;"+
        
        "varying vec2 tc;"+
        
        "void main(){"+
            "tc = texCoord;"+
            "gl_Position = vec4(o*m*vec3(vertex, 0.0), 1.0);"+
        "}";
    
    public static String spriteFragment =
        "precision highp float;"+
    
        "uniform sampler2D texture;"+       
        
        "varying vec2 tc;"+
        
        "void main(){"+
            //"gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);"+
            "gl_FragColor = texture2D(texture, tc);"+
        "}";


So, das wäre Fehler 1.

Fehler 2 ist eher eine Frage: wie lädt man Texturen für OpenGL in Java?
Ich habe mir dazu eine kleine Funktion geschrieben die einfach eine Bitmap aus dem assets Ordner lädt:

Quellcode

1
2
3
4
5
6
7
8
9
10
public static Bitmap getTexture(String path){
        try{
            Bitmap bitmap = BitmapFactory.decodeStream(Klotz.assets.open(path));
            
            return bitmap;
        }
        catch(Exception e){
            return null;
        }
    }


Diese wird dann in der Texture Klasse so verarbeitet (glGenTextures wird im Konstruktor aufgerufen):

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
34
35
36
public void create(Bitmap data, int filter, int wrap){
        bind();
        
        if(filter == 0){
            setParam(GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
            setParam(GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
        }
        else{
            setParam(GLES20.GL_TEXTURE_MAG_FILTER, filter);
            setParam(GLES20.GL_TEXTURE_MIN_FILTER, filter);
        }
        
        if(wrap == 0){
            setParam(GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
            setParam(GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
        }
        else{
            setParam(GLES20.GL_TEXTURE_WRAP_S, wrap);
            setParam(GLES20.GL_TEXTURE_WRAP_T, wrap);
        }
        
        try{
            // to byte array
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            data.compress(Bitmap.CompressFormat.PNG, 100, bytes);
            
            // upload
            GLES20.glTexImage2D(target, 0, internal, data.getWidth(), data.getHeight(), 0, format, type, ByteBuffer.wrap(bytes.toByteArray()));
            bytes.close();
        }
        catch(Exception e){
            System.out.println("Error compressing and uploading OpenGL texture!");
        }
        
        unbind();
    }


Wie das aussieht seht ihr ja oben. Das mit dem "to byte array" habe ich so auf Stackoverflow gefunden.
Außerdem wäre es gut die Textur flippen zu können...

Vielleicht kann mir ja einer von den Android Experten da draußen helfen, wär auf jeden Fall nett.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (22.10.2014, 21:37)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

22.10.2014, 16:22

Ja beide Problem existieren immer noch, keiner eine Idee?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

22.10.2014, 17:51

http://developer.android.com/guide/topic…ics/opengl.html
--> Mapping Coordinates for Drawn Objects
--> Projection and camera view in OpenGL ES 1.0 oder 2.0 and higher
Das dürfte Deine erste Frage klären.

Zu der zweiten sehe ich irgendwie keinen Klärungsbedarf. Wenn Du die Bytes flippen willst, flippe sie halt. Das sollte doch nur 3 Zeilen Code sein.
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]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

22.10.2014, 21:37

Gut Fehler 1: in meinem Shader stand:

Quellcode

1
gl_Position = vec4(o*m*vec3(vertex, 0.0), 1.0);


0.0 beim vec3 cast -> keine Transformation, damit auch nicht bei 0|0 durch die Projektionsmatrix... Tada :rolleyes:

Problem 2: Hmm aber du siehst ja das in der Textur auch Pixelfehler sind (unten bunt), also denke ich, ich lade falsch.
Aber dafür klau ich mir einfach was zusammen :D

Danke für den Denkanstoß.

[Edit]

Wenn jemand Code dafür "über" hat, nehme ich den gerne.

Werbeanzeige