OpenGL学习03_双缓冲DoubleBuffering

OpenGL: DOUBLE_BUFFER DOUBLE_BUFFER的简单理解 阅读详情

双缓冲的是什么?

我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型指针)、宽度、高度、指向新建offscreen数据缓冲区的指针,该缓冲区是一个在函数外创建的offscreen的数据缓冲区,大小是offscreen的高度*宽度*每个像素点数据的大小。闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。

OpenGL中实现双缓冲

OpenGL中并没有直接提供双缓冲的接口,因为并非所有硬件都支持这一技术,并且双缓冲技术的实现是高度依赖于视窗操作系统的,不过GLUT函数库提供了相应的接口,GLUT库解决了平台间差异的问题。

可以通过以下方法来设置窗口的展示模式为双缓冲

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//GLUT_DOUBLE为双缓冲

在需要进行显示变化时交换缓冲区数据

glutSwapBuffers();//交换缓冲区

下面实现了一个矩形的旋转动画,演示了双缓冲的使用。

//
//  main.cpp
//  OpenGL_02_DoubleBuffering
//
//  Created by apple on 14/12/28.
//  Copyright (c) 2014年 cc. All rights reserved.
//

#include <iostream>
//GLUT库,提供一套兼容各种操作系统的OpenGL的图形UI接口
#include <GLUT/GLUT.h>

static GLfloat spin = 0.0f;

/**
 * 初始化操作
 */
void init() {
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    //设置着色模式,GL_FLAT 采用恒定着色,使用图元中某个顶点的颜色来渲染整个图元。
    glShadeModel(GL_FLAT);
}

/**
 *  展示绘制效果
 */
void display() {
    //清理颜色缓冲区
    glClear(GL_COLOR_BUFFER_BIT);
    //将当前矩阵压入栈中保存
    glPushMatrix();
    //设置颜色
    glColor3f(1.0f, 0.0f, 0.0f);
    //旋转操作,绕z轴旋转spin度
    glRotatef(spin, 0.0f, 0.0f, 1.0f);
    //构造一个矩形
    glRectf(-25.0f, -25.0f, 25.0f, 25.0f);
    //还原绘制变换前的矩阵
    glPopMatrix();
    //交换缓冲区,将正在显示的颜色缓冲区和正在绘制的颜色缓冲区数据交换
    glutSwapBuffers();
}

/**
 *  调整窗口尺寸
 *
 *  @param width  宽度
 *  @param height 高度
 */
void reshape(int width, int height) {
    //设置视口矩形区域,在默认情况下,视口被设置为占据打开窗口的整个像素矩形
    glViewport(0, 0, (GLsizei)width, (GLsizei)height);
    //对投影矩阵应用随后的矩阵操作
    glMatrixMode(GL_PROJECTION);
    //等于是将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵!等于是之前的矩阵变换带来的影响到此为止了!
    glLoadIdentity();
    //设置裁剪坐标系
    glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, -1.0f, 1.0f);
    //对模型视图矩阵应用随后的矩阵操作
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

/**
 *  播放旋转动画
 */
void spinDisplay() {
    spin += 3.0f;
    if (spin > 360.0f) {
        spin -= 360.0f;
    }
    
    //标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板。多次调用glutPostRedisplay,在下一个显示回调只产生单一的重新显示回调。
    glutPostRedisplay();
}

/**
 *  鼠标事件回调
 *
 *  @param button 按钮
 *  @param state  状态
 *  @param x      x
 *  @param y      y
 */
void mouse(int button, int state, int x, int y) {
    switch (button) {
        //按下鼠标左键
        case GLUT_LEFT_BUTTON:
            if (state == GLUT_DOWN) {
                //设置全局的回调函数,当没有窗口事件到达时,GLUT程序功能可以执行后台处理任务或连续动画。如果启用,这个idle function会被不断调用,直到有窗口事件发生。
                //播放旋转动画
                glutIdleFunc(spinDisplay);
            }
            break;
        //按下鼠标右键
        case GLUT_RIGHT_BUTTON:
            if (state == GLUT_DOWN) {
                //停止函数的回调
                //停止旋转动画
                glutIdleFunc(nullptr);
            }
        default:
            break;
    }
}

