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

14.05.2012, 18:44

Android/OpenGL ES 2.0

Hallo Leute,

ich versuche gerade OpenGL ES 2.0 unter Android zum laufen zu bekommen. Das hab ich jetzt:

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
package mbprog.opengltest;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

public class OpenGLTest extends Activity{
    private GLSurfaceView m_glcontext;
    
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        
        m_glcontext = new GLSurfaceView(this);
        
        setContentView(m_glcontext);
    }
    
    @Override
    public void onPause(){
        super.onPause();
        
        m_glcontext.onPause();
    }
    
    @Override
    public void onResume(){
        super.onResume();
        
        m_glcontext.onResume();
    }
}


... und stürzt ab. Es liegt an dem setcontentView(...); wobei ich mich genau ans Tutorial gehalten habe.

Wie geht das? Man findet auch nicht sonderlich viel bei Google zu dem "Bug" (wenns denn einer ist).

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

14.05.2012, 18:54

*hust*

Quellcode

1
2
3
4
5
6
7
8
@Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        
        m_glcontext = new GLSurfaceView(this);
        m_glcontext.setRenderer(new GLRenderer());      
        setContentView(m_glcontext);
    }


Danke für eure Hilfe :) (Selbsttherapie, ich brauch nen Blog).

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

19.05.2012, 18:58

Ok jetzt hab ich doch nochmal eine Frage die eher Java betrifft. Wenn ich meine App jetzt starte (funktioniert alles) und versuche mittels einer (selbstgeschriebenen) Klasse einen Shader zu laden bekomme ich mehrfach folgende Errors:

Quellcode

1
call to OpenGL ES API with no current context (logged once per thread)


Ich verstehe (glaube ich) das die API Methoden in der Shader Klasse nicht erreichbar sind da sie nicht im OpenGL Thread laufen. Aber ich weiß nicht wie ich dafür sorgen kann das sie es werden, bzw. die Instanz in diesem Thread läuft/dazu gehört.

In Code sieht das ungefähr so aus (alles wäre zu lang):

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
37
38
39
40
41
42
43
44
// GLRenderer.java
public class GLRenderer implements GLSurfaceView.Renderer{
    private Shader m_shader;
    
    public GLRenderer(OpenGL activity){
        AssetManager res = activity.getAssets();
        
        // Shader
        try{
            m_shader = new Shader(res.open("shader.vsh"), res.open("shader.fsh"));
        }
        catch(Exception e){
            return; // Programm schließen
        }
    }

// Konstruktor in Shader.java
public Shader(InputStream vertex, InputStream fragment){
        int status[] = new int[1];
        
        m_vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
        m_fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
        
        if(createShader(m_vertexShader, vertex) || createShader(m_fragmentShader, fragment)){
            System.out.println("Shader could not be created!");
            
            return;
        }
        
        // Shader Programm erstellen
        m_program = GLES20.glCreateProgram();
        
        GLES20.glAttachShader(m_program, m_vertexShader);
        GLES20.glAttachShader(m_program, m_fragmentShader);     
        GLES20.glLinkProgram(m_program);
        
        GLES20.glGetProgramiv(m_program, GLES20.GL_LINK_STATUS, status, 0);
        
        if(status[0] == 0){
            GLES20.glDeleteProgram(m_program);
            
            System.out.println("Shader could not be created!");
        }
    }


Technisch ist (oder sollte) der Code fehlerfrei sein, das heißt ich schaffe es z.B. auch den Quellcode der Shader einzulesen und die App stürzt nicht ab. Trotzdem kann der Shader dann nicht compiliert werden.

Also: wie bekomme ich die Instanz der Shader Klasse in den OpenGL ES Thread in GLRenderer (der GLSurfaceView.Renderer implementiert)?

4

19.05.2012, 19:29

Hast du setEGLContextClientVersion mal aufgerufen?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

19.05.2012, 23:44

Jetzt ja, aber hat nicht geholfen.

Quellcode

1
2
3
4
5
m_context = new GLSurfaceView(this);
        m_context.setEGLContextClientVersion(2);
        m_context.setRenderer(new GLRenderer(this));
               
        setContentView(m_context);

6

20.05.2012, 01:01

Seltsam, so ein Problem hatte ich noch nie.
Unterstützt dein Phone denn OpenGLES 2?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

7

20.05.2012, 05:16

Ich denke mal setRenderer setzt den OpenGL Kontext. Dann greifst du im GLRenderer Konstruktor beim Erzeugen der Shader bereits auf OpenGL Funktionen zu, bevor der Kontext gesetzt ist. Die Funktion onSurfaceCreated() klingt eher nach dem passenden Ort für die Erzeugung der Shader etc.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

20.05.2012, 11:06

Ich habs in beiden Methoden getestet und ändert nichts.

Zitat

Unterstützt dein Phone denn OpenGLES 2?


Schon, aber ich teste das gerade Virtuell bis ich ein paar Sachen am laufen habe.

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

9

20.05.2012, 13:13

Schon, aber ich teste das gerade Virtuell bis ich ein paar Sachen am laufen habe.
Wenn ich mich nicht ganz grob täusche, dann kann der Emulator kein OpenGL ES 2.0. Evtl. kann es der für ICS, es ist eins der Features, die für den Emulator kommen sollen.

10

20.05.2012, 14:12

Also der Emulator kann mittlerweile sogar OpenGL ES 2.0. Allerdings es deinem Emulator explizit sagen.
Dieser Blog ist echt Gold wert, wenn es um OpenGL auf Android geht :P
Und hier steht auch etwas zu OpenGL ES 2 mit dem Emulator.

Werbeanzeige