FBO
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>
#pragma comment(lib, "glew32.lib") GLuint g_VBO;
GLuint g_VBO_TexCoord;
GLuint g_VAO; GLuint g_FBO;
GLuint g_Texture0;
GLuint g_RBO; GLuint g_VBO2;
GLuint g_VBO2_TexCoord;
GLuint g_VBO2_Color;
GLuint g_VAO2; const unsigned int WIDTH = ;
const unsigned int HEIGHT = ; float xRot; float camRotX;
float camRotY;
float camRotZ; void InitVAO()
{
float vertices[] = {-1.0, -1.0, -0.0,
1.0, -1.0, -0.0,
1.0, 1.0, -0.0,
-1.0, 1.0, -0.0}; float texcoord[] = {0.0, 0.0,
1.0, 0.0,
1.0, 1.0,
0.0, 1.0}; glGenVertexArrays(, &g_VAO);
glBindVertexArray(g_VAO); glGenBuffers(, &g_VBO);
glBindBuffer(GL_ARRAY_BUFFER, g_VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
//glEnableVertexAttribArray(0);//启用Shader时指定layout标识号
//glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glVertexPointer(, GL_FLOAT, , ); glGenBuffers(, &g_VBO_TexCoord);
glBindBuffer(GL_ARRAY_BUFFER, g_VBO_TexCoord);
glBufferData(GL_ARRAY_BUFFER, sizeof(texcoord), texcoord, GL_STATIC_DRAW);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, g_Texture0);
glTexCoordPointer(, GL_FLOAT, , ); glBindVertexArray();
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY); } void InitVAO2()
{
float vertices[] = {-1.0, -1.0, -0.0,
1.0, -1.0, -0.0,
1.0, 1.0, -0.0}; float color[] = {0.0, 0.0, 1.0, 0.4,
0.0, 0.0, 1.0, 0.4,
0.0, 0.0, 1.0, 0.4,
};
glGenVertexArrays(, &g_VAO2);
glBindVertexArray(g_VAO2); glGenBuffers(, &g_VBO2);
glBindBuffer(GL_ARRAY_BUFFER, g_VBO2);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(, GL_FLOAT, , ); glGenBuffers(, &g_VBO2_Color);
glBindBuffer(GL_ARRAY_BUFFER, g_VBO2_Color);
glBufferData(GL_ARRAY_BUFFER, sizeof(color), color, GL_STATIC_DRAW);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(, GL_FLOAT, , );
glBindVertexArray();
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
}
void InitFBO()
{
glGenFramebuffers(, &g_FBO);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_FBO); glGenTextures(, &g_Texture0);
glBindTexture(GL_TEXTURE_2D, g_Texture0); glTexImage2D(GL_TEXTURE_2D, , GL_RGBA8, WIDTH, HEIGHT, , GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_Texture0, ); glGenRenderbuffers(, &g_RBO);
glBindRenderbuffer(GL_RENDERBUFFER, g_RBO);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, WIDTH, HEIGHT);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, g_RBO); GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
switch (status)
{
case GL_FRAMEBUFFER_COMPLETE:
{
std::cout << "Framebuffer SUCCESS!" << std::endl;
break;
}
case GL_FRAMEBUFFER_UNSUPPORTED:
{
std::cout << "FrameBufffer UNSCCESS" << std::endl;
break;
}
default:
break;
}
glBindFramebuffer(GL_FRAMEBUFFER, );
} void Init()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
xRot = 0.0f;
camRotX = 0.0f;
camRotY = 0.0f;
camRotZ = 0.0f;
InitVAO();
InitVAO2();
InitFBO();
} void Display()
{ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_FBO);
glPushAttrib(GL_VIEWPORT_BIT);
glViewport(, , WIDTH, HEIGHT);
glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, WIDTH/HEIGHT, 1.0, 100.0);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -3.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, g_Texture0);
glRotatef(xRot,0.0,1.0,0.0); glutSolidTeapot(0.1f);
glBindVertexArray(g_VAO2);
glDrawArrays(GL_TRIANGLES, , );
glBindVertexArray();
glPopAttrib();
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ); glClearColor(1.0f, 0.2f, 0.2f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -3.0);
glRotatef(camRotX, 1.0, 0.0f, 0.0f);
glRotatef(camRotY, 0.0, 1.0f, 0.0f);
glRotatef(camRotZ, 0.0, 0.0f, 1.0f); glBindVertexArray(g_VAO);
glDrawArrays(GL_QUADS, , );
glBindVertexArray(); glutSwapBuffers();
} void Resize(int w, int h)
{
if ( == h)
{
h = ;
}
glViewport(, , w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, w/h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); } void OnTimer(int id)
{
xRot += 0.1;
//camRotX += 0.01;
camRotY += 0.05;
//camRotZ += 0.01;
Display();
glutTimerFunc(, OnTimer, id);
}
int main(int argc, char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(, );
glutCreateWindow("FBO-VBO-VAO");
GLenum res = glewInit();
if (GLEW_OK != res)
{
std::cout << "加载GLEW失败" << std::endl;
}
Init();
glutDisplayFunc(Display);
glutReshapeFunc(Resize);
glutTimerFunc(, OnTimer, );
glutMainLoop();
return EXIT_SUCCESS;
}
FBO的更多相关文章
- OpenGL帧缓存对象(FBO:Frame Buffer Object)(转载)
原文地址http://www.songho.ca/opengl/gl_fbo.html 但有改动. OpenGL Frame BufferObject(FBO) Overview: 在OpenGL渲染 ...
- Cesium原理篇:6 Render模块(4: FBO)
Cesium不仅仅提供了FBO,也就是Framebuffer类,而且整个渲染过程都是在FBO中进行的.FBO,中文就是帧缓冲区,通常都属于高级用法,但其实,如果你了解了它的基本原理后,用起来还是很简单 ...
- 通过属性 Cesium的FBO主要支持两种方式
角色其实就是一类权限的分组,所以给用户分配角色其实也是在给用户分配权限.在oracle中有三个比较常用的角色.对于一般不是很严格的系统可以授予开发用户CONNECT.RESOURCE角色权限即可. 其 ...
- OpenGL ES 3.0之Fragment buffer objects(FBO)详解(二)
我们可以使用帧缓冲对象来实现离屏渲染.帧缓冲对象支持下列操作 1.只使用OpenGL ES 函数创建帧缓冲区对象. 2.使用EGL context创建多个FBO. 3.创建离屏颜色.深度.模板渲染缓冲 ...
- OpenGL ES 3.0之Fragment buffer objects(FBO)详解(一)
片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓冲: OpenGL ES •• Color buffer颜色缓冲 •• Depth bu ...
- WebGL 利用FBO完成立方体贴图。
这篇主要记录WebGL的一些基本要点,顺便也学习下如何使用FBO与环境贴图.先看下效果图(需要支持WebGL,Chrome,火狐,IE11). 主要实现过程如下,先用FBO输出当前环境在立方体纹理中, ...
- osgMulitiplerendertargets sample 中fbo使用【HTC VIVE开发中应用】
osgmultiplerendertargets.cpp ...................................... // now create the camera to do t ...
- 多重采样(MultiSample)下的FBO反锯齿 【转】
在三维渲染的过程中,锯齿总是让人讨厌的东西.抗锯齿的一种采用方式是多重采样,本文主要小记一下FBO与多重采样的关系.——ZwqXin.com 首先,关于FBO(Frame Buffer Object) ...
- OpenGL ES 3.0之Fragment buffer objects(FBO)详解 (转)
http://www.cnblogs.com/salam/p/4957250.html 片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓 ...
- GLSL使用FBO实现MRT(Multiple Render Targets)绘制到多张纹理 【转】
项目的程序里设计需要将某一帧渲染出来的画面拆成三通道单色图像存到三张纹理里面.要绘制到纹理里,自然就想到FBO了.但是一次要输出多张纹理,这个还没接触过.一阵网上搜索过后,终于了解到了MRT(多重渲染 ...
随机推荐
- 运行机制和JVM
Java代码编译后生成一种与平台无关的字节码(也就是class文件).当然,这种字节码不是可执行的,必须使用Java解释器来解释执行. 负责解释执行字节码文件的是Java虚拟机,即JVM.JVM是可运 ...
- selenium2使用记录
安装 pip install selenium web phantomjs下载 :http://phantomjs.org/download.html 浏览器驱动下载:http://www.selen ...
- redis(1)
一.Redis介绍 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键包括 string,ha ...
- java 访问后台方法顺序混乱
今天遇到后台接值顺序混乱的问题. 环境:前台ajax请求后台方法.前台页面会频繁访问这个ajax. 现象:访问后台方法的顺序混乱. 怎么发现的问题:数量小访问没有问题,今天压力测试发现的问题. 解决办 ...
- IIS 发布程序,无法输出EXCEL 问题处理
[解决方案1] 1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务&quo ...
- XML+AJAX
- QList 排序
现有结构体: struct fileInfo { QDate createTime; QString fileName; } QList<fileInfo> fileLst; // 对文件 ...
- pgsql获取表相关数据
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.P ...
- for循环执行步骤
for循环的具体步骤: for(var i=0;i<5;i++){ alert(1); } 第一步--->初始化i(初始化只在for循环中执行一次); 第二步--->执行条件i< ...
- Form标签+Css基础
一.Form表单标签 <form action="" method=""></form> 表单就是用来将用户的信息提交到服务器 ...