in PlayAssetDelivery/NativeSample/Teapot/src/main/cpp/TeapotRenderer.cpp [191:265]
bool TeapotRenderer::LoadShaders(SHADER_PARAMS *params, const char *strVsh,
const char *strFsh) {
GLuint program;
GLuint vert_shader, frag_shader;
// Create shader program
program = glCreateProgram();
LOGI("Created Shader %d", program);
// Create and compile vertex shader
if (!ndk_helper::shader::CompileShader(&vert_shader, GL_VERTEX_SHADER,
strVsh)) {
LOGI("Failed to compile vertex shader");
glDeleteProgram(program);
assert(false);
return false;
}
// Create and compile fragment shader
if (!ndk_helper::shader::CompileShader(&frag_shader, GL_FRAGMENT_SHADER,
strFsh)) {
LOGI("Failed to compile fragment shader");
glDeleteProgram(program);
assert(false);
return false;
}
// Attach vertex shader to program
glAttachShader(program, vert_shader);
// Attach fragment shader to program
glAttachShader(program, frag_shader);
// Bind attribute locations
// this needs to be done prior to linking
glBindAttribLocation(program, ATTRIB_VERTEX, "myVertex");
glBindAttribLocation(program, ATTRIB_NORMAL, "myNormal");
glBindAttribLocation(program, ATTRIB_UV, "myUV");
// Link program
if (!ndk_helper::shader::LinkProgram(program)) {
LOGI("Failed to link program: %d", program);
if (vert_shader) {
glDeleteShader(vert_shader);
vert_shader = 0;
}
if (frag_shader) {
glDeleteShader(frag_shader);
frag_shader = 0;
}
if (program) {
glDeleteProgram(program);
}
return false;
}
// Get uniform locations
params->matrix_projection_ = glGetUniformLocation(program, "uPMatrix");
params->matrix_view_ = glGetUniformLocation(program, "uMVMatrix");
params->light0_ = glGetUniformLocation(program, "vLight0");
params->material_diffuse_ = glGetUniformLocation(program, "vMaterialDiffuse");
params->material_ambient_ = glGetUniformLocation(program, "vMaterialAmbient");
params->material_specular_ =
glGetUniformLocation(program, "vMaterialSpecular");
// Release vertex and fragment shaders
if (vert_shader) glDeleteShader(vert_shader);
if (frag_shader) glDeleteShader(frag_shader);
params->program_ = program;
return true;
}