2013-10-06 21 views
5

Mam inny błąd sterownika OpenGL ES. Tym razem próbuję skompilować następujące linie:OpenGL ulega awarii podczas łączenia programu, 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); 

.. 
.. 
} 

ale ja dostaję po linii:

GLES20.glLinkProgram(program); 

rodzimy katastrofy: „Fatal sygnału 11 (SIGDEV) na 0x00000060 (kod = 1), wątek 1231 " Zgaduję, że tak się dzieje, ponieważ LG nexus 4 używa GPU Adreno, a także zawiesza się dla mnie z kodem błędu 14 na innej awarii - używając zbyt wielu makr.

+0

Jeśli szukamy błędów w kodzie shadera, powinieneś dołączyć kod _complete_ shader. Brakuje wszystkich deklaracji zmiennych i zakładam, że zostawiłeś trochę rzeczy na końcu. Pomocny może być również kod aplikacji. –

+0

Prawdopodobnie twój kod shadera nie kompiluje się, a zatem twój program nie może się połączyć. Nawiasem mówiąc, OpenGL ES nie ma shaderów, więc nie ma tu znaczenia dodawanie tagu OpenGL ES. – eozgonul

+0

Proszę podać pełny kod modułu cieniującego. – keaukraine

Odpowiedz

2

Po kompilacji modułu cieniującego, użyj glGetShaderiv, aby uzyskać status kompilacji modułu cieniującego. Jak:

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

Następnie, jeśli zestawiane są zwracane jako zera, uzyskać długość informacji, a potem komunikat o błędzie w następujący sposób:

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

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

Sprawdź infoLog wreszcie zobaczyć komunikat o błędzie, który wrócił z kompilacja shaderów. Komunikat o błędzie segmentacji w oryginalnym wpisie nie daje niczego przydatnego do rozwiązania problemu.

+1

Nie mogę przejść do tego sprawdzenia, ponieważ otrzymuję tę awarię natywną podczas łączenia programu. Użyłem tych informacji dla innych problemów z linkowaniem, które nie były natywne. – Nativ

+1

Powinieneś kompilować swoje shadery przed połączeniem programu, więc powinieneś być w stanie uzyskać informacje. Możesz po prostu wydrukować informacje w dzienniku Androida. – eozgonul

1

Z tego krótkiego fragmentu kodu w module cieniującym fragmentu nie określono dokładności float. W ES 2.0 należy wyraźnie określić dokładność float.

precision mediump float; 

Przeczytaj o tym in specs, str. 4.5.3 Domyślne kwalifikatory precyzyjne. Moduł cieniowania może działać bez określania dokładności float dla niektórych sterowników OpenGL ES i może się nie skompilować na innych.

Jednak pełny kod źródłowy jest potrzebny, aby znaleźć dokładną przyczynę problemu.

Proponuję, aby rozpocząć komentowanie części kodu modułu cieniującego, dopóki nie zacznie poprawnie kompilować. W ten sposób zawęzimy problematyczny wiersz (myślę, że nawet szybciej niż czekanie na odpowiedź tutaj na SO).

+1

Witam, dodałem linie precyzji powyżej. to nie był problem. – Nativ

+0

Zachowaj spokój i komentuj linię po linii, aż znajdziesz przyczynę. – keaukraine