Guest User

Untitled

a guest
Jul 3rd, 2020
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.13 KB | None | 0 0
  1. // Fragment and vertex shaders code
  2. static const GLchar* pszFragShader = "\
  3.   precision mediump float;\
  4.   varying vec4 v_Color;\
  5.   void main (void)\
  6.   {\
  7.       gl_FragColor = v_Color;\
  8.   }";
  9.  
  10. static const GLchar* pszVertShader = "\
  11.   varying vec4  v_Color;\
  12.   attribute vec4  a_Color;\
  13.   attribute highp vec4  a_Position;\
  14.   void main(void)\
  15.   {\
  16.       v_Color = a_Color;\
  17.       gl_Position = a_Position;\
  18.   }";
  19.  
  20. GLint myglfwGetShaderProgram(const char *vertex_shader_source, const char *fragment_shader_source) {
  21.     enum Consts {INFOLOG_LEN = 512};
  22.     GLchar infoLog[INFOLOG_LEN];
  23.     GLint fragment_shader;
  24.     GLint success;
  25.     GLint vertex_shader;
  26.     const char *pvertex_shader = vertex_shader_source;
  27.     const char *pfragment_shader = fragment_shader_source;
  28.  
  29.     /* Vertex shader */
  30.     vertex_shader = glCreateShader(GL_VERTEX_SHADER);
  31.     glShaderSource(vertex_shader, 1, &pvertex_shader, NULL);
  32.     glCompileShader(vertex_shader);
  33.     glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
  34.     if (!success) {
  35.         glGetShaderInfoLog(vertex_shader, INFOLOG_LEN, NULL, infoLog);
  36.         printf("ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
  37.     }
  38.  
  39.     /* Fragment shader */
  40.     fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
  41.     glShaderSource(fragment_shader, 1, &pfragment_shader, NULL);
  42.     glCompileShader(fragment_shader);
  43.     glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
  44.     if (!success) {
  45.         glGetShaderInfoLog(fragment_shader, INFOLOG_LEN, NULL, infoLog);
  46.         printf("ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
  47.     }
  48.  
  49.     /* Link shaders */
  50.     shader_program = glCreateProgram();
  51.     glAttachShader(shader_program, vertex_shader);
  52.     glAttachShader(shader_program, fragment_shader);
  53.     glBindAttribLocation(shader_program, VERTEX_POS_INDX, "a_Position");
  54.     glBindAttribLocation(shader_program, COLOR_POS_INDX, "a_Color");
  55.     glLinkProgram(shader_program);
  56.     glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
  57.     if (!success) {
  58.         glGetProgramInfoLog(shader_program, INFOLOG_LEN, NULL, infoLog);
  59.         printf("ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
  60.     }
  61.  
  62.     glEnableVertexAttribArray(VERTEX_POS_INDX);
  63.     glEnableVertexAttribArray(COLOR_POS_INDX);
  64.  
  65.     glUseProgram(shader_program);
  66.  
  67.     glGenBuffers(1, &vbo_vertex);
  68.     glGenBuffers(1, &vbo_color);
  69.  
  70.     glDeleteShader(vertex_shader);
  71.     glDeleteShader(fragment_shader);
  72.     return shader_program;
  73. }
  74.  
  75. void DrawArrays(GLenum mode, GLint first, GLsizei count) {
  76.  
  77.     int vertexLocation = glGetAttribLocation(shader_program, "a_Position");
  78.     int colorLocation = glGetAttribLocation(shader_program, "a_Color");
  79.  
  80.     glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex);
  81.     glBufferData(GL_ARRAY_BUFFER, (count + first) *
  82.             (sizeof(GLfloat) * 3), vertices, GL_STATIC_DRAW);
  83.     glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
  84.  
  85.     glBindBuffer(GL_ARRAY_BUFFER, vbo_color);
  86.     glBufferData(GL_ARRAY_BUFFER, (count + first) *
  87.             (sizeof(GLfloat) * 4), colors, GL_STATIC_DRAW);
  88.     glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
  89.  
  90.     glDrawArrays(mode, first, count);
  91.  
  92.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  93. }
Add Comment
Please, Sign In to add comment