int main(int argc, const char * argv[]) {
    
    //初始化GLUT库
    glutInit(&argc, (char**)argv);
    //设置双缓冲,RGB像素格式的窗口
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    //设置窗口大小
    glutInitWindowSize(250, 250);
    //创建窗口
    glutCreateWindow("Double Buffer");
    
    //初始化操作
    init();
    
    //设置展示的回调方法
    glutDisplayFunc(display);
    //设置窗口改变时的回调方法
    glutReshapeFunc(reshape);
    //设置鼠标事件回调方法
    glutMouseFunc(mouse);
    //绘制线程开始循环
    glutMainLoop();
    
    return 0;
}

本文由CC原创总结,如需转载请注明出处:http://blog.youkuaiyun.com/oktears/article/details/42217469

OpenGL 双重缓冲实例 在 OpenGL 中,双重缓冲是一种提高渲染效率的技术。它用于避免当前正在显示的图像被修改,保持屏幕画面的稳定性。在每次渲染结束后,绘制的图像都会保存在一个离屏的缓存中,并在下一次渲染时将其加载到屏幕上。这样,用户就能够看到完整的渲染效果,而不是一个不断刷新的图像。在上面的代码中,我们首先清除屏幕颜色,并将背景色设置为黑色。接着,我们绘制一个红色的三角形,然后通过。总之,双重缓冲是 OpenGL 中一个非常重要的概念。本文所提供的示例演示了如何使用它来提高渲染效率。函数将它切换到下一个缓存中。 阅读详情

相关推荐

使用OpenGL实现双缓冲技术的示例程序

这个示例程序创建了一个OpenGL窗口,并使用双缓冲技术来消除图形闪烁。在渲染循环中,我们首先清空屏幕颜色缓冲,然后使用着色器程序绘制三角形,并最后交换前后缓冲,从而实现双缓冲。双缓冲技术在计算机图形学中被广泛使用,它能够消除图形闪烁和不平滑的问题。在OpenGL中,我们可以使用双缓冲技术来实现流畅的图形渲染。本文将演示一个使用OpenGL实现双缓冲技术的示例程序,并提供相应的源代码。希望这个示例程序能够帮助你理解如何使用OpenGL实现双缓冲技术。如果你有任何问题,请随时提问。

2301_79331328的博客 458

windows - GDI 和 opengl 双缓冲

