bigdudu

#include "GL/glut.h"
#include "GL/glext.h"
#include "stdlib.h"

//对象
static GLuint g_Texture = 0;
static GLuint g_Framebuffer = 0;
static GLuint g_Renderbuffer = 0;

GLfloat angle = 0;

void display()
{
int width,height;
//选定FBO为渲染对象;
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,g_Framebuffer);
glViewport(0,0,512,512);
glClearColor(0.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0,(GLdouble)512/512,0.1,100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(10.0,10.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
glRotatef(angle,0.0,1.0,0.0);
glColor3f(1.0,0.0,0.0);
glutSolidTeapot(5.0);

//主FRAMEBUFFER
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
glBindTexture(GL_TEXTURE_2D,g_Texture);
glGenerateMipmapEXT(GL_TEXTURE_2D);

//设置主FRAMEBUFFER
width = glutGet(GLUT_WINDOW_WIDTH);
height = glutGet(GLUT_WINDOW_HEIGHT);
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0,(GLdouble)width/height,0.1,100.0);
glClearColor(0.4,0.4,0.4,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(10.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0);
glColor3f(1.0,1.0,1.0);
//绘制矩形并将FBO的内容贴图上去
glBegin(GL_POLYGON);
glTexCoord2f(0.0,0.0);
glVertex3f(0.0,-8.0,8.0);
glTexCoord2f(1.0,0.0);
glVertex3f(0.0,-8.0,-8.0);
glTexCoord2f(1.0,1.0);
glVertex3f(0.0,8.0,-8.0);
glTexCoord2f(0.0,1.0);
glVertex3f(0.0,8.0,8.0);
glEnd();
glutSwapBuffers();
}

void init()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
}

GLenum init_fbo()
{
GLenum status;
//生成framebuffer必要的对象
glGenFramebuffersEXT(1,&g_Framebuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,g_Framebuffer);
//生成需要绑定的texture对象
glGenTextures(1,&g_Texture);
glBindTexture(GL_TEXTURE_2D,g_Texture);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,512,512,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D,g_Texture,0);
//生成深度缓存对象
glGenRenderbuffersEXT(1,&g_Renderbuffer);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT,g_Renderbuffer);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT,GL_DEPTH_COMPONENT,512,512);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT,g_Renderbuffer,0);
//检查生成的FBO
status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
return status;

}

void reshape(int width,int height)
{
glutPostRedisplay();
}

void idle()
{
angle = angle + 1.0;
if(angle >= 360.0)
angle = angle - 360.0;
glutPostRedisplay();
}

int main(int argc,char *argv[])
{
GLenum status;
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
glutInitWindowSize(800,600);
glutInitWindowPosition(0,0);
glutCreateWindow("OpenGL");
init();
status = init_fbo();
if(status != GL_FRAMEBUFFER_COMPLETE_EXT)
printf("[ERROR CODE]%d\n",status);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}

分类:

技术点:

相关文章: