Вот какая проблема. Есть такие шейдеры, которые я напишу ниже. Пока я знаю так как написано, и у меня множество вопросов возникает. 
Код
const char *vShaderstr = 
  "#version 300 es\n"
  "layout(location = 0) in vec4 a_color;\n"
  "layout(location = 1) in vec2 a_position;\n"
  "out vec4 v_color;\n"
  "void main()\n"
  "{\n"
  " v_color = a_color;\n"
  " gl_Position = a_position;\n"
  "}";
    const char *fShaderstr =
  "#version 300 es\n"
  "precision lowp float;\n"
  "in vec4 v_color;\n"
  "out vec4 o_fragColor;\n"
  "void main()\n"
  "{\n"
  " o_fragColor = v_color;\n"
  "}";
проблема в том, как я думаю, что vec4 это float. А мои данные такие.
Код
    glVertexAttribPointer ( 0, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, pixels );
    glVertexAttribPointer ( 1, 2, GL_INT, GL_FALSE, 0, vertices );
    glEnableVertexAttribArray ( 0 );
    glEnableVertexAttribArray ( 1 );
    glDrawArrays ( GL_POINTS, 0, max_draw );
по этому коду видно, что pixels состоит из байтов, четыре цвета на пиксель, то есть rgba, и координаты vertices, которые по x,y, то есть всего две координаты, и не float а int. Думаю в этом коде много проблем. Но как правильно надо?
Так как я разобрался с этим
Код
#if 0
    glVertexPointer ( 2, GL_INT, 0, vertices );
    glColorPointer ( 4, GL_UNSIGNED_BYTE, 0, pixels );
#endif
мне захотелось узнать больше, и попробывать с помощью шейдеров работать.