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

AWeber

Frischling

  • »AWeber« ist der Autor dieses Themas

Beiträge: 15

Beruf: Student + Softwareentwickler

  • Private Nachricht senden

1

18.11.2012, 23:17

Android OpenGL ES 2.0 Texture Matrix

[EDIT]

Ich habe gerade gemerkt dass in der Breite alle Pixel gezeigt werden,
in der Höhe aber nur das erste Pixel.

Woran kann das liegen ?

Java-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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
public class DNESprite {
    
    private static final int SCALE = 0;
    private static final int NO_SCALE = 1;
    
    private final float VERTEXCOORDS[] = {-1f, -1f,
                                -1f, 1f,
                                1f, 1f,
                                1f, -1f};
    private final short INDEXORDER[] = {0, 1, 2, 0, 2, 3};
    private final float TEXTURECOORDS[] = {0f, 1f,
                                                                 0f, 0f,
                                1f, 0f,
                                1f,  1f};
    private final String VERTEXSHADERCODE = 
                    "uniform mat4 vertexPositionMatrix;"
                    + "uniform mat2 texturePositionMatrix;"
                    + "attribute vec4 vertexPosition;"
                    + "attribute vec2 texturePosition;"
                    + "varying vec2 texture_Position;"
                    + "void main() {" 
                    + "gl_Position = vertexPositionMatrix * vertexPosition;"
                    + "texture_Position = texturePositionMatrix * texturePosition;"
                    + "}";
    private final String FRAGMENTSHADERCODE = 
                    "precision mediump float;"
                    + "uniform sampler2D texture;"
                    + "varying vec2 texture_Position;"
                    + "void main() {" 
                    + "gl_FragColor = texture2D(texture, texture_Position);"
                    + "}";
    
    private FloatBuffer vertexBuffer;
    private ShortBuffer indexBuffer;
    private FloatBuffer textureBuffer;
    private int vertexShader;
    private int fragmentShader;
    private int program;
    private int vertexPositionHandle;
    private int vertexPositionMatrixHandle;
    private int texturePositionHandle;
    private int texturePositionMatrixHandle;
    private float[] objectMatrix;
    private float[] textureMatrix;
    private int[] textureID;
    private Bitmap spritesheet;
    
    private int posX;
    private int posY;
    private int posZ;
    private int scaleMode;
    private float scaleX;
    private float scaleY;
    private float rotX;
    private float rotY;
    private float rotZ;
    
    public DNESprite(Bitmap sheet) {
        spritesheet = sheet;
        scaleMode = DNESprite.SCALE;
        scaleX = 0.5f;
        scaleY = 0.5f;
        
        // setup buffers
        vertexBuffer = ByteBuffer.allocateDirect(VERTEXCOORDS.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
        vertexBuffer.put(VERTEXCOORDS);
        vertexBuffer.position(0);
        
        indexBuffer = ByteBuffer.allocateDirect(INDEXORDER.length * 2).order(ByteOrder.nativeOrder()).asShortBuffer();
        indexBuffer.put(INDEXORDER);
        indexBuffer.position(0);
        
        textureBuffer = ByteBuffer.allocateDirect(TEXTURECOORDS.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
        textureBuffer.put(TEXTURECOORDS);
        textureBuffer.position(0);
        
        // setup shaders
        vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
        GLES20.glShaderSource(vertexShader, VERTEXSHADERCODE);
        GLES20.glCompileShader(vertexShader);
        
        fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
        GLES20.glShaderSource(fragmentShader, FRAGMENTSHADERCODE);
        GLES20.glCompileShader(fragmentShader);
        
        // setup program
        program = GLES20.glCreateProgram();
        GLES20.glAttachShader(program, vertexShader);
        GLES20.glAttachShader(program, fragmentShader);
        GLES20.glLinkProgram(program);
        
        // setup texture
        textureID = new int[1];
        GLES20.glGenTextures(1, textureID, 0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID[0]);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, spritesheet, 0);
        spritesheet.recycle();
        
        objectMatrix = new float[16];
        textureMatrix = new float[16];
    }
    
    public void render() {
        GLES20.glUseProgram(program);
        
        // get object and texture matrix
        Matrix.setIdentityM(objectMatrix, 0);
        Matrix.setIdentityM(textureMatrix, 0);
        
        // get vertex and texture position
        vertexPositionHandle = GLES20.glGetAttribLocation(program, "vertexPosition");
        texturePositionHandle = GLES20.glGetAttribLocation(program, "texturePosition");
        GLES20.glEnableVertexAttribArray(vertexPositionHandle);
        GLES20.glEnableVertexAttribArray(texturePositionHandle);
        
        GLES20.glVertexAttribPointer(vertexPositionHandle, 2, GLES20.GL_FLOAT, false, 8, vertexBuffer);
        GLES20.glVertexAttribPointer(texturePositionHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer);
        
        // scale object matrix
        Matrix.scaleM(objectMatrix, 0, scaleX, scaleY, 1.0f);
        
        // position object matrix
        Matrix.translateM(objectMatrix, 0, 0.0f, 0.0f, 0.0f);
        
        // rotate object matrix
        Matrix.rotateM(objectMatrix, 0, 0f, 1.0f, 1.0f, 1.0f);
        
        // get and change vertex position matrix
        vertexPositionMatrixHandle = GLES20.glGetUniformLocation(program, "vertexPositionMatrix");
        GLES20.glUniformMatrix4fv(vertexPositionMatrixHandle, 1, false, objectMatrix, 0);
        
        // scale texture matrix
        Matrix.scaleM(textureMatrix, 0, 1.0f, 1.0f, 1.0f);
        
        // position texture matrix
        Matrix.translateM(textureMatrix, 0, 0.0f, 0.0f, 0.0f);
        
        // get and change texture matrix
        texturePositionMatrixHandle = GLES20.glGetUniformLocation(program, "texturePositionMatrix");
        GLES20.glUniformMatrix2fv(texturePositionMatrixHandle, 1, false, textureMatrix, 0);
        
        // draw vertex
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, INDEXORDER.length, GLES20.GL_UNSIGNED_SHORT, indexBuffer);
        GLES20.glDisableVertexAttribArray(vertexPositionHandle);
        GLES20.glDisableVertexAttribArray(vertexPositionMatrixHandle);
    }
    
}

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »AWeber« (20.11.2012, 21:11)


