#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的更多相关文章

  1. OpenGL帧缓存对象(FBO:Frame Buffer Object)(转载)

    原文地址http://www.songho.ca/opengl/gl_fbo.html 但有改动. OpenGL Frame BufferObject(FBO) Overview: 在OpenGL渲染 ...

  2. Cesium原理篇:6 Render模块(4: FBO)

    Cesium不仅仅提供了FBO,也就是Framebuffer类,而且整个渲染过程都是在FBO中进行的.FBO,中文就是帧缓冲区,通常都属于高级用法,但其实,如果你了解了它的基本原理后,用起来还是很简单 ...

  3. 通过属性 Cesium的FBO主要支持两种方式

    角色其实就是一类权限的分组,所以给用户分配角色其实也是在给用户分配权限.在oracle中有三个比较常用的角色.对于一般不是很严格的系统可以授予开发用户CONNECT.RESOURCE角色权限即可. 其 ...

  4. OpenGL ES 3.0之Fragment buffer objects(FBO)详解(二)

    我们可以使用帧缓冲对象来实现离屏渲染.帧缓冲对象支持下列操作 1.只使用OpenGL ES 函数创建帧缓冲区对象. 2.使用EGL context创建多个FBO. 3.创建离屏颜色.深度.模板渲染缓冲 ...

  5. OpenGL ES 3.0之Fragment buffer objects(FBO)详解(一)

    片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓冲: OpenGL ES •• Color buffer颜色缓冲 •• Depth bu ...

  6. WebGL 利用FBO完成立方体贴图。

    这篇主要记录WebGL的一些基本要点,顺便也学习下如何使用FBO与环境贴图.先看下效果图(需要支持WebGL,Chrome,火狐,IE11). 主要实现过程如下,先用FBO输出当前环境在立方体纹理中, ...

  7. osgMulitiplerendertargets sample 中fbo使用【HTC VIVE开发中应用】

    osgmultiplerendertargets.cpp ...................................... // now create the camera to do t ...

  8. 多重采样(MultiSample)下的FBO反锯齿 【转】

    在三维渲染的过程中,锯齿总是让人讨厌的东西.抗锯齿的一种采用方式是多重采样,本文主要小记一下FBO与多重采样的关系.——ZwqXin.com 首先,关于FBO(Frame Buffer Object) ...

  9. OpenGL ES 3.0之Fragment buffer objects(FBO)详解 (转)

    http://www.cnblogs.com/salam/p/4957250.html 片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓 ...

  10. GLSL使用FBO实现MRT(Multiple Render Targets)绘制到多张纹理 【转】

    项目的程序里设计需要将某一帧渲染出来的画面拆成三通道单色图像存到三张纹理里面.要绘制到纹理里,自然就想到FBO了.但是一次要输出多张纹理,这个还没接触过.一阵网上搜索过后,终于了解到了MRT(多重渲染 ...

随机推荐

  1. Ubuntu中Qt新建窗体提示lGL错误

    提示错误: cannot find -lGL collect2:error:ld returned 1 exit status 这是因为系统缺少链接库,终端输入: sudo apt-get insta ...

  2. Python机器学习包

    常用Python机器学习包 Numpy:用于科学计算的包 Pandas:提供高性能,易于使用的数据结构和数据分析工具 Scipy:用于数学,科学工程的软件 StatsModels:用于探索数据.估计统 ...

  3. asp.net MVC漏油配置总结

    URL构造 命名参数规范+匿名对象 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}&qu ...

  4. ACM北大学习

    在两周的学习下,对ACM竞赛有了更深入地了解.学习到了很多知识,见识到了很多高手,目光放得更长远了.最后的比赛,在100多个队伍中,获得第十八的名次,也不负我的学习.

  5. linux命令之ifconfig详细解释

    依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置. 1.命令格式: ifconfig [网络设备] [参数] 2.命令功能 ...

  6. 谷歌游览器对<input type='file'> change只能响应1次解决和样式的改变

    在项目过程中遇到的需要上传本地文件,file的原始控件不太美观,但是这个控件和button有点不太一样, 改变这个样式的思路就是在控件外面套一层链接,然后把file控件的透明度设置为0(透明).样式只 ...

  7. C# 根据IP获取省市

    /// <summary> /// 根据IP获取省市 /// </summary> public void GetAddressByIp() { string ip = &qu ...

  8. Another Array of Orz Pandas

    Another Array of Orz Pandas 题目链接:http://acm.xidian.edu.cn/problem.php?id=1187 线段树 线段树维护区间和以及区间内各个数平方 ...

  9. 当页面加载完成时,JQ触发添加页面的元素的事件触发不了。。

    有下代码可知: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default. ...

  10. nyoj587 hdu1045 简单深搜

    #include<iostream> #include<cstdio> #include<queue> #include<vector> #includ ...