Create an Android Program

Creating and linking a program follows the same steps across multiple flavors of OpenGL.

107     protected int createProgram(int vertexShader, int fragmentShader)
108     {
109         String    loaderLog;
110         IntBuffer logStatus;
111         int       program;
112 
113         program = GLES20.glCreateProgram();
114 
115         GLES20.glAttachShader(program, vertexShader);
116 
117         // Bind the fragment shader to the program.
118         GLES20.glAttachShader(program, fragmentShader);
119 
120         GLES20.glLinkProgram(program);
121 
122         // Get the link status.
123         final int[] linkStatus = new int[1];
124         GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
125 
126         // If the link failed, delete the program.
127         if (linkStatus[0] == 0)
128         {
129             logStatus     = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer();
130             GLES20.glGetProgramiv(program, GLES20.GL_INFO_LOG_LENGTH, logStatus);
131             if (logStatus.get(0) > 0)
132             {
133                 loaderLog = GLES20.glGetProgramInfoLog(program);
134                 Log.d(appName, "Program linking failed with, " + loaderLog);
135             }
136             else
137             {
138                 // Workaround for issue 9953, where GL_INFO_LOG_LENGTH is zero.
139                 Log.d(appName, "Program linking failed for an unknown reason.");
140             }
141             GLES20.glDeleteProgram(program);
142             program = 0;
143         }
144 
145         GLES20.glUseProgram(program);
146 
147         return program;
148     }

Notes

Linking a program is expensive so it is in a separate routine, which is invoked once before rendering any frames.

A more complex scenario may require multiple programs, with different inputs and shaders, which can be made active with glUseProgram for the appropriate program.