Opengl学习程序之渲染缓存

2/22/2017来源:ASP.NET技巧人气:3039

实现程序:

#include "stdafx.h" #include<iostream> using namespace std; #include "vgl.h" #include "LoadShaders.h" enum{Color,Depth,NumRenderbuffers}; GLuint framebuffer, renderbuffer[NumRenderbuffers]; void init(void) { //void glGenRenderbuffers(GLsizei n,GLuint* ids) //分配n个未使用的渲染缓存对象名称,并且将他们保存到ids中。对象必须关联到glBindRenderbuffer()之后才能使用。 glGenRenderbuffers(NumRenderbuffers, renderbuffer); //void glBindRenderbuffer(GLenum target,GLuint renderbuffer) //创建并绑定一个名称为renderbuffer的渲染缓存。target必须是GL_RENDERBUFFER,而renderbuffer可以是0,即移除当前的绑定, //也可以是glGenRenderbuffers()所生成的一个名称;否则系统将产生一个GL_INVALID_OperaTION错误。 glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer[Color]); //void glRenderbufferStorage(GLenum target,GLenum internalformat,GLsizei width,GLsizei height) //为当前绑定的渲染缓存分配图像数据的空间。target必须是GL_RENDERBUFFER.width和height用来设置渲染缓存的像素大小。 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 256, 256); glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer[Depth]); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 256, 256); //void glGenFramebuffers(GLsizei n,GLuint* ids) //分配n个未使用的帧缓存对象名称,并且将他们存储到ids中 //如果n为负数,那么将产生一个GL_INVALID_VALUE错误。 glGenFramebuffers(1, &framebuffer); //void glBindFramebuffer(GLenum target,GLuint framebuffer) //设置一个可读或者可写的帧缓存。如果target为GL_DRAW_FRAMEBUFFER,那么framebuffer设置的是绘制时的目标帧缓存。类似的 //如果target设置为GL_READ_FRAMEBUFFER,那么framebuffer就是读取操作的数据源。如果target设置为GL_FRAMEBUFFER,那么framebuffer //所设置的帧缓存是可读也可写的。如果framebuffer设置为0的话,表示将目标绑定到默认的窗口系统帧缓存,或者设置为一个 //glGenFramebuffers()生成的帧缓存对象。 //如果framebuffer不是0也不是一个可用的帧缓存对象(可用的对象是通过glGenFramebuffers()生成的,并且没有被glDeleteFramebuffers() //所释放),那么将产生一个GL_INVALID_OPERATION错误。 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); //void glFramebufferRenderbuffer(GLenum target,GLenum attachment,GLenum renderbuffertarget,GLuint renderbuffer) //将渲染缓存renderbuffer关联到当前绑定的帧缓存对象的附件attachment上。target必须是GL_READ_FRAMEBUFFER,GL_DRAW_FRAMEBUFFER或者 //GL_FRAMEBUFFER(等价于GL_DRAW_FRAMEBUFFER) //attachment必须是GL_COLOR_ATTACHMENTi,GL_DEPTH_ATTACHMENT,GL_STENCIL_ATTACHMENT或者GL_DEPTH_STENCIL_ATTACHMENT. //renderbuffertarget必须设置为GL_RENDERBUFFER,而renderbuffer必须是0(表示将附件所关联的渲染缓存移除)或者是glGenRenderbuffers() //生成的渲染缓存名称,否则会产生一个GL_INVALID_OPERATION错误。 glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer[Color]); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer[Depth]); glEnable(GL_DEPTH_TEST); } void display(void) { //准备渲染到渲染缓存中 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); glViewport(0, 0, 256, 256); //渲染到渲染缓存 glClearColor(1.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //设置从渲染缓存读取,然后绘制到窗口系统的帧缓存中 glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glViewport(0, 0, 512, 512); glClearColor(0.0, 0.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /*执行拷贝操作*/ glBlitFramebuffer(0, 0, 255, 255, 0, 0, 255, 255, GL_COLOR_BUFFER_BIT, GL_NEAREST); //交换两个缓冲区指针。 glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(512, 512); glutCreateWindow(argv[0]); glewExperimental = GL_TRUE; if (glewInit()) { cerr << "Unable to initialize GLEW ... exiting" << endl; exit(EXIT_FAILURE); } init(); glutDisplayFunc(display); glutMainLoop(); }