2016-07-13 26 views
0

Ich versuche, ein einfaches Android-Spiel mit OpenGL zu machen und es lief ziemlich reibungslos bis vor kurzem. Ich konnte die Anwendung auf einem s7 und einem Nexus 5 Emulator erstellen und ausführen, aber meine Versuche, es auf meinem s6 auszuführen, scheitern.S6 Android OpenGL Compilation schlägt fehl beim Erstellen Shader

Es schien, dass der Shader nicht kompilieren konnte. Ich bin mir nicht sicher, was dieses Problem verursacht. Ich habe über viele kleine Dinge nachgedacht und gebastelt, aber ohne Glück. Ich denke, ich muss etwas Offensichtliches vermissen. Ich habe andere Antworten gelesen, aber sie scheinen nicht auf ein Spiel anzuwenden, das bereits auf anderen Geräten funktioniert. Unten finden Sie meinen Shader-Code und die einfachen OpenGL-Funktionen.

public Shader(String data, int kind) throws IllegalArgumentException { 
    this.kind = kind; 
    shader = GLES20.glCreateShader(kind); 
    GLES20.glShaderSource(shader, data); 
    GLES20.glCompileShader(shader); 

    int[] compiled = new int[1]; 
    GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); 
    if (compiled[0] == GLES20.GL_FALSE) { 
     String log = GLES20.glGetShaderInfoLog(shader); 
     dispose(); 
     throw new IllegalArgumentException("Shader compilation error: " + log); 
    } 
} 

Und hier sind die OpenGL-Funktionen für die Schattierung.

public static final String VERT_SHADER = 
    "#version 100\n" + 

    "uniform float surfaceRatio;\n" + 
    "attribute vec2 position;\n" + 

    "void main() {\n" + 
    " gl_Position = vec4(position.x * surfaceRatio, position.y, 0.0f, 1.0f);\n" + 
    "}\n"; 

// The fragment shader code. 
public static final String FRAG_SHADER = 
    "#version 100\n" + 

    "uniform vec3 color;\n" + 

    "void main() {\n" + 
    " gl_FragColor = vec4(color, 1.0f);\n" + 
    "}\n"; 

Lassen Sie mich wissen, ob etwas offensichtlich ist, das ich vermisse, das diese plattformübergreifenden Probleme verursachen würde. Ich kann bei Bedarf mehr Code oder Informationen bereitstellen.

Antwort

0

Ihre Gleitkomma-Konstantensyntax ist in GLSL ES 1.00 ungültig. Das Postfix f ist nicht Teil der zulässigen Syntax. Also überall, wo Sie 0.0f im Shader-Code haben, müssen Sie es durch 0.0 ersetzen, wo Sie haben 1.0f muss es 1.0 sein, und so weiter.

GLSL-Compiler von einigen Herstellern (die unbenannt bleiben sollen) neigen dazu, relativ nachsichtig zu sein, und kompilieren Shader mit diesen Arten von Fehlern ohne irgendwelche Beschwerden. Compiler von anderen Herstellern sind strikter bei der Meldung von Fehlern für nicht-konformen Code, so wie sie es sollten.

Der Postfix f ist in GLSL ES 3.00 und höher zulässig.

Es ist wichtig, dass zum Beispiel verstehen 1.0 eine Konstante vom Typ float in GLSL, anders als in C/C++, wo es eine Konstante vom Typ double. Während spätere GLSL-Versionen das Postfix f erlauben, hat es absolut keine Funktion, da es den Typ der Konstante nicht ändert.

Keine Version von GLSL ES (bis zu den aktuellen 3.2) unterstützt doppelte Werte. Nur volles OpenGL 4.x unterstützt doppelte Genauigkeit in Shadern. In OpenGL 4.x wird ein Postfix von lf oder LF für Konstanten vom Typ double benötigt. Konstanten ohne Postfix sind immer noch vom Typ float.

+0

Ich versuchte dies früher und der Fehler drehte sich dann um die Farbvariable im Shader. Gibt es dort auch Potenzial für ein Problem? Ich kann den spezifischen Fehlertext später zur Verfügung stellen. Ich bin momentan von meinem Terminal entfernt. Danke für Ihre Hilfe. Das war super informativ. – Runner5