AWeber

Frischling

  • »AWeber« ist der Autor dieses Themas

Beiträge: 15

Beruf: Student + Softwareentwickler

  • Private Nachricht senden

2

20.11.2012, 20:45

Die Breite ist jetzt korrekt, die Höhe stimmt aber noch nicht.

AWeber

Frischling

  • »AWeber« ist der Autor dieses Themas

Beiträge: 15

Beruf: Student + Softwareentwickler

  • Private Nachricht senden

3

22.11.2012, 14:26

Ist das Problem zu simpel, dass es keiner Antwort bedarf ?
Übersehe ich irgendetwas banales ?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

22.11.2012, 14:35

Ich denk, dass bisher einfach keiner Lust hatte, den ganzen Codehaufen da oben durchzulesen... ;)

Anyway, nach schnellem überfliegen würde ich mal vermuten: Das Problem ist, dass der Typ Matrix eben eine 4x4 Matrix ist und GLES20.glUniformMatrix2fv aber einfach nur die ersten vier float Werte aus der In-Memory Representation dieser 4x4 Matrix nimmt, was wohl nicht der korrekten 2x2 Matrix entspricht.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (22.11.2012, 14:42)


AWeber

Frischling

  • »AWeber« ist der Autor dieses Themas

Beiträge: 15

Beruf: Student + Softwareentwickler

  • Private Nachricht senden

5

22.11.2012, 14:39

Ja aber die 4x4 Matrix ist über die vertices gezogen, über der Textur ist eine 2x2 Matrix.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

22.11.2012, 14:42

Das Problem ist aber eben (zumindest würd ich mal vermuten, dass das das Problem ist), dass die an GLES20.glUniformMatrix2fv übergebene Matrix eine 4x4 Matrix ist und keine 2x2 Matrix. Deine textureMatrix oben sollte einer Identitätsmatrix entsprechen. Die ersten vier Werte sind also, egal ob die Matrix row-major oder column-major gespeichert wird, 1, 0, 0, 0. Wiederum egal ob die Daten als row-major oder column-major interpretiert werden, entspricht dies einer 2x2 Matrix, die die zweite Koordinate eines Punktes zu Null kollabiert, was sich mit den Symptomen deckt...

AWeber

Frischling

  • »AWeber« ist der Autor dieses Themas

Beiträge: 15

Beruf: Student + Softwareentwickler

  • Private Nachricht senden

7

22.11.2012, 15:02

Wenn ich das jetzt richtig verstehe dann liegt es daran dass ich im Shader eine 2x2 Matrix definiere und
anschließend mit glUniformMatrix2fv versuche diese 2x2 Matrix mit einer 4x4 Matrix, die ich vorher über
Matrix.setIdentityM(textureMatrix, 0) gesetzt habe, zu verbinden ?

Wenn dem so ist:
Wieso kann ich keine 4x4 Matrix für die Textur im Shader definieren ? -
in AS3 mit Stage3D habe ich eine 4x4 Matrix für die vertices und eine 4x4 Matrix für die Textur.

MFG

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

22.11.2012, 15:10

Wieso kann ich keine 4x4 Matrix für die Textur im Shader definieren ?

Wo liegt dabei das Problem, natürlich könntest du eine 4x4 Matrix verwenden!? Die Frage ist halt, inwiefern das sinnvoll ist. Wieso kannst du nicht einfach eine entsprechende 2x2 Matrix an den Shader übergeben?

AWeber

Frischling

  • »AWeber« ist der Autor dieses Themas

Beiträge: 15

Beruf: Student + Softwareentwickler

  • Private Nachricht senden

9

22.11.2012, 15:16

Hmm,

ich dachte das hätte ich getan.

Im Shader

Quellcode

1
uniform mat2 texturePositionMatrix;


Und dann

Quellcode

1
glUniformMatrix2fv


oder besteht hier ein Verständnisproblem ? -
Ich denke dass

Quellcode

1
glUniformMatrix2fv


eine 2x2 Matrix übergibt und

Quellcode

1
glUniformMatrix4fv


eine 4x4 Matrix übergibt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

22.11.2012, 15:18

Aber die Daten, die du an glUniformMatrix2fv übergibst, beschreiben keine 2x2 Matrix, das ist das Problem, denk ich...

Werbeanzeige