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缓冲区的更多相关文章

  1. OPenGL中的缓冲区对象

    引自:http://blog.csdn.net/mzyang272/article/details/7655464 在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的 ...

  2. 使用 OpenGL API 播放 BIK 视频

    BIK作为在游戏中广泛使用的视频格式,这里就非常有必要普及一下了 直接贴代码,看注释吧.有不懂的地方就留言提问吧 /** * * 解码BIK视频文件为像素数据,使用PBO更新OpenGL纹理,绘制纹理 ...

  3. [转]CUDA和OpenGL互操作的实现及分析

    CUDA和OpenGL互操作的实现及分析刘进锋.郭雷(西北工业大学 自动化学院,陕西西安710129) 1 CUDA与OpenGL概述 OpenGL是图形硬件的软件接口,它是在SGI等多家世界著名的计 ...

  4. cocos2d-x游戏引擎核心(3.x)----启动渲染流程

    (1) 首先,这里以win32平台下为例子.win32下游戏的启动都是从win32目录下main文件开始的,即是游戏的入口函数,如下: #include "main.h" #inc ...

  5. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  6. [原]OpenGL基础教程(五)缓冲区数据更新方式

    1.glBufferSubData 适用于相同数据类型 void SetPositionY(float y){    vector<Vector3<float>>::itera ...

  7. OpenGL顶点缓冲区对象(VBO)

    转载 http://blog.csdn.net/dreamcs/article/details/7702701 创建VBO        GL_ARB_vertex_buffer_object 扩展可 ...

  8. OpenGL超级宝典第5版&&缓冲区

    缓冲区有很多用途:可以保存顶点数据,像素数据,纹理数据,着色器处理的输入,不同着色器阶段的输出. 缓冲区保存在GPU内存中,提供高速有效的访问.   像素缓冲区对象: GLuint pixBuffer ...

  9. OpenGL ES 3.0 顶点缓冲区VBO使用

    一般情况下数据都是有CPU从RAM取数据 然后传给GPU去处理,相对于GPU速度要慢一些. 使用VBO技术 可以把数据存储到GPU的内存空间中,这样GPU可以直接从GPU的内存中取得数据进行处理 速度 ...

随机推荐

  1. Linux下的下载工具介绍----aria2

    ariac 项目地址:http://aria2.sourceforge.net/ 下载地址:http://sourceforge.net/projects/aria2/files/stable/ari ...

  2. Android DrawerLayout 抽屉

    Android DrawerLayout 抽屉 DrawerLayout 在supportV4 Lib在.类似的开源slidemenu如,DrawerLayout父类ViewGroup,自定义组件基本 ...

  3. Java 过滤器的作用

    Servlet API 非常久曾经就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充.在 J2EE 探索者 系列文章的最后一篇中,作者 Kyle Gabhar ...

  4. 插入排序java

    插入排序简述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据.   第一个元素是有序队列,从第二个元素开始向有序队列中插入,插入完成后将第三个元素向 ...

  5. 【原创】纯OO:从设计到编码写一个FlappyBird (一)

    说起来,自学计算机也有2年多的时间了,自己还没有从设计到编码,完完整整的设计一个基于面向对象的软件的经历..囧 于是,就有了这个系列.首先选用的语言是Java,没别的原因,HeadFirst设计模式是 ...

  6. C#改动文件或目录的权限,为指定用户、用户组加入全然控制权限

    C#改动文件或文件夹的权限,为指定用户.用户组加入全然控制权限 //给Excel文件加入"Everyone,Users"用户组的全然控制权限 FileInfo fi = new F ...

  7. jvm调音

    jvm性能调优的目地:1)控制jvm的堆栈大小.比方当你的程序年轻代对象在某个时间段产生的比較多的时候,就须要控制年轻代的堆大小. 同一时候还要控制总的JVM大小避免内存溢出 2)控制GC的行为. G ...

  8. Java OCR tesseract 图像智能字符识别技术

    公司有需求啊,所以就得研究哈,最近公司需要读验证码,于是就研究起了图像识别,应该就是传说中的(OCR:光学字符识别OCR),下面把今天的收获整理一个给大家做个分享. 本人程序用的tesseract,官 ...

  9. 从一开始,说出事java匿名内部类

    java内部类.匿名类原本以为它们的使用已经很滑, 成绩, 就在昨天晚上12指向时钟发生重大事故.事故的严重程度再说吧,那是因为我没有睡一晚睡眠. 那以下先用一段模拟代码来描写叙述下我出现的问题的: ...

  10. [WPF]静态资源(StaticResource)和动态资源(DynamicResource)

    一.文章概述 本演示介绍WPF基本采用静态和动态的资源.而且两者都做一个简单的比较. 静态资源(StaticResource)指的是在程序加载内存时对资源的一次性使用,之后就不再訪问这个资源了:动态资 ...