Skip to content

Instantly share code, notes, and snippets.

@DylanLukes
Created September 24, 2010 20:21
Show Gist options
  • Save DylanLukes/595966 to your computer and use it in GitHub Desktop.
Save DylanLukes/595966 to your computer and use it in GitHub Desktop.
/*
** FBO.c
**
** Copyright (c) 2008 Max Rupp (feelgood@cs.pdx.edu) All rights reserved.
**
** cc FBO.c -o FBO -Wall -std=c99 -DDEBUG -DW=640 -DH=480 -framework OpenGL -framework GLUT
*/
#include <OpenGL/OpenGL.h>
#include <GLUT/glut.h>
#include <stdio.h>
#include "error.h"
GLuint T[10];
static GLvoid
display( GLvoid )
{
/* ... */
{
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, T[3] );
{
glUseProgram( T[4] );
glBindBuffer( GL_ARRAY_BUFFER, T[0] );
glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 );
eglGetError( );
}
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
{
glUseProgram ( T[5] );
glBindBuffer ( GL_ARRAY_BUFFER, T[1] );
glBindTexture( GL_TEXTURE_2D, T[2] );
glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 );
glFlush( );
eglGetError( );
}
}
}
static GLvoid
reshape( const GLint X, const GLint Y )
{
/* ... */
{
glViewport( 0, 0, X, Y );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, X, Y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
eglGetError( );
}
}
static GLvoid
init( GLvoid )
{
/* ... */
{
glGenBuffers ( 2, &T[0] );
glGenTextures ( 1, &T[2] );
glGenFramebuffersEXT( 1, &T[3] );
T[4] = glCreateProgram( ); T[6] = glCreateShader( GL_VERTEX_SHADER ); T[7] = glCreateShader( GL_FRAGMENT_SHADER );
T[5] = glCreateProgram( ); T[8] = glCreateShader( GL_VERTEX_SHADER ); T[9] = glCreateShader( GL_FRAGMENT_SHADER );
eglGetError( );
}
/* ... */
{
glDisable( GL_DITHER );
}
/* ... */
{
const GLfloat A[] =
{
-1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f
};
const GLfloat B[] =
{
-1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f
};
glBindBuffer( GL_ARRAY_BUFFER, T[0] );
glBufferData( GL_ARRAY_BUFFER, sizeof( A ), A, GL_STATIC_DRAW );
glEnableVertexAttribArray( 0 ); glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, ( const GLvoid * ) ( sizeof( GLfloat ) * 0 ) );
glEnableVertexAttribArray( 1 ); glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, 0, ( const GLvoid * ) ( sizeof( GLfloat ) * 8 ) );
eglGetError( );
glBindBuffer( GL_ARRAY_BUFFER, T[1] );
glBufferData( GL_ARRAY_BUFFER, sizeof( B ), B, GL_STATIC_DRAW );
glEnableVertexAttribArray( 2 ); glVertexAttribPointer( 2, 2, GL_FLOAT, GL_FALSE, 0, ( const GLvoid * ) ( sizeof( GLfloat ) * 0 ) );
glEnableVertexAttribArray( 3 ); glVertexAttribPointer( 3, 2, GL_FLOAT, GL_FALSE, 0, ( const GLvoid * ) ( sizeof( GLfloat ) * 8 ) );
eglGetError( );
}
/* ... */
{a
glBindTexture ( GL_TEXTURE_2D, T[2] );
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, T[3] );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, W, H, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, T[2], 0 );
eglCheckFramebufferStatus( );
}
/* ... */
{
const GLfloat M[] =
{
1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f
};
const GLchar *S[4] =
{
"attribute vec4 A0; attribute vec4 A1; varying vec4 V0; uniform mat4 M0; void main( void ) { V0 = A1; gl_Position = ( M0 * A0 ); }",
"attribute vec4 A0; attribute vec2 A1; varying vec2 V0; uniform mat4 M0; void main( void ) { V0 = A1; gl_Position = ( M0 * A0 ); }",
"varying vec4 V0; void main( void ) { gl_FragColor = V0; }",
"varying vec2 V0; uniform sampler2D S0; void main( void ) { gl_FragColor = texture2D( S0, V0 ); }"
};
glShaderSource( T[6], 1, &S[0], NULL ); glCompileShader( T[6] ); eglGetShaderInfoLog( T[6], S[0] ); glAttachShader( T[4], T[6] );
glShaderSource( T[7], 1, &S[2], NULL ); glCompileShader( T[7] ); eglGetShaderInfoLog( T[7], S[2] ); glAttachShader( T[4], T[7] );
glBindAttribLocation( T[4], 0, "A0" );
glBindAttribLocation( T[4], 1, "A1" );
glLinkProgram ( T[4] );
glUseProgram ( T[4] ); glUniformMatrix4fv( glGetUniformLocation( T[4], "M0" ), 1, GL_FALSE, ( M + 0 ) );
eglGetError( );
glShaderSource( T[8], 1, &S[1], NULL ); glCompileShader( T[8] ); eglGetShaderInfoLog( T[8], S[1] ); glAttachShader( T[5], T[8] );
glShaderSource( T[9], 1, &S[3], NULL ); glCompileShader( T[9] ); eglGetShaderInfoLog( T[9], S[3] ); glAttachShader( T[5], T[9] );
glBindAttribLocation( T[5], 2, "A0" );
glBindAttribLocation( T[5], 3, "A1" );
glLinkProgram ( T[5] );
glUseProgram ( T[5] ); glUniformMatrix4fv( glGetUniformLocation( T[5], "M0" ), 1, GL_FALSE, ( M + 16 ) );
eglGetError( );
}
}
int
main( int argc, char **argv )
{
glutInit( &argc, argv );
glutInitDisplayString( "single rgba" );
glutInitWindowSize( W, H );
glutInitWindowPosition( 0, 0 );
glutCreateWindow( "FBO" );
glutDisplayFunc( display );
glutReshapeFunc( reshape );
init( );
glutMainLoop( );
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment