2013-10-06 17 views
5

Sto riscontrando un altro errore del driver OpenGL ES. Questa volta sto cercando di compilare le seguenti righe:OpenGL si blocca quando si collega il programma, 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); 

.. 
.. 
} 

ma sto ottenendo dopo la riga:

GLES20.glLinkProgram(program); 

incidente origini: "Segnale di Fatal 11 (SIGDEV) a 0x00000060 (codice = 1), thread 1231 " Immagino che ciò accada perché LG nexus 4 usa GPU Adreno, e si blocca anche per me con il codice di errore 14 su un crash diverso - usando troppi macro.

+0

Se stiamo cercando errori nel codice dello shader, dovresti includere il codice shader _complete_. Mancano tutte le dichiarazioni delle variabili, e presumo che tu abbia lasciato qualcosa alla fine. Potrebbe essere utile anche qualche codice di applicazione. –

+0

Probabilmente il tuo codice shader non sta compilando, e quindi il tuo programma non riesce a collegarsi. A proposito, OpenGL ES non ha shader, quindi è irrilevante aggiungere il tag OpenGL ES qui. – eozgonul

+0

Fornire il codice completo dello shader. – keaukraine

risposta

2

Dopo aver compilato lo shader, utilizzando glGetShaderiv ottenere lo stato della compilazione dello shader. Come:

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

Quindi, se compilato viene restituito come zero, ottenere la lunghezza informazioni prima, e poi il messaggio di errore come segue:

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

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

Controllare infoLog finalmente a vedere il messaggio di errore restituito dal compilation shader. Il messaggio di errore di segmentazione nel tuo post originale non fornisce nulla di utile per risolvere il problema.

+1

Non riesco a ottenere questo controllo dal momento che sto ottenendo questo arresto nativo durante il collegamento del programma. Ho usato le informazioni per altri problemi di collegamento che non erano nativi anche se – Nativ

+1

Dovresti compilare gli shader prima di collegare il programma in modo da poter ottenere le informazioni. Puoi solo stampare le informazioni sul registro di Android. – eozgonul

1

Per quanto posso vedere dal codice breve estratto nel frammento di shader non è stata specificata la precisione float. In ES 2.0 è necessario specificare esplicitamente la precisione float.

precision mediump float; 

Si prega di leggere su questo in specs, p. 4.5.3 Qualificatori di precisione predefiniti. Lo shader può funzionare senza specificare la precisione float su determinati driver OpenGL ES e potrebbe non riuscire a compilarli su altri.

Tuttavia, è necessario il codice sorgente completo per scoprire la causa esatta del problema.

Ti suggerisco di iniziare a commentare le parti del codice dello shader finché non inizia a compilare correttamente. In questo modo si restringe una linea problematica (credo ancora più veloce di aspettare la risposta qui su SO).

+1

ciao, ho aggiunto le linee di precisione sopra. non era il problema – Nativ

+0

Mantieni la calma e commenta riga per riga finché non trovi la causa. – keaukraine