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