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)?