zoukankan      html  css  js  c++  java
  • opengl学习笔记(双缓冲与融合技术)


    今天看了看opengl的融合技术,联系前一段时间老师让我改的一个用他自己的框架实现的3d物体透明融合的程序,感觉到老师说的思路,不可以实现。

    因为三维的透明物体,简单的使用融合功能和融合因子是不够的,三维物体有远近,因此三维物体的绘制过程是利用的是深度缓冲技术。这样的话,对于绘制透明物体与不透明物体,顺序是十分关键的。一般来说,应该先画不透明物体,因为透明物体的绘制需要opengl的融合功能,

    glEnable(GL_BLEND);



    ,但是融合功能一旦启动,会影响后继物体的着色。但是先画不透明物体,又会产生新的问题。因为透明物体往往在不透明物体的前面,所以在深度测试中,透明物体的点会通过测试,所以会绘制新点,而把原来的不透明物体的点覆盖掉。这是,opengl用了一个方法,当画完不透明物体后,立即将深度缓冲进行屏蔽,即修改深度缓冲为只读模式,不能再向深度缓冲中写入信息。这样就避免了不透明物体的深度信息遭到破坏。同时opengl还从深度缓冲中读取深度信息,从而决定了不透明物体哪些点需要进行融合。

    因此总结了采用融合技术绘制三维物体的步骤:

    1.启动深度测试

    glEnable(GL_DEPTH_TEST)



    2.绘制不透明物体

    3.设置深度缓冲为只读模式

    glDepthMask(GL_FALSE)
    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA,GL_ONE)



    4.绘制透明物体

    5.恢复深度缓冲的可写属性

    glDepthMask(GL_TRUE)
    glDisable(GL_BLEND)



    在运用window平台时,需要在PIXELFORMATDESCRIPTOR结构中设置双缓冲。

        static PIXELFORMATDESCRIPTOR pfd={
    sizeof(PIXELFORMATDESCRIPTOR),
    1,
    PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
    PFD_TYPE_RGBA,
    24,
    0,0,0,0,0,0,
    0,
    0,
    0,
    0,0,0,0,
    32,
    0,
    0,
    PFD_MAIN_PLANE,
    0,
    0,0,0
    };

    同时利用SwapBuffer()这个函数进行缓冲的交换,在缓冲交换之前,必须进行同步操作。

    opengl提供了两个同步操作函数glFlush()和glFish()

    glFlush()函数用于表明先前被送到的所有指令必须在有限时间内完成。在网络模式下,该函数可以强制客户端在由命令组成的网络包还没有填满的情况下不等待命令而发送该包,以便绘图工作可以继续进行。而glFinish()则用于强制完成先前所有的指令。

  • 相关阅读:
    maven中使用命令下载指定pom.xml中的jar文件
    资源监控平台
    PerfDog的使用教程
    compile ffmepg with amr
    matplotlib
    总线通信
    阿里云NAS文件迁移项目实践
    React diff算法
    IDE Eval Resetter:JetBrains 全家桶无限试用插件
    IntelliJ IDEA 2021.2.0 官方正版
  • 原文地址:https://www.cnblogs.com/gaoteng/p/2350378.html
Copyright © 2011-2022 走看看