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
- Opengl学习程序之渲染缓存
- OpenGL之渲染优化
- Opengl学习程序之三角形
- Opengl学习程序之uniform
- Opengl学习程序之纹理
- 服务器端基于opengl程序渲染
- 现代OpenGL+Qt学习笔记之八:GLSL双面渲染
- 小程序学习之视图与渲染
- Opengl之缓存映射
- Opengl学习程序之绘制命令
- Opengl学习程序之红色三角形
- Opengl学习程序之移动的矩形
- OpenGL编程学习之《一个简单的OpenGL程序》
- OpenGL基于帧缓存FBO的离屏渲染
- glBindFramebuffer() 离屏渲染+双缓存+读取opengl像素 glReadPixels()
- OpenGL学习笔记--渲染yuv纹理
- opengl光照之镜面光逐顶点渲染与逐像素渲染
- 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)
- 微信小程序跳坑
- 记录Activity的onCreate()方法的参数PersistableBundle
- 微信上传下载临时素材
- android 如何实现webview(h5)的视频播放
- myeclipse中复制的web项目在部署到tomcat中时会部署之前的项目
- Opengl学习程序之渲染缓存
- 使用JS+CSS3实现模态框的效果
- jira中api开放及Jira证书
- Android实现双进程守护
- PAT甲级1122
- CMake
- usaco 训练总结4
- android中Webview与javascript的交互(互相调用)
- spring+mybatis+c3p0数据库连接池或druid连接池使用配置整理