2013-10-06 8 views
5

Ich habe einen anderen OpenGL ES Treiberfehler. Diesmal versuche ich die folgenden Zeilen zu kompilieren:OpenGL stürzt beim Verknüpfen von Programm ab, LG Nexus 4

precision mediump float; 
varying highp vec2 textureCoordinate; 


void main() { 
highp vec4 color = texture2D(input0, textureCoordinate); 


vec3 color3 = color.rgb; 

vec2 tc = (2.0 * textureCoordinate) - 1.0; 
float d = dot(tc, tc); 
vec2 lookup = vec2(d, color3.r); 

.. 
.. 
} 

aber ich bin immer nach der Zeile:

GLES20.glLinkProgram(program); 

nativen Absturz: „Fatal Signal 11 (SIGDEV) bei 0x00000060 (code = 1), Thread 1231 " Ich vermute, dass es passiert, weil LG Nexus 4 GPU Adreno verwendet, und es stürzt auch für mich mit Fehlercode 14 auf einem anderen Absturz - mit zu vielen Makros.

+0

Wenn wir nach Fehlern in Ihrem Shader-Code suchen, sollten Sie _complete_ shader code einschließen. Da fehlen alle Variablendeklarationen, und ich gehe davon aus, dass Sie am Ende einige Sachen hinterlassen haben. Auch ein Anwendungscode könnte hilfreich sein. –

+0

Möglicherweise wird Ihr Shader-Code nicht kompiliert, und daher kann Ihr Programm keine Verbindung herstellen. Übrigens, OpenGL ES hat keine Shader, daher ist es irrelevant, OpenGL ES-Tags hier hinzuzufügen. – eozgonul

+0

Bitte geben Sie den vollständigen Shader-Code an. – keaukraine

Antwort

2

Nachdem Sie den Shader kompiliert haben, erhalten Sie mit glGetShaderiv den Status der Shader-Kompilierung. Wie:

GLint compiled; 
glGetShaderiv(index, GL_COMPILE_STATUS, &compiled); //index is the shader value 

Wenn dann als Null kompiliert zurückgegeben wird, erhalten die Info Länge zuerst, und dann die Fehlermeldung wie folgt:

GLint infoLen = 0; 
glGetShaderiv(index, GL_INFO_LOG_LENGTH, &infoLen); 

if(infoLen > 1) 
{ 
    char* infoLog = new char(infoLen); 
    glGetShaderInfoLog(index, infoLen, NULL, infoLog); 
} 

prüfen infoLog schließlich die Fehlermeldung zu sehen, die zurückgegeben von Shader-Kompilierung. Segmentierungsfehlernachricht in Ihrem ursprünglichen Post gibt nichts nützlich, um das Problem zu beheben.

+1

Ich kann nicht zu dieser Überprüfung kommen, da ich diesen systemeigenen Absturz beim Verknüpfen des Programms bekomme. Ich benutzte die Info für einige andere Verbindungsprobleme, die nicht nativ waren, obwohl – Nativ

+1

Sie sollten Ihre Shader vor dem Verknüpfen des Programms kompilieren, damit Sie in der Lage sein sollten, die Informationen zu erhalten. Sie können die Informationen nur auf Android-Log drucken. – eozgonul

1

Soweit ich aus Ihrem Kurzcode-Auszug in Ihrem Fragment-Shader sehen kann, haben Sie float Präzision nicht angegeben. In ES 2.0 müssen Sie explizit float Präzision angeben.

precision mediump float; 

Bitte lesen Sie über diese in specs, p. 4.5.3 Standard-Präzisions-Qualifier. Shader funktioniert möglicherweise ohne Angabe der Genauigkeit float auf bestimmte OpenGL ES-Treiber und möglicherweise nicht auf anderen OpenGL ES-Treiber kompilieren.

Der vollständige Quellcode wird jedoch benötigt, um die genaue Ursache Ihres Problems zu ermitteln.

Ich würde vorschlagen, dass Sie Teile des Shader-Codes auskommentieren, bis es richtig kompiliert. Auf diese Weise werden Sie eine problematische Linie eingrenzen (ich glaube sogar schneller als auf Antwort hier auf SO zu warten).

+1

Hallo, ich habe die Präzisionslinien oben hinzugefügt. Es war nicht das Problem – Nativ

+0

Bleiben Sie ruhig und kommentieren Sie Zeile für Zeile, bis Sie die Ursache gefunden haben. – keaukraine