Compiling and Linking GLSL-ES Shaders from asset file
suggest changeThe Assets folder is the most common place to store your GLSL-ES shader files. To use them in your OpenGL ES application you need to load them to a string in the first place. This functions creates a string from the asset file:
private String loadStringFromAssetFile(Context myContext, String filePath){ StringBuilder shaderSource = new StringBuilder(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(myContext.getAssets().open(filePath))); String line; while((line = reader.readLine()) != null){ shaderSource.append(line).append("\n"); } reader.close(); return shaderSource.toString(); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "Could not load shader file"); return null; } }
Now you need to create a function that compiles a shader stored in a sting:
private int compileShader(int shader_type, String shaderString){ // This compiles the shader from the string int shader = glCreateShader(shader_type); glShaderSource(shader, shaderString); glCompileShader(shader); // This checks for for compilation errors int[] compiled = new int[1]; glGetShaderiv(shader, GL_COMPILE_STATUS, compiled, 0); if (compiled[0] == 0) { String log = glGetShaderInfoLog(shader); Log.e(TAG, "Shader compilation error: "); Log.e(TAG, log); } return shader; }
Now you can load, compile and link your shaders:
// Load shaders from file String vertexShaderString = loadStringFromAssetFile(context, "your_vertex_shader.glsl"); String fragmentShaderString = loadStringFromAssetFile(context, "your_fragment_shader.glsl"); // Compile shaders int vertexShader = compileShader(GL_VERTEX_SHADER, vertexShaderString); int fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentShaderString); // Link shaders and create shader program int shaderProgram = glCreateProgram(); glAttachShader(shaderProgram , vertexShader); glAttachShader(shaderProgram , fragmentShader); glLinkProgram(shaderProgram); // Check for linking errors: int linkStatus[] = new int[1]; glGetProgramiv(shaderProgram, GL_LINK_STATUS, linkStatus, 0); if (linkStatus[0] != GL_TRUE) { String log = glGetProgramInfoLog(shaderProgram); Log.e(TAG,"Could not link shader program: "); Log.e(TAG, log); }
If there are no errors, your shader program is ready to use:
glUseProgram(shaderProgram);
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents