Первый код- код фрагментного шейдера. Его суть- вернуть цвет пикселя (gl_FragColor).
Этот цвет ты берешь из юниформа u_Color, тоесть, все, что отрисует OpenGL будет цвета u_Color.
uColor = glGetUniformLocation(programId, "u_Color"); //просто ссылка на сам юниформ в шейдере( чтобы знать, куда отправлять цвет)
glVertexAttribPointer(aColorLocation, 3, GL_FLOAT, false, 20, vertexData);//тут подключаешь данные из буфера к атрибуту шейдера- указываешь, где брать данные
glEnableVertexAttribArray(aColorLocation); // включаешь атрибут
vertexDate.position(2); //непонятно что :)
Короче, ты подключаешь буффер vertexData к aColorLocation, но на цвет пикселя эти данные никак не влияют