Created
September 24, 2010 20:21
-
-
Save DylanLukes/595966 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
** FBO.c | |
** | |
** Copyright (c) 2008 Max Rupp ([email protected]) 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