Ошибка компиляции шейдера OpenGLES 3.0 на устройстве Android для квалификаторов входящего и исходящего хранилища

Поэтому я обновляю свое приложение, чтобы использовать OpenGLES 3.0, чтобы воспользоваться обратной связью преобразования, но шейдер не компилируется.

ошибка:

06-27 17:29:43.299  18593-18627/com.harmonicprocesses.penelopefree E/MyGLRenderer﹕ Could not compile shader 35633:
06-27 17:29:43.299  18593-18627/com.harmonicprocesses.penelopefree E/MyGLRenderer﹕ ERROR: 0:1: 'in' : Syntax error:  syntax error
INTERNAL ERROR: no main() function!
ERROR: 1 compilation errors.  No code generated.

Вот код вершинного шейдера:

    private final String vertexShaderSrc =
        "in float inValue;" +
        "out float outValue;" +

        "void main() {" +
        "    outValue = sqrt(inValue);" +
        "}";

Вот код компиляции:

        int vertexShader = MyGLRenderer.loadShader(GLES30.GL_VERTEX_SHADER,
            vertexShaderSrc);

...

    public static int loadShader(int shaderType, String source) {
    int shader = GLES30.glCreateShader(shaderType);
    if (shader != 0) {
        GLES30.glShaderSource(shader, source);
        GLES30.glCompileShader(shader);
        int[] compiled = new int[1];
        GLES30.glGetShaderiv(shader, GLES30.GL_COMPILE_STATUS, compiled, 0);
        if (compiled[0] == 0) {
            Log.e(TAG, "Could not compile shader " + shaderType + ":");
            Log.e(TAG, GLES30.glGetShaderInfoLog(shader));
            GLES30.glDeleteShader(shader);
            shader = 0;
        }
    }
    return shader;
}

Кто-нибудь видит в этом что-то плохое? Если я изменяю in и out на attribute varying соответственно, это не выдает ошибку, но glUseProgram выдает ошибку gl 1282 «Недопустимая операция».

Вот как я настроил GL для es версии 3.0:

public MyGLSurfaceViewLegacy(Context context) {
    super(context);
    setListenForTouchOnTouchListener();
    NoteSpectrum = DSPEngine.staticCalcNoteBins(AudioConstants.defaultBufferSize*2, 
            AudioConstants.sampleRate);
    // Create an OpenGL ES 2.0 context.
    setEGLContextClientVersion(3);
    // Set the Renderer for drawing on the GLSurfaceView
    mRenderer = new MyGLRenderer(context,this);
    setEGLConfigChooser(8, 8, 8, 8, 16, 0);
    mContextFactory = new MyContextFactory();
    setEGLContextFactory(mContextFactory);
    //mEGLWindowSurfaceFactory = new MyEGLWindowSurfaceFactory();
    //setEGLWindowSurfaceFactory(mEGLWindowSurfaceFactory);
    setRenderer(mRenderer);
    getHolder().setFormat(PixelFormat.TRANSLUCENT);

    // Render the view only when there is a change in the drawing data
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);



    mContext = context;


    drawOverlay = PreferenceManager.getDefaultSharedPreferences(mContext)
            .getBoolean("turn_on_visualization_key",true);
}


class MyContextFactory implements EGLContextFactory {
private int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
private EGLContext mEGLContext;
private EGLDisplay mEGLDisplay;
private MyGLSurfaceView mMyGLSurfaceView;
private EGL10 mEGL;

@Override
public EGLContext createContext(EGL10 egl, EGLDisplay display,
        EGLConfig eglConfig) {
    int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 3,
            EGL10.EGL_NONE };
    mEGL = egl;
    mEGLContext = egl.eglGetCurrentContext();
    mEGLDisplay = display;
    mEGLContext = egl.eglCreateContext(display, eglConfig, 
            egl.eglGetCurrentContext(), attrib_list);
    return mEGLContext;
}

person HPP    schedule 27.06.2015    source источник


Ответы (1)


Добавьте спецификатор версии OpenGLES 3.0 в начало вашего шейдера:

#version 300 es

Также убедитесь, что вы вызываете setEGLContextClientVersion(3) в коде установки GLSurfaceView.

person samgak    schedule 28.06.2015
comment
Спасибо, но он выдает ошибку Invalid #version с этим заголовком. - person HPP; 28.06.2015
comment
Я тестирую Nexus 6, который поддерживает OpenGLES 3.1, и я добавил свой случай установки EGL, там чего-то еще не хватает. - person HPP; 28.06.2015
comment
ох, я пропустил разрыв строки после #version 300 es, т.е. #version 300 es\n. Спасибо много! - person HPP; 28.06.2015