#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;
}
|