Ja eksperymentuje z OpenGL ES 3.0 i znaleźć następujące oświadczenie w Szybkim arkusza referencyjnego:Jak zadeklarować wersję OpenGL w modułach cieniowania na systemie Android?
„#version 300 es” musi pojawić się w pierwszej linii programu shaderów GLSL napisany w wersji 3.00 ES . Jeśli zostanie pominięty, moduł cieniujący będzie traktowany jako wersja kierowania 1.00.
Więc starałem się dodać to na początku moich shaderów, ale to tylko spowodowało błędu
link powiodła się z powodu nieprawidłowej vertex shader.
zgłoszona przez .glGetProgramInfoLog
. Jeśli usuniemy pierwszą linię za pomocą instrukcji "#version 300 gl", moduł cieniujący będzie kompilował i działał.
Jest to kod mojego vertex shader
private final String vertexShaderCode =
"#version 300 es \n" +
"uniform mat4 uMVPMatrix; \n" +
"attribute vec2 a_TexCoordinate; \n" +
"attribute vec4 vPosition; \n" +
"varying vec2 v_TexCoordinate; \n" +
"void main() { \n" +
" v_TexCoordinate = a_TexCoordinate; \n" +
" gl_Position = uMVPMatrix * vPosition; \n" +
"} \n";
Dodałem też oświadczenie wersji do vertex shader oraz fragmentu, i wciąż ten sam błąd.
Zadzwoniłem pod numer setEGLContextClientVersion(3)
w moim interfejsie GLSurfaceView i dodałem <uses-feature android:glEsVersion="0x00030000" android:required="true" />
do mojego manifestu, aby wskazać, że aplikacja wymaga OpenGL ES 3.0.
Czy czytam dokumentację OpenGL ES i nie muszę dodawać tej instrukcji wersji? Jeśli muszę go dodać, co robię źle, zawsze powoduje błąd?
Przydatna wskazówka: użyj narzędzia glGetShaderInfoLog, aby uzyskać bardziej szczegółowe błędy kompilacji modułów cieniujących. –