OpenGLES 3.0着色器在Android设备上编译进出存储限定符的错误
问题描述:
因此,我正在更新我的应用程序以使用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;
}
有没有人看到这有什么问题?如果我分别更改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;
}
答
添加OpenGLES 3.0版本说明符着色器的启动:
#version 300 es
还要确保您所呼叫setEGLContextClientVersion(3)
在您的GLSurfaceView
设置代码中。
谢谢,但它会在该标题中引发“无效#version”错误。 – HPP
我在支持OpenGLES 3.1的Nexus 6上进行测试,并添加了我的EGL设置案例,在那里还有其他缺失的东西。 – HPP
哦,我错过了“#version 300 es”之后的换行符,即“#version 300 es \ n”。非常感谢! – HPP