Пример #1
0
GLuint Shader_Loader::CreateShader(GLenum shaderType, std::string
	source, char* shaderName){

	int compile_result = 0;

	GLuint shader = glCreateShader(shaderType);
	const char *shader_code_ptr = source.c_str();
	const int shader_code_size = source.size();

	glShaderSource(shader, 1, &shader_code_ptr, &shader_code_size);
	glCompileShader(shader);
	glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_result);

	//check for errors
	if (compile_result == GL_FALSE){

		int info_log_length = 0;
		glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length);
		std::vector<char> shader_log(info_log_length);
		glGetShaderInfoLog(shader, info_log_length, NULL, &shader_log[0]);
		std::cout << "ERROR compiling shader: " << shaderName << std::endl << &shader_log[0] << std::endl;
		return 0;
	}
	return shader;
}
	//creaza un obiect de tip shader
	unsigned int _createShader(const std::string &shader_file, GLenum shader_type){
		//incarca fisierul intr-un string
		std::string shader_code;
		std::ifstream file(shader_file.c_str(), std::ios::in);
		if(!file.good()){
			std::cout<<"Shader Loader: Nu am gasit fisierul shader "<<shader_file<<" sau nu am drepturile sa il deschid!"<<std::endl;
			std::terminate();
		}
		file.seekg(0, std::ios::end);
		shader_code.resize((unsigned int)file.tellg());
		file.seekg(0, std::ios::beg);
		file.read(&shader_code[0], shader_code.size());
		file.close();

		int info_log_length=0,compile_result=0;
		unsigned int gl_shader_object;
			
		//construieste un obiect de tip shader din codul incarcat
		gl_shader_object = glCreateShader(shader_type);				
		const char *shader_code_ptr = shader_code.c_str();
		const int shader_code_size = shader_code.size();
		glShaderSource(gl_shader_object,1,&shader_code_ptr,&shader_code_size);	
		glCompileShader(gl_shader_object);
		glGetShaderiv(gl_shader_object, GL_COMPILE_STATUS, &compile_result);					
			
		//daca exista erori output la consola
		if(compile_result == GL_FALSE){
			std::string str_shader_type="";
			if(shader_type == GL_VERTEX_SHADER) str_shader_type="vertex shader";
			if(shader_type == GL_TESS_CONTROL_SHADER) str_shader_type="tess control shader";
			if(shader_type == GL_TESS_EVALUATION_SHADER) str_shader_type="tess evaluation shader";
			if(shader_type == GL_GEOMETRY_SHADER) str_shader_type="geometry shader";
			if(shader_type == GL_FRAGMENT_SHADER) str_shader_type="fragment shader";
			if(shader_type == GL_COMPUTE_SHADER) str_shader_type="compute shader";

			glGetShaderiv(gl_shader_object, GL_INFO_LOG_LENGTH, &info_log_length);		
			std::vector<char> shader_log(info_log_length);
			glGetShaderInfoLog(gl_shader_object, info_log_length, NULL, &shader_log[0]);	
			std::cout<<"Shader Loader: EROARE DE COMPILARE pentru "<<str_shader_type<<std::endl<<&shader_log[0]<<std::endl;
			return 0;
		}

		return gl_shader_object;
	}
Пример #3
0
/**
 * Compiles and links a new shader program.
 *
 * @param s					The shader struct to store into.
 * @param vert_src			Vertex shader source.
 * @param frag_src			Fragment shader source.
 */
int shader_init(struct shader *s,
		char *vert_src, int vert_src_len,
		char *frag_src, int frag_src_len)
{
	int ret = 0;

	/* Make sure struct is up-to-date. */
	s->vert_src = vert_src;
	s->vert_src_len = vert_src_len;
	s->frag_src = frag_src;
	s->frag_src_len = frag_src_len;

	/* FIXME: make sure string ends with \0. */
	vert_src[vert_src_len-1] = '\0';
	frag_src[frag_src_len-1] = '\0';

	/* Compile vertex shader. */
	GLuint vs = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vs, 1, &vert_src, NULL);
	glCompileShader(vs);
	ret = shader_log(vs, "vertex shader");

	if(ret != SHADER_OK) {
		return ret;
	}

	/* Compile fragment shader. */
	GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(fs, 1, &frag_src, NULL);
	glCompileShader(fs);
	ret = shader_log(fs, "fragment shader");

	if(ret != SHADER_OK) {
		return ret;
	}

	/* Compile shader. */
	s->program = glCreateProgram();
	glAttachShader(s->program, fs);
	glAttachShader(s->program, vs);
	glLinkProgram(s->program);
	glDeleteShader(vs);
	glDeleteShader(fs);
	ret = shader_program_log(s->program, "program");

	if(ret != SHADER_OK) {
		return ret;
	}

	/* Position stream. */
	GLint posAttrib = glGetAttribLocation(s->program, ATTRIB_NAME_POSITION);
	shader_debug("attrib: %s=%d\n", ATTRIB_NAME_POSITION, posAttrib);
	glEnableVertexAttribArray(posAttrib);
	glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0);

	/* Texcoord stream. */
	GLint texcoordAttrib = glGetAttribLocation(s->program, ATTRIB_NAME_TEXCOORD);
	shader_debug("attrib: %s=%d\n", ATTRIB_NAME_TEXCOORD, texcoordAttrib);
	glEnableVertexAttribArray(texcoordAttrib);
	glVertexAttribPointer(texcoordAttrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float),
			(void*) (3 * sizeof(float)));

	return SHADER_OK;
}