2015-06-27 21 views
1

因此,我正在更新我的应用程序以使用OpenGLES 3.0来利用转换反馈,但着色器未编译。OpenGLES 3.0着色器在Android设备上编译进出存储限定符的错误

错误:

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; 
} 

有没有人看到这有什么问题?如果我分别更改inoutattributevarying它不会引发错误,但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; 
} 

回答

1

添加OpenGLES 3.0版本说明符着色器的启动:

#version 300 es 

还要确保您所呼叫setEGLContextClientVersion(3)在您的GLSurfaceView设置代码中。

+0

谢谢,但它会在该标题中引发“无效#version”错误。 – HPP

+0

我在支持OpenGLES 3.1的Nexus 6上进行测试,并添加了我的EGL设置案例,在那里还有其他缺失的东西。 – HPP

+0

哦,我错过了“#version 300 es”之后的换行符,即“#version 300 es \ n”。非常感谢! – HPP