OpenGL 中glMapBufferRange 使用

        今天简单记录glMapBufferRange例子,不多写了,这个函数的目的就是链接buffer中的数据可以访问,并在外边改变数据。

        glMapBufferRange — 映射缓冲区对象的数据存储区的一部分

        GL_MAP_READ_BIT指示返回的指针可用于读取缓冲区对象数据。如果使用指针查询不包含该标志的映射,则不会产生GL错误,但是结果是不确定的,并且可能发生系统错误(可能包括程序终止)。

        GL_MAP_WRITE_BIT指示返回的指针可用于修改缓冲区对象数据。如果使用指针修改不包含该标志的映射,则不会产生GL错误,但是结果是不确定的,并且可能发生系统错误(可能包括程序终止)。

         GL_MAP_INVALIDATE_RANGE_BIT表示指定范围的先前内容可能会被丢弃。除随后写入的数据外,未定义此范围内的数据。如果后续的GL操作访问未写入的数据,则不会产生GL错误,但是结果是不确定的,并且可能发生系统错误(可能包括程序终止)。该标志不能与GL_MAP_READ_BIT结合使用。

        GL_MAP_INVALIDATE_BUFFER_BIT指示可以丢弃整个缓冲区的先前内容。除随后写入的数据外,整个缓冲区内的数据均未定义。如果后续的GL操作访问未写入的数据,则不会产生GL错误,但是结果是不确定的,并且可能发生系统错误(可能包括程序终止)。该标志不能与GL_MAP_READ_BIT结合使用。

        GL_MAP_FLUSH_EXPLICIT_BIT指示可以修改映射的一个或多个离散子范围。设置此标志后,必须通过调用glFlushMappedBufferRange显式清除对每个子范围的修改。如果修改了映射的子范围并且未刷新,则不会设置GL错误,但是未定义缓冲区相应子范围内的数据。该标志只能与        GL_MAP_WRITE_BIT一起使用。当选择此选项时,刷新将严格限于取消映射之前对glFlushMappedBufferRange的调用明确指示的区域;如果未选择此选项,则glUnmapBuffer会在调用时自动刷新整个映射范围。

        GL_MAP_UNSYNCHRONIZED_BIT指示GL在从glMapBufferRange返回之前,不应尝试对缓冲区上的未决操作进行同步。如果源或修改缓冲区的挂起操作与映射区域重叠,但是未定义此类先前操作和任何后续操作的结果,则不会生成GL错误。

代码部分:

#include "bkqopenglw.h"
#include<QDebug>

BKQOpenglW::BKQOpenglW(QWidget *parent) : QOpenGLWidget(parent)
{
       initTemp();
}

void BKQOpenglW::initTemp()
{
    for(uint i =0; i<sizeof(temp);i++)
    {
        temp[i]=i&0xff;
    }

     for(uint i =0; i<100;i++)
     {
        copyData[i] = 1;
     }
}

void BKQOpenglW::mapRead(GLenum target, GLintptr offset, GLsizeiptr length)
{
   void *ptr;
   ptr = glMapBufferRange(target,offset,length,GL_MAP_READ_BIT);
   //qDebug()<<"ptr adress is  " << ptr << endl;
   qDebug("ptr adress is 0X%x",ptr);

   uint8_t * pdata = (uint8_t*)ptr;
//   pdata[0] = 2;
   for (uint i =0; i<length;i++) {
        qDebug()<< pdata[i] <<" ";
   }
   glUnmapBuffer(GL_ARRAY_BUFFER);
//   ptr = glMapBufferRange(target,offset,length,GL_MAP_READ_BIT);
//   printfData(ptr, length);
//   glUnmapBuffer(GL_ARRAY_BUFFER);


}

void BKQOpenglW::printfData(void *data, int length)
{
     uint8_t * pdata = (uint8_t*) data;
     for (uint i =0; i<length+10;i++) {
          qDebug()<< pdata[i] <<" ";
     }
}

void BKQOpenglW::initializeGL()
{
    initializeOpenGLFunctions();
    glGenBuffers(1,&VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER,sizeof (temp), temp,GL_STATIC_DRAW);

    void *ptr;
    ptr = glMapBufferRange(GL_ARRAY_BUFFER,0,100,GL_MAP_WRITE_BIT);
    memcpy(ptr,copyData,100);
    glUnmapBuffer(GL_ARRAY_BUFFER);

    mapRead(GL_ARRAY_BUFFER,0,100);

    //test 2   GL_MAP_INVALIDATE_RANGE_BIT
    ptr = glMapBufferRange(GL_ARRAY_BUFFER,0x100,100, GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_RANGE_BIT);
    printfData(ptr, 100);
    memcpy(ptr,copyData,100);
    glUnmapBuffer(GL_ARRAY_BUFFER);

    mapRead(GL_ARRAY_BUFFER,0x100,100);


    //test 3
    ptr = glMapBufferRange(GL_ARRAY_BUFFER,0x200,100, GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_BUFFER_BIT);
    printfData(ptr, 100);
    memcpy(ptr,copyData,100);
    glUnmapBuffer(GL_ARRAY_BUFFER);

    mapRead(GL_ARRAY_BUFFER,0x200,500);

    //test 4
    ptr = glMapBufferRange(GL_ARRAY_BUFFER,0x300,100, GL_MAP_WRITE_BIT|GL_MAP_UNSYNCHRONIZED_BIT);

    qDebug("ptr adress is 0X%x",ptr);
    printfData(ptr, 200);
    memcpy(ptr,copyData,200);
    glUnmapBuffer(GL_ARRAY_BUFFER);

    mapRead(GL_ARRAY_BUFFER,0x300,200);

//     //test 5
    ptr = glMapBufferRange(GL_ARRAY_BUFFER,0x400,100, GL_MAP_WRITE_BIT|GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
    printfData(ptr, 200);
    glFlushMappedBufferRange(GL_ARRAY_BUFFER,0,50);
    memcpy(ptr,copyData,200);
    glUnmapBuffer(GL_ARRAY_BUFFER);

    mapRead(GL_ARRAY_BUFFER,0x400,200);

}

void BKQOpenglW::resizeGL(int w, int h)
{
       glViewport(0,0,w,h);
}

void BKQOpenglW::paintGL()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值