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(多重渲染 ...
随机推荐
- 啥数据类型set补充、深浅拷贝与函数
#s1 = {1,2,3,1} """ s2 = ([2,5,6]) print(s1) s1.add(5) #添加元素"5" print(s1) s ...
- sort vector - leetcode 新用法
179. Largest Number sort(num.begin(), num.end(), [](int a, int b){ return to_string(a)+to_string(b) ...
- openstack私有云布署实践【16.3 Windows Server2008 R2 只有C盘分区镜像制作】
之所以要只有C盘分区镜像,是因为在创建VM或者调整云主机的硬盘大小时,它能自动扩容.无需人工介入 参考http://www.iyunv.com/thread-45149-1-1.html的灵感 ...
- linux/windows平台生成随机数的不同方法
linux平台,使用rand.Seed() //rand_linux.go package main import ( "math/rand" "time" ) ...
- 一个在浏览器端将html 转为pdf 的js 插件 jsPDF
<!DOCTYPE html> <html> <head> <title>test</title> <meta http-equiv= ...
- laravel5 MAC is invalid
如果本机的环境更换过,项目中用来加密Crypt组件中的参数会变更. 如果出现这个问题,得更换数据库中加密后的变量 stackoverflow上找到的解决方法都是 composer dump-autol ...
- 《JavaScript DOM编程艺术》读书笔记
这是自己JS入门的一本书,反复看过几遍,作者的文笔风趣,阅读起来不枯燥也显轻松~ 本书从JS简史讲到基础语法到DOM,再以一个图片库案例为主线,讲如何运用JS来实现想要的动效,同时对已写案例进行兼容优 ...
- Java版经典兔子繁殖迭代问题——斐波那契(Fibonacci)数列
/** * 题目: * 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子. * 假如兔子都不死,问经过month个月后,兔子的总数为多少对? */ public ...
- HDU 4442 Physical Examination(贪心)
HDU 4442 Physical Examination(贪心) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=4442 Descripti ...
- oracle 字段类型详解
CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749 NCHAR 根据字符集而定的固定长度字符串 最大长度 ...