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.
		
		
		
		
			
				
					72 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					72 lines
				
				1.6 KiB
			| 
								 
											9 years ago
										 
									 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <GLES3/gl3.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;
							 | 
						||
| 
								 | 
							
								}
							 |