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.
		
		
		
		
			
				
					64 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					64 lines
				
				1.6 KiB
			| 
											5 years ago
										 | #include <stdlib.h>
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <assert.h>
 | ||
|  | #include <string>
 | ||
|  | 
 | ||
|  | #include "glutil.h"
 | ||
|  | 
 | ||
|  | static GLuint load_shader(GLenum shaderType, const char *src) {
 | ||
|  |   GLint status = 0, len = 0;
 | ||
|  |   GLuint shader = glCreateShader(shaderType);
 | ||
|  |   assert(shader != 0);
 | ||
|  | 
 | ||
|  |   glShaderSource(shader, 1, &src, NULL);
 | ||
|  |   glCompileShader(shader);
 | ||
|  |   glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
 | ||
|  |   if (!status) {
 | ||
|  |     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
 | ||
|  |     if (len) {
 | ||
|  |       std::string msg(len, '\0');
 | ||
|  |       glGetShaderInfoLog(shader, len, NULL, msg.data());
 | ||
|  |       fprintf(stderr, "error compiling shader:\n%s\n", msg.c_str());
 | ||
|  |     }
 | ||
|  |     assert(0);
 | ||
|  |   }
 | ||
|  |   return shader;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | GLShader::GLShader(const char *vert_src, const char *frag_src) {
 | ||
|  |   GLint status = 0, len = 0;
 | ||
|  |   prog = glCreateProgram();
 | ||
|  |   assert(prog != 0);
 | ||
|  | 
 | ||
|  |   vert = load_shader(GL_VERTEX_SHADER, vert_src);
 | ||
|  |   frag = load_shader(GL_FRAGMENT_SHADER, frag_src);
 | ||
|  |   glAttachShader(prog, vert);
 | ||
|  |   glAttachShader(prog, frag);
 | ||
|  |   glLinkProgram(prog);
 | ||
|  | 
 | ||
|  |   glGetProgramiv(prog, GL_LINK_STATUS, &status);
 | ||
|  |   if (!status) {
 | ||
|  |     glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len);
 | ||
|  |     if (len) {
 | ||
|  |       std::string msg(len, '\0');
 | ||
|  |       glGetProgramInfoLog(prog, len, NULL, msg.data());
 | ||
|  |       fprintf(stderr, "error linking program:\n%s\n", msg.c_str());
 | ||
|  |     }
 | ||
|  |     assert(0);
 | ||
|  |   }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | GLShader::~GLShader() {
 | ||
|  |   glDeleteProgram(prog);
 | ||
|  |   glDeleteShader(frag);
 | ||
|  |   glDeleteShader(vert);
 | ||
|  | }
 | ||
|  | 
 | ||
|  | GLuint GLShader::getUniformLocation(const char *name) {
 | ||
|  |   auto it = uniform_loc_map.find(name);
 | ||
|  |   if (it == uniform_loc_map.end()) {
 | ||
|  |     it = uniform_loc_map.insert(it, {name, glGetUniformLocation(prog, name)});
 | ||
|  |   }
 | ||
|  |   return it->second;
 | ||
|  | }
 |