Ejemplo n.º 1
0
ShaderProgram::ShaderProgram(
	const string &filename,
	const VertexShader &vertexShader,
	const FragmentShader &fragmentShader) : _name(filename), _handle(0), _linked(0)
{
	try
	{
		if (vertexShader.fail()) throw std::runtime_error("Invalid vertex shader");
		if (fragmentShader.fail()) throw std::runtime_error("Invalid fragment shader");

		if (GLEW_VERSION_2_0)
		{
			// Create program and attach vertex and fragment shaders
			_handle = glCreateProgram();
			glAttachShader(_handle, vertexShader.handle());
			glAttachShader(_handle, fragmentShader.handle());

			// Perform link stage
			glLinkProgram(_handle);
			glGetProgramiv(_handle, GL_LINK_STATUS, &_linked);

			// Validate program
			glValidateProgram(_handle);
			printInfoLog();

			// Check for success
			if (GL_FALSE == _linked)
				throw std::runtime_error("Link stage failed");
		}
		else if (GLEW_VERSION_1_5)
		{
			// Create program and attach vertex and fragment shaders
			_handle = glCreateProgramObjectARB();
			glAttachObjectARB(_handle, vertexShader.handle());
			glAttachObjectARB(_handle, fragmentShader.handle());

			// Perform link stage
			glLinkProgramARB(_handle);
			glGetObjectParameterivARB(_handle, GL_OBJECT_LINK_STATUS_ARB, &_linked);

			// Validate program
			glValidateProgramARB(_handle);
			printInfoLog();

			// Check for success
			if (GL_FALSE == _linked)
				throw std::runtime_error("Link stage failed");
		}

		cout << "* Shader \"" << _name << "\" successfully linked" << endl;
	}
	catch (std::runtime_error &err)
	{
		cerr << "Error: Faild to create shader " << _name << endl;
		cerr << "Reason: " << err.what() << endl;
	}
}