/*virtual*/ void GL2ShaderProgram::Initialize( IVertexShader* const pVertexShader, IPixelShader* const pPixelShader, IVertexDeclaration* const pVertexDeclaration )
{
	XTRACE_FUNCTION;

	m_VertexShader	= pVertexShader;
	m_PixelShader	= pPixelShader;

	ASSERT( m_VertexShader );
	ASSERT( m_PixelShader );

	m_ShaderProgram = glCreateProgram();
	ASSERT( m_ShaderProgram != 0 );

	GLuint VertexShader = *static_cast<GLuint*>( m_VertexShader->GetHandle() );
	ASSERT( VertexShader != 0 );
	glAttachShader( m_ShaderProgram, VertexShader );

	GLuint PixelShader = *static_cast<GLuint*>( m_PixelShader->GetHandle() );
	ASSERT( PixelShader != 0 );
	glAttachShader( m_ShaderProgram, PixelShader );

	BindAttributes( pVertexDeclaration );

	glLinkProgram( m_ShaderProgram );
	GLERRORCHECK;

	GLint LinkStatus;
	glGetProgramiv( m_ShaderProgram, GL_LINK_STATUS, &LinkStatus );

	if( LinkStatus != GL_TRUE )
	{
		GLint LogLength;
		glGetProgramiv( m_ShaderProgram, GL_INFO_LOG_LENGTH, &LogLength );
		Array<GLchar>	Log;
		Log.Resize( LogLength );
		glGetProgramInfoLog( m_ShaderProgram, LogLength, NULL, Log.GetData() );
		if( LogLength > 0 )
		{
			PRINTF( "GLSL shader program link failed:\n" );
			PRINTF( Log.GetData() );
		}
		WARNDESC( "GLSL shader program link failed" );
	}

	BuildUniformTable();
	SetSamplerUniforms();
}
Exemple #2
0
bool Init()
{
	srand(0);
	LOG::Initialize();
	
	if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
	{
		LOG::Message("Unable to initialize SDL.");
		LOG::Message(SDL_GetError());
		return false;
	}
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
	SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
	SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
	SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
	SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
	SDL_WM_SetCaption("FractalDemo", "FractalDemo");

	Reshape(screen_width, screen_height);
	
	glewInit();
	if (!GLEW_VERSION_3_0)
	{
		LOG::Message("Requires OpenGL 3.0 or later.");
		return false;
	}
	
	LOG::Message("GL_VENDOR", (char*)glGetString(GL_VENDOR));
	LOG::Message("GL_RENDERER", (char*)glGetString(GL_RENDERER));
	LOG::Message("GL_VERSION", (char*)glGetString(GL_VERSION));
	LOG::Message("GL_SHADING_LANGUAGE_VERSION", (char*)glGetString(GL_SHADING_LANGUAGE_VERSION));

	const char* shader_error = "";
	
	if (!gluInitializeCompiler())
	{
		LOG::Message("Unable to initialize GLSL compiler.");
		return false;
	}
	if (!BuildShader(&ShaderProgram, vert_filepath, frag_filepath, &shader_error))
	{
		LOG::Message(shader_error);
		return false;
	}
	if (!BindUniforms(ShaderProgram, uniform_locations, num_of_uniforms))
	{
		LOG::Message("Could not bind uniforms.");
		return false;
	}
	if (!BindAttributes(ShaderProgram, attribute_locations, num_of_attributes))
	{
		LOG::Message("Could not bind attributes.");
		return false;
	}

	glGenBuffers(1, &array_buffer);
	glBindBuffer(GL_ARRAY_BUFFER, array_buffer);
	glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(float), plane_data, GL_STATIC_DRAW);

	glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
	glEnableVertexAttribArray(0);

	reset();

	return true;
}
TerrainShader::TerrainShader()
	: ShaderProgram("../res/shaders/terrainShader")
{
	BindAttributes();
	GetAllUniformLocations();
}