GDI概述 GDI在全称是Graphics Device Interface,即图形设备接口。是图形显示与实际物理设备之间的桥梁。GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作 先上一个图,窗口渲染的过程,自己的理解可能有问题 1.1 GDI 函数 GDI函数大致可分类为: 设备上下文函数(如GetDC、CreateDC、DeleteDC) 画线函数(如LineTo、Polyline、Arc) 填充画图函数(如Ellipse、FillRect、Pie) 画图属性函数(

tuan8888888的博客 2286

OpenGL双缓冲技术实践与示例代码

本文还有配套的精品资源,点击获取 简介:OpenGL双缓冲技术用于提高图形渲染效率和质量,防止画面闪烁,尤其适用于游戏开发、3D建模等领域。本技术通过使用两个帧缓冲区来防止显示问题,并通过垂直同步(V-Sync)确保画面平滑过渡。在VC++环境下,实现OpenGL双缓冲涉及创建OpenGL上下文、配置双缓冲、设置窗口大小、执行渲染操作、交换缓冲区以及清理释放资源。本简介提供...

weixin_28933797的博客 1571

OpenGL笔记(一)

今天要讲的是动画制作,想必大家都知道电影和动画的工作原理吧?是的,快速的把看似连续的画面一幅幅的呈现在人们面前。一旦每秒钟呈现的画面超过24幅,人们就会错以为它是连续的。 1、双缓冲技术 在计算机上的动画与实际的动画有些不同:实际的动画都是先画好了,播放的时候直接拿出来显示就行。计算机动画则是画一张,就拿出来一张,再画下一张,再拿出来。如果所需要绘制的图形很简单,那么这样也没什么问题。但一旦图

微浪游戏 1033

全在这了!全国分省90米、30米、12.5米、5米DEM高程模型数据下载方式汇总

全在这了!全国分省90米、30米、12.5米、5米DEM高程模型数据下载方式汇总 SRTM15(450米)免费下载 https://pan.baidu.com/s/1eO0U6wfzs7YSe2EQdxRJ2Q提取码:o7am GMTED(250米)免费下载 https://pan.baidu.com/share/init?surl=nrbbdbhyNVQV46XwqzqLlg 提取码:V7X9 SRTM3 (90米)免费下载 https://pan.baidu.com/share/..

TuxinyunGIS的博客 1万+

保姆级教程:用Wireshark抓包分析10M汽车以太网PLCA轮询机制(附pcap文件)

本文详细介绍了10M汽车以太网PLCA轮询机制的抓包分析与性能优化方法。通过Wireshark实战教程,解析PLCA协议的时分多址特性、总线型拓扑结构及带宽优化策略,帮助工程师提升车内网络的可靠性和实时性。附赠pcap文件供实践参考。

wdx01234567的博客 240

OpenGL编程指南4:双缓冲实现运行

1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法。 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数。 2.OpenGL编程及程序剖析 /**************************************************************** *Rendering a rotating squa

沈春旭的博客 5290

用Codex自动化挖掘电梯行业外贸客户:从关键词到22维深度分析

在B2B外贸客户开发中,精准定位垂直行业潜在客户是核心挑战。传统手动搜索效率低下,而数据驱动的工作流正成为解决方案。其原理在于将模糊的业务需求转化为机器可识别的结构化查询,通过组合行业核心关键词(如“Elevator Manufacturer”、“Elevator Maintenance”)与商业角色描述,系统性地从海量数据中筛选目标。这种自动化抓取技术的价值在于,它不仅生成客户名单,更通过多维数据分析(如公司规模、业务标签、数字足迹)构建初步的客户画像,为后续的优先级排序和个性化触达提供情报基础。在工业制

weixin_34054866的博客 455

android OpenGL ES详解——双缓冲区、默认缓冲区和帧缓冲区

在Android OpenGL中,双缓冲、默认缓冲和自定义帧缓冲(Frame Buffer Object,FBO)是图形渲染中的重要概念,它们各自承担着不同的角色和功能,同时又相互关联。双缓冲双缓冲是图形渲染中的一种常用技术,它使用两个缓冲区来存储图像数据。在OpenGL窗口中,通常有一个前缓冲(Front Buffer)和一个后缓冲(Back Buffer)。前缓冲是用户当前看到的图像,而后缓冲则是下一帧将要显示的图像。当一帧图像渲染完成后,后缓冲和前缓冲会进行交换,这样用户就能看到新的图像。

闲暇部落 2303

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 477

液冷方式介绍

如果将直径在1~100nm的颗粒悬置在传热流体(例如:水、乙烯、乙二醇等)中时,其传热能力会得到提升,因为大多数固体材料的热导率要大于液体,因此由颗粒、流体组成的混合物热导率也高于液体本身的热导率,由此制成的流体,我们称之为纳米流体。金属冷管的液体工质蒸散量几乎为0,而柔软材质的管道则会产生液体的蒸散,在封闭式循环系统中,为了弥补液体工质的蒸散,必须定期在系统中补充液体工质。——我们之前说过,材料的导电和导热的机制大致是类似的,所以导电能力更强的金属往往具有更好的导热能力。

制冷技术咨询与服务的博客 2049

opengl中的双缓冲技术

所谓双缓冲技术,是指两个缓冲区:前台缓冲和后台缓冲。前台缓冲即我们看到的屏幕, 后台缓冲则在内存当中,对我们来说是不可见的。每次我们绘图都在后台缓冲中进行的, 当绘图完成时,就必须把绘制的最终结果复制到屏幕上。在opengl中glutSwapBuffers函数就 可以实现双缓冲技术的一个重要函数。该函数的作用就是交换两个缓冲区的指针,从而把绘制 结果图复制到屏幕上,从而使用户可见。否则在后

留恋凡间事 7478

set_output_delay的本质

set_output_delay的本质

qq_33300585的博客 3390

OpenGL中实现双缓冲技术的方法

OpenGL中实现双缓冲技术的三种方法是这样的 1.调用glutDisplayFunc(display)回调函数时, 在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针。 2.这种方法是大家经常用的吧glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);GLUT_DOUBLE,使用双缓冲而不是单缓冲。 3.调用glutId

wenceng9的专栏 2718

别再对着数据手册发愁了!用HFSS 2023 R2搞定ESP32-C3板载天线的阻抗匹配

本文详细介绍了如何利用HFSS 2023 R2进行ESP32-C3板载天线的阻抗匹配优化,解决实际PCB设计中常见的性能偏差问题。通过智能模型导入、科学参数扫描和量化优化流程,显著提升天线性能,适用于WIFI和蓝牙应用场景。

weixin_42523543的博客 448

单相PWM整流器四象限运行原理

简述单相PWM整流器四象限运行原理。

m0_75208156的博客 8304

OpenGL双缓冲机制详解:原理、实现与优化

OpenGL双缓冲机制通过前缓冲显示和后缓冲绘制的方式解决画面闪烁问题。文章详细介绍了双缓冲的工作原理,包括初始化设置、缓冲交换机制和垂直同步技术,并探讨了高级缓冲技术如三重缓冲和多线程渲染。针对常见问题如画面撕裂和交换延迟提供了解决方案,同时给出了性能优化建议。文章指出,虽然现代图形API有所演进,但双缓冲的核心思想仍是实现流畅视觉体验的基础技术。开发者应合理选择缓冲策略以优化图形应用性能。

软件科学-郝学胜 1150

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

学习OpenGL(二)双缓冲绘图

【前言】 上一节中我们使用的glut,当时不太理解为什么学opengl非得用这个开发包,后来看完第一章才明白。 由于opengl是跨平台的,并且用于窗口界面中的绘制。但窗口与系统有关心,那么将无法统一,所以opengl是核心库,它只负责绘制。窗口操作交给其他程序接口去负责,windows上使用了glut来封装opengl使其能与系统交互。 以上是个人理解,仅供参考。 【正文】 上一节中我

幸福官的博客 7433

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OpenGL学习笔记(十六)缓冲区(一)像素缓冲区

像素缓冲区PBO glReadPixels GL_PIXELS_UNPACK_BUFFER关联关系及用法

whl0071的专栏 1976

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

动画=重绘+交换

glutPostRedisplay 标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板。多次调用glutPostRedisplay,在下一个显示回调只产生单一的重新显示回调。 在OpenGL中实现双缓冲技术的一种简单方法: 1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glu

u013682388的专栏 556

OpenGL--双缓冲

双缓冲 就是先将图片绘制到后台缓冲区,然后再交换到前台缓冲区显示。为什么要这么做?一种解释是我们的渲染一般是多线程处理,如果直接绘制到屏幕显示,有可能会出现一张图片还只绘制一部分而下一张又来了的情况,使屏幕看上去在抖动的感觉。所以增加一个后台缓冲区,先绘制到后台,然后直接整张完整的图交换到前台,这样就可以流畅的显示了。 实例代码 #include "GLTools.h" #include "GLS

疯狂的程序员 3795

双缓冲(double buffering)的原理和使用

最近在使用C#做项目的时候发现在加载一个具有大量控件和复杂背景图形的窗口时,会出现很影响视觉体验的频闪问题。最后发现使用双缓冲能很好的解决这个问题。下面就介绍一下双缓冲的原理及使用。一、双缓冲作用          双缓冲甚至是多缓冲,在许多情况下都很有用。一般需要使用双缓冲区的地方都是由于“生产者”和“消费者”供需不一致所造成的。这样的情况在很多地方后可能会发生,使用多缓冲可以很好的解决。我举几

Christian的博客 8507

OpenGL的glfw创建窗口提示各个函数的设置

学习Window creation hints 涉及的相关函数有: glfwInit();每次用glfwInit初始化库时,提示都被设置为默认值。 glfwWindowHint();设置整数值提示 glfwWindowHintString();设置字符串值提示 glfwDefaultWindowHints();将会所有提示重置设置为默认值 glfwCreateWindow();创建窗口; 以下提示...

weixin_42785489的博客 1834

[OpenGL学习笔记] 窗口的创建&简单响应, 双缓冲的机理

应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。为了规避这些问题,我们应用双缓冲渲染窗口应用程序。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了,有效防止了显示图形时的闪烁延迟等不良体

☆迷茫Dog的秘密基地☆ 1000

OpenGL中的缓冲区

OpenGL中的缓冲区 颜色缓冲区          OpenGL在绘制图元时,先是在一个缓冲区中完成渲染,然后再把渲染结果交换到屏幕上。我们把这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区。在默认情况下,OpenGL命令是在后颜色缓冲区进行渲染的。当然,也可以直接在前颜色缓冲区中进行渲染。          若要在前颜色缓冲区中进行渲染,第一种方法是直接告诉OpenGL希望在前

清道夫的专栏(3D程序员,炼心,终生编程) 1万+
上一篇: OpenGL学习02_函数语法与命名规范
下一篇: OpenGL学习04_点画模式(点画线)
cc4Java
博客等级 码龄15年 69粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值