glGenTextures( 1, &gluiPipelineDiffuse );
if( gluiPipelineDiffuse == 0 )
{
RETURN_FAILURE FAILURE_LOW_MEMORY;
}
glGenFramebuffers( 1, &gluiPipelineFBO );
if( gluiPipelineFBO == 0 )
{
RETURN_FAILURE FAILURE_LOW_MEMORY;
}
glBindFramebuffer( GL_FRAMEBUFFER, gluiPipelineFBO );
glGenRenderbuffers( 1, &gluiPipelineDepth );
if( gluiPipelineDepth == 0 )
{
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
RETURN_FAILURE FAILURE_LOW_MEMORY;
}
uiPOTScreenWidth = 1;
while( uiPOTScreenWidth < tsCurrentConfiguration.uiScreenWidth )
{
uiPOTScreenWidth <<= 1;
}
uiPOTScreenHeight = 1;
while( uiPOTScreenHeight < tsCurrentConfiguration.uiScreenHeight )
{
uiPOTScreenHeight <<= 1;
}
glBindRenderbuffer( GL_RENDERBUFFER, gluiPipelineDepth );
glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT, tsCurrentConfiguration.uiScreenWidth, tsCurrentConfiguration.uiScreenHeight );
glBindTexture( GL_TEXTURE_2D, gluiPipelineDiffuse );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, uiPOTScreenWidth, uiPOTScreenHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gluiPipelineDiffuse, 0 );
glBindTexture( GL_TEXTURE_2D, 0 );
printf( "%d %d\n", uiPOTScreenWidth, uiPOTScreenHeight );
//glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gluiPipelineSpecular, 0 );
//glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gluiPipelineNormal, 0 );
//glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, gluiPipelineNormalised, 0 );
//glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT4, GL_TEXTURE_2D, gluiPipelineDiffuseLight, 0 );
//glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT5, GL_TEXTURE_2D, gluiPipelineSpecularLight, 0 );
if( glCheckFramebufferStatus( GL_FRAMEBUFFER ) != GL_FRAMEBUFFER_COMPLETE )
{
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
RETURN_FAILURE FAILURE_GENERIC;
}
//Celestial shader...
gluiTerrainVertex = glCreateShader( GL_VERTEX_SHADER );
if( gluiTerrainVertex == 0 )
{
RETURN_FAILURE FAILURE_LOW_MEMORY;
}
gluiTerrainFragment = glCreateShader( GL_FRAGMENT_SHADER );
if( gluiTerrainFragment == 0 )
{
RETURN_FAILURE FAILURE_LOW_MEMORY;
}
gluiTerrainShader = glCreateProgram();
if( gluiTerrainShader == 0 )
{
RETURN_FAILURE FAILURE_LOW_MEMORY;
}
const GLchar * glcAltVertex = ( GLchar * ) ui8Shader_Terrain_Vertex;
const GLchar * glcAltFragment = ( GLchar * ) ui8Shader_Terrain_Fragment;
//Now let's add the source code...
glShaderSource( gluiTerrainVertex, 1, &glcAltVertex, NULL );
glShaderSource( gluiTerrainFragment, 1, &glcAltFragment, NULL );
glCompileShader( gluiTerrainVertex );
glCompileShader( gluiTerrainFragment );
//Put them all together...
glAttachShader( gluiTerrainShader, gluiTerrainVertex );
glAttachShader( gluiTerrainShader, gluiTerrainFragment );
glBindFragDataLocation( gluiTerrainShader, 0, "v4DiffuseOut" );
glLinkProgram( gluiTerrainShader );
#ifdef DEBUG_COMMENTS_RENDERER
ShaderDebug( gluiTerrainVertex );
ShaderDebug( gluiTerrainFragment );
ProgramDebug( gluiTerrainShader );
#endif
glUseProgram( gluiTerrainShader );
glUniform1i( glGetUniformLocation( gluiTerrainShader, "s2DNormal" ), 0 );
gliTerrainVarVertex = glGetAttribLocation( gluiTerrainShader, "v3Vertex" );
gliTerrainVarTexCoord = glGetAttribLocation( gluiTerrainShader, "v2TexCoord" );
gliTerrainVarTransform = glGetUniformLocation( gluiTerrainShader, "m4Transform" );
gliTerrainVarNormal = glGetUniformLocation( gluiTerrainShader, "v3Normal" );
gliTerrainVarTangent = glGetUniformLocation( gluiTerrainShader, "v3Tangent" );
gliTerrainVarBitangent = glGetUniformLocation( gluiTerrainShader, "v3Bitangent" );
glUseProgram( 0 );
glBindFramebuffer( GL_FRAMEBUFFER, 0 );