You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							69 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
	
	
							69 lines
						
					
					
						
							1.5 KiB
						
					
					
				#include <stdlib.h>
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
#include "glutil.h"
 | 
						|
 | 
						|
GLuint load_shader(GLenum shaderType, const char *src) {
 | 
						|
  GLint status = 0, len = 0;
 | 
						|
  GLuint shader;
 | 
						|
 | 
						|
  if (!(shader = glCreateShader(shaderType)))
 | 
						|
    return 0;
 | 
						|
 | 
						|
  glShaderSource(shader, 1, &src, NULL);
 | 
						|
  glCompileShader(shader);
 | 
						|
  glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
 | 
						|
 | 
						|
  if (status)
 | 
						|
    return shader;
 | 
						|
 | 
						|
  glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
 | 
						|
  if (len) {
 | 
						|
    char *msg = (char*)malloc(len);
 | 
						|
    if (msg) {
 | 
						|
      glGetShaderInfoLog(shader, len, NULL, msg);
 | 
						|
      msg[len-1] = 0;
 | 
						|
      fprintf(stderr, "error compiling shader:\n%s\n", msg);
 | 
						|
      free(msg);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  glDeleteShader(shader);
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
GLuint load_program(const char *vert_src, const char *frag_src) {
 | 
						|
  GLuint vert, frag, prog;
 | 
						|
  GLint status = 0, len = 0;
 | 
						|
 | 
						|
  if (!(vert = load_shader(GL_VERTEX_SHADER, vert_src)))
 | 
						|
    return 0;
 | 
						|
  if (!(frag = load_shader(GL_FRAGMENT_SHADER, frag_src)))
 | 
						|
    goto fail_frag;
 | 
						|
  if (!(prog = glCreateProgram()))
 | 
						|
    goto fail_prog;
 | 
						|
 | 
						|
  glAttachShader(prog, vert);
 | 
						|
  glAttachShader(prog, frag);
 | 
						|
  glLinkProgram(prog);
 | 
						|
 | 
						|
  glGetProgramiv(prog, GL_LINK_STATUS, &status);
 | 
						|
  if (status)
 | 
						|
    return prog;
 | 
						|
 | 
						|
  glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len);
 | 
						|
  if (len) {
 | 
						|
    char *buf = (char*) malloc(len);
 | 
						|
    if (buf) {
 | 
						|
      glGetProgramInfoLog(prog, len, NULL, buf);
 | 
						|
      buf[len-1] = 0;
 | 
						|
      fprintf(stderr, "error linking program:\n%s\n", buf);
 | 
						|
      free(buf);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  glDeleteProgram(prog);
 | 
						|
fail_prog:
 | 
						|
  glDeleteShader(frag);
 | 
						|
fail_frag:
 | 
						|
  glDeleteShader(vert);
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 |