Opengl学习程序之渲染缓存

来源:互联网 发布:美国知乎quora 中国 编辑:程序博客网 时间:2024/05/01 14:48

实现程序:

#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();}
0 0