FBO

FBOです。オフスクリーンレンダリングで使います。

ファイル
main.cpp

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib, "glew32.lib")

#include <GL/glew.h>
#include <GL/freeglut/freeglut.h>

#include    <stdio.h>

int WIDTH=320;
int HEIGHT=240;

#define    FBO_WIDTH        256
#define    FBO_HEIGHT        256


GLuint    Tex_Name;
GLuint    RenderBuffer;
GLuint    FrameBuffer;
GLint    Viewport[4];

float angle=0.0f;

void SetLight( void ){
 GLfloat light_position[] = { 100.0f, 150.0f, 200.0f, 1.0f };
 GLfloat light_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
 GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
 GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };

 glLightfv( GL_LIGHT0, GL_POSITION, light_position );
 glLightfv( GL_LIGHT0, GL_AMBIENT, light_ambient );
 glLightfv( GL_LIGHT0, GL_DIFFUSE, light_diffuse );
 glLightfv( GL_LIGHT0, GL_SPECULAR, light_specular );
}

void SetMaterial( void ){
 GLfloat ambient[] = { 0.1f, 0.1f, 0.2f, 1.0f };
 GLfloat diffuse[] = { 0.3f, 1.0f, 0.4f, 1.0f };
 GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
 GLfloat shininess[] = { 50.0f };
    
 glMaterialfv( GL_FRONT, GL_AMBIENT, ambient );
 glMaterialfv( GL_FRONT, GL_DIFFUSE, diffuse );
 glMaterialfv( GL_FRONT, GL_SPECULAR, specular );
 glMaterialfv( GL_FRONT, GL_SHININESS, shininess );
}

void DrawCubeSub( float l ){
 glPushMatrix();
 glTranslatef( l, 0.0f, 0.0f );
 glBegin( GL_QUADS );
 glNormal3f( 1.0f, 0.0f, 0.0f );
 glTexCoord2f( 0.0f, 0.0f );
 glVertex3f( 0.0f, -l, -l );
 glTexCoord2f( 1.0f, 0.0f );
 glVertex3f( 0.0f, l, -l );
 glTexCoord2f( 1.0f, 1.0f );
 glVertex3f( 0.0f, l, l );
 glTexCoord2f( 0.0f, 1.0f );
 glVertex3f( 0.0f, -l, l );
 glEnd();
 glPopMatrix();
}

void DrawCube( float l ){
 int    i;
 glPushMatrix();
 for ( i = 0; i < 4; i++ ) {
    DrawCubeSub( l );
    glRotatef( 90.0f, 0.0f, 0.0f, 1.0f );
 }
 glRotatef( 90.0f, 0.0f, 1.0f, 0.0f );
 DrawCubeSub( l );
 glRotatef( 180.0f, 0.0f, 1.0f, 0.0f );
 DrawCubeSub( l );
 glPopMatrix();
}

void RenderToTexture( void ){
 //保存
 glGetIntegerv( GL_VIEWPORT, Viewport );
 glMatrixMode( GL_PROJECTION );
 glPushMatrix();
 glMatrixMode( GL_MODELVIEW );
 glPushMatrix();

 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, FrameBuffer );
 glClearColor( 0.2f, 0.3f, 0.6f, 1.0f );
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 glViewport( 0, 0, FBO_WIDTH, FBO_HEIGHT );
 glMatrixMode( GL_PROJECTION );
 glLoadIdentity();
 gluPerspective( 40.0,FBO_WIDTH / (double)FBO_HEIGHT,1.0,1000.0 );
 glMatrixMode( GL_MODELVIEW );
 glLoadIdentity();
 gluLookAt( 0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
 SetLight();
 SetMaterial();
 glPushMatrix();
 glRotatef( angle, 0.0f, 1.0f, 0.0f );
 glRotatef( angle, 1.0f, 0.0f, 0.0f );
 glScalef( -1.0f, 1.0f, 1.0f );
 glutSolidTeapot( 20.0 );
 glPopMatrix();
 glFlush();
 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
 //戻す
 glViewport( Viewport[0], Viewport[1], Viewport[2], Viewport[3] );
 glMatrixMode( GL_PROJECTION );
 glPopMatrix();
 glMatrixMode( GL_MODELVIEW );
 glPopMatrix();
}

void display( void ){
 RenderToTexture();
 glClearColor(0.7f, 0.7f, 0.7f, 1.0f);
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 glMatrixMode( GL_MODELVIEW );
 glLoadIdentity();
 gluLookAt( 0.0, 0.0, 200.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
 SetLight();
 glEnable( GL_COLOR_MATERIAL );
 glColor3f( 1.0f, 1.0f, 1.0f );
 glEnable( GL_TEXTURE_2D );
 glBindTexture( GL_TEXTURE_2D, Tex_Name );
 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
 glPushMatrix();
 glRotatef( angle , 0.0f, 1.0f, 0.0f );
 glRotatef( angle , 0.0f, 0.0f, 1.0f );
 DrawCube( 30.0f );
 glPopMatrix();
 glDisable( GL_COLOR_MATERIAL );
 glDisable( GL_TEXTURE_2D );
 glutSwapBuffers();
}

void Reshape( int w, int h ){
 WIDTH = w;
 HEIGHT = h;
 glViewport( 0, 0, WIDTH, HEIGHT );
 glMatrixMode( GL_PROJECTION );
 glLoadIdentity();
 gluPerspective( 40.0, WIDTH / ( double ) HEIGHT, 1.0, 1000.0 );
 glMatrixMode( GL_MODELVIEW );
}
void idle(void){
 angle+=2.0f;
 Sleep(1);
 glutPostRedisplay();
}
void Init(){
 glEnable(GL_DEPTH_TEST);
 glEnable(GL_LIGHTING);
 glEnable(GL_LIGHT0);
 glewInit();
 //テクスチャ
 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
 glGenTextures( 1, &Tex_Name );
 glBindTexture( GL_TEXTURE_2D, Tex_Name );
 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, FBO_WIDTH, FBO_HEIGHT,
                  0, GL_RGBA, GL_UNSIGNED_BYTE, 0 );
 //レンダーバッファ
 glGenRenderbuffersEXT( 1, &RenderBuffer );
 glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, RenderBuffer );
 glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
                              FBO_WIDTH, FBO_HEIGHT );
 //フレームバッファ
 glGenFramebuffersEXT( 1, &FrameBuffer );
 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, FrameBuffer );
 glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
                       GL_TEXTURE_2D, Tex_Name, 0 );
 glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
                      GL_RENDERBUFFER_EXT, RenderBuffer );
 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
}
int main(int argc, char *argv[]){
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("FBO");
 glutDisplayFunc(display);
 glutReshapeFunc( Reshape );
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return 0;
}

 

 

 

 

 

 

最終更新:2015年05月06日 18:28
添付ファイル