OpenGL缓冲区
OpenGL缓冲区
颜色缓冲区
OpenGL时,先是在一个缓冲区中完毕渲染,然后再把渲染结果交换到屏幕上。
我们把这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区。在默认情况下,OpenGL命令是在后颜色缓冲区进行渲染的。当然。也能够直接在前颜色缓冲区中进行渲染。
若要在前颜色缓冲区中进行渲染,第一种方法是直接告诉OpenGL希望在前颜色缓冲区中进行画图,能够调用以下这个函数来实现这个目的:
void glDrawBuffer(Glenum mode);
假设參数mode指定为GL_FRONT。OpenGL就会在前颜色缓冲区中进行渲染;
假设參数mode指定为GL_BACK,那么渲染将在后颜色缓冲区中进行。
在前颜色缓冲区进行渲染的另外一种方法是在OpenGL被初始化时简单地不要求进行双缓冲区渲染。进行单缓冲区渲染时。假设希望把渲染结果实际绘制到屏幕上,须要调用glFlush()或glFinsh(),这点很重要。
OpenGL实现除了支持单纯的前颜色缓冲区和后颜色缓冲区之外。还支持其它模式,如用于立体渲染的左和右缓冲区以及辅助缓冲区。
深度缓冲区
与颜色缓冲区不同的是,深度缓冲区中所填充的是深度值而不是颜色值。
为了启用深度缓冲区进行深度測试,仅仅须要调用:
glEnable(GL_DEPTH_TEST)。
另外。即使深度缓冲区未被启用,假设深度缓冲区被创建,OpenGL也会把全部写入到颜色缓冲区的颜色片段相应的深度值写入到深度缓冲区中。可是,假设我们希望在进行深度測试时暂时禁止把值写入到深度缓冲区,我们能够使用函数:
void glDepthMask(GLboolean mask);
把GL_FALSE作为參数,经禁止写入深度值,但并不禁止用已经写入到深度缓冲区的值进行深度測试。
把GL_TRUE作为參数。能够又一次启用深度缓冲区的写入。同一时候,这也是默认的设置。
裁剪測试
OpenGL同意在窗体中指定一个裁剪矩形。让渲染仅仅在这个区域内进行。
在默认情况下。裁剪矩形就是窗体的大小。不会进行裁剪測试。
我们能够打开裁剪測试:
glEnable(GL_SCISSOR_TEST)。
在窗体内部运行渲染的那个区域称为裁剪框(scissor box),它使用以下这个函数以窗体坐标的形式指定:
void glScissor(Glint x, Glint y, GLsizei width, GLsizei height);
以下的程序清除了3次颜色缓冲区。每次在清除之前都指定一个更小的裁剪框。形成一组重叠的着色矩形。如图所看到的:
/* 程序清单 3-12
* 2014/5/7
*/
#include
<glut.h>
#include
<math.h>
// 设置渲染状态
void SetupRC()
{
// 设置清除窗体的颜色(黑色背景)
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// 设置画图颜色为绿色
glColor3f(0.0f, 1.0f, 0.0f);
}
// 绘制场景(显示回调函数)
void RenderScene()
{
// 设置清除窗体的颜色(蓝色背景)
glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 把裁剪框设置为一个更小的红色子区域
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
glScissor(100, 100, 600, 400);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);
// 把裁剪框设置为一个更小的绿色子区域
glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
glScissor(200, 200, 400, 200);
glClear(GL_COLOR_BUFFER_BIT);
// 关闭裁剪測试,以便进行下一次渲染
glDisable(GL_SCISSOR_TEST);
glutSwapBuffers();
}
// 当窗体大小改变时由GLUT函数库调用
void ChangeSize(GLsizei w, GLsizei h)
{
// 范围
GLfloat nRange = 100.0f;
// 纵横比
GLfloat aspectRatio;
所除
if (0== h){
h = 1;
}
// 依据窗体大小设置视口
glViewport(0, 0, w, h);
// 选择投影矩阵。并重置坐标系统
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 计算窗体的纵横比(像素比)
aspectRatio = (GLfloat) w / (GLfloat)h;
// 定义裁剪区域(依据窗体的纵横比,并使用正投影)
if (w<=h) {//宽 <高
glOrtho(-nRange, nRange,-nRange /aspectRatio, nRange / aspectRatio, -nRange, nRange);
} else{//宽 >高
glOrtho(-nRange * aspectRatio,nRange *aspectRatio, -nRange, nRange,-nRange, nRange);
}
// 选择模型视图矩阵。并重置坐标系统
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc,char *argv[])
{
// 传递命令行參数,并对GLUT函数库进行初始化
glutInit(&argc, argv);
// 设置创建窗体时的显示模式(双缓冲区、RGB颜色模式)
glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB);
// 设置窗体的初始大小
glutInitWindowSize(800, 600);
// 创建窗体
glutCreateWindow("Bounce");
// 设置显示回调函数
glutDisplayFunc(RenderScene);
// 设置当窗体的大小发生变化时的回调函数
glutReshapeFunc(ChangeSize);
// 设置渲染状态
SetupRC();
// 启动GLUT框架的执行。一经调用便不再返回,直到程序终止
glutMainLoop();
return0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
OpenGL缓冲区的更多相关文章
- OPenGL中的缓冲区对象
引自:http://blog.csdn.net/mzyang272/article/details/7655464 在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的 ...
- 使用 OpenGL API 播放 BIK 视频
BIK作为在游戏中广泛使用的视频格式,这里就非常有必要普及一下了 直接贴代码,看注释吧.有不懂的地方就留言提问吧 /** * * 解码BIK视频文件为像素数据,使用PBO更新OpenGL纹理,绘制纹理 ...
- [转]CUDA和OpenGL互操作的实现及分析
CUDA和OpenGL互操作的实现及分析刘进锋.郭雷(西北工业大学 自动化学院,陕西西安710129) 1 CUDA与OpenGL概述 OpenGL是图形硬件的软件接口,它是在SGI等多家世界著名的计 ...
- cocos2d-x游戏引擎核心(3.x)----启动渲染流程
(1) 首先,这里以win32平台下为例子.win32下游戏的启动都是从win32目录下main文件开始的,即是游戏的入口函数,如下: #include "main.h" #inc ...
- OpenGL学习笔记3——缓冲区对象
在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...
- [原]OpenGL基础教程(五)缓冲区数据更新方式
1.glBufferSubData 适用于相同数据类型 void SetPositionY(float y){ vector<Vector3<float>>::itera ...
- OpenGL顶点缓冲区对象(VBO)
转载 http://blog.csdn.net/dreamcs/article/details/7702701 创建VBO GL_ARB_vertex_buffer_object 扩展可 ...
- OpenGL超级宝典第5版&&缓冲区
缓冲区有很多用途:可以保存顶点数据,像素数据,纹理数据,着色器处理的输入,不同着色器阶段的输出. 缓冲区保存在GPU内存中,提供高速有效的访问. 像素缓冲区对象: GLuint pixBuffer ...
- OpenGL ES 3.0 顶点缓冲区VBO使用
一般情况下数据都是有CPU从RAM取数据 然后传给GPU去处理,相对于GPU速度要慢一些. 使用VBO技术 可以把数据存储到GPU的内存空间中,这样GPU可以直接从GPU的内存中取得数据进行处理 速度 ...
随机推荐
- 【原创】最近写的一个比较hack的小爬虫
目标:爬取爱漫画上面自己喜欢的一个漫画 分析阶段: 0.打开爱漫画主页,迎面就是一坨js代码..直接晕了 1.经过抓包和对html源码的分析,可以发现爱漫画通过另外一个域名发送图片,而当前域名中通过j ...
- bellman_ford算法
给定一个源点,求最短路径,那么存在以源点为根的最短路径树因为最短路径具有最优子结构的性质,所以我们可以先求出树的第一层,然后再求出树的第二层,以此类推bellman_ford算法就是按照这种思想求最短 ...
- volatile解析(转)
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
- 工作经常使用的SQL整理,实战篇(一)
原文:工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实 ...
- REDGATE SQLPROMPT 6.0新功能
原文:REDGATE SQLPROMPT 6.0新功能 REDGATE SQLPROMPT 6.0新功能 下载地址:http://files.cnblogs.com/lyhabc/SQLPrompt6 ...
- ngrok 本机代码部署外网访问神器(转)
背景:听哥们说了个工具ngrok,可以让本机配置的web服务在外网访问,抱着将信将疑的态度试了试,发现还真的可以.下面记录下我自己的安装步骤,另外谈下自己还有些疑问的地方. 参考资料网站:http:/ ...
- 产品经理(五岁以下儿童)myVegas Slots排名上升的秘密
myVEGAS Slots于AppStore上排名在今年也就是2月份时候飙升,那么什么情况导致这个现象的呢,我们试图通过App Annie的分析给出答案. 上面是myVegas的排名情况,我们能够看到 ...
- MySQL 最经常使用的一千行
/* 启动MySQL */ net start mysql /* 连接和断开server */ mysql -h 住址 -P port -u username -p password /* 跳过许可认 ...
- udacity android 学习笔记: lesson 4 part b
udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...
- 给EasyUI的DateBox控件添加清除button
EasyUI中间DateBox控制甚至没有被清除button.例如下面的附图: 真是不可思议,对于要求日期格式必须选择的情况下,不能清空日期,很不方便. 尽管能够通过手工改动EasyU ...