/*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(); }
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(); }