这个函数最近折磨了我很久很久,因为需要用osg截图保存到本地,但是这个图片要具有alpha值,也就是背景的alpha值全为0,但是在公司上用_image->readPixels(448, 28, 1024, 1024, GL_RGBA, GL_UNSIGNED_BYTE);截图出来的是成功有alpha值的,但是就是alpha值全为255(1),因为1个alpha值是8位,全1的话就是255,也就是背景全不透明,但是我的要求是背景透明,截图中的物体不透明,然后千方百计试,试了FBO(帧缓存对象),也就是OSG里面的渲染到纹理的做法,确实成功,但是不好调节渲染相机的几个矩阵,这里有类似的源码http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1703&highlight=%E4%D6%C8%BE%B5%BD%CE%C6%C0%ED&_dsign=f8f30f82,太麻烦对我来说就放弃了,最后一想,怎么可能readPixels这个函数不能截出alpha值,于是在网上搜,百度硬是不出来,google也出不来,最后用英文搜google,出来了,找到原因了,如下:

https://www.opengl.org/discussion_boards/showthread.php/152623-Why-glReadPixels-always-read-alpha-value-as-255

https://www.gamedev.net/forums/topic/136637-glreadpixels-amp-alpha-values/

也就是说没有设置好cAlphaBits这个值,导致出错,我查看了一下osg::GraphicsContext源码,它默认R,G,B都是8,A是0,于是我在自己的代码里重新设置了一个gc,如下:

osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;

//屏幕分辨率

traits->width = 1920;
traits->height = 1080;
//支持窗口扩展,默认是不支持的
traits->windowDecoration = true;
//支持双缓存,默认不支持
traits->doubleBuffer = true;
traits->sharedContext = 0;
traits->red = 8;
traits->blue = 8;
traits->green = 8;
//支持alpha,默认不支持为0,这里改为支持,使截出来的图片具有alpha值
traits->alpha = 8;

osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
if (gc.valid())
{
std::cout << "create" << std::endl;
}
double fovy, aspectRatio, zNear, zFar;
viewer->getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar);
double newAspectRatio = double(traits->width) / double(traits->height);
double aspectRatioChange = newAspectRatio / aspectRatio;
if (aspectRatioChange!=1.0)
{
viewer->getCamera()->getProjectionMatrix() *= osg::Matrix::scale(1.0 / aspectRatioChange, 1.0, 1.0);
}
viewer->getCamera()->setViewport(0, 0, 1920, 1080);
viewer->getCamera()->setGraphicsContext(gc.get());

然后readPixels出来的图片就有正确的alpha值的,感谢google,英文太差不行啊~~~!!!!!!

osg::readPixels,glreadPixels截图,保存图片的alpha不对,总是255(1)的更多相关文章

  1. flash as3.0 截图保存图片

    import flash.display.MovieClip; import flash.events.MouseEvent; import flash.filesystem.*; ///////// ...

  2. WPF C#截图功能 仿qq截图

    原文:WPF C#截图功能 仿qq截图 先上效果图 源码下载地址:http://download.csdn.net/detail/candyvoice/9788099 描述:启动程序,点击窗口butt ...

  3. UIView的无损截图

    UIView的无损截图 说明 1. 烂大街的代码 2. 写成category后,方便直接从drawRect中获取绘制出来的图片 3. 可以直接绘制图片供按钮设置背景图片用 4. 无损截图(包括alph ...

  4. C#使用WebBrowser对指定网页截图

    使用webbrowser获取html,然后输出的位图即可. WebBrowser wb = new WebBrowser(); // 创建一个WebBrowser wb.ScrollBarsEnabl ...

  5. Alpha项目测试--个人第五次作业

    img {border:solid 1px black} 这个作业属于哪个课程 <https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanal ...

  6. 什么是Alpha通道?

    图像处理(Alpha通道,RGB,...)祁连山(Adobe 系列教程)****的UI课程 一个也许很傻的问题,在图像处理中alpha到底是什么?  Alpha通道是计算机图形学中的术语,指的是特别的 ...

  7. Alpha通道

     Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区.真正让图片变透明的不是Alpha 实际是Alpha所代表的数值和其他数值做了一次运算  为 ...

  8. alpha和color key

    一.alpha 1.透明度,一般取值0-255 2.Alpha 通道:    Alpha 通道是为保存选择区域而专门设计的通道.在生成一个图像文件时,并不必须产生 Alpha 通道.通常它是由人们在图 ...

  9. Alpha通道是什么意思,和rgb通道有什么区别

    Alpha通道是什么意思,和rgb通道有什么区别 Alpha通道: 阿尔法通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明.不透明和半透明区域,其中白表示不透明,黑表示 ...

随机推荐

  1. python中map函数的用法

    map函数类似一个生成器 具体用例如下: def add(x): a =[,,] b = map(add,[,,]) print( list(map(add,[,,])) ) print(b,type ...

  2. leetcode-第10周双周赛-5099验证回文字符串③

    题目描述: 方法:动态规划 class Solution: def isValidPalindrome(self, s: str, k: int) -> bool: def isKPalRec( ...

  3. 客户端app支付宝登录接口

    如下内容: $url = 'apiname=com.alipay.account.auth&app_id=APP内容&app_name=mc&auth_type=AUTHACC ...

  4. Altera设置Virtual Pin

    1,GUI方式 大家都知道的,assignment editor –> category –> logic options –> to –> virtual pin –> ...

  5. 校园商铺-2项目设计和框架搭建-8升级mysql驱动相关的配置以支持mysql8

    1.如何升级驱动 1.1步骤: a 确保当前程序能正常访问数据库 b 更新mysql驱动重新运行程序进行校验 maven依赖https://mvnrepository.com/artifact/mys ...

  6. CSS——滑动门技术及应用

    先来体会下现实中的滑动门,或者你可以叫做推拉门: 滑动门出现的背景 制作网页时,为了美观,常常需要为网页元素设置特殊形状的背景,比如微信导航栏,有凸起和凹下去的感觉,最大的问题是里面的字数不一样多,咋 ...

  7. 软件设计师_朴素模式匹配算法和KMP算法

    1.从主字符串中匹配模式字符串(暴力匹配) 2. KMP算法

  8. 阿里云图数据库GraphDB上线,助力图数据处理

    GraphDB简介 GraphDB图数据库适用于存储,管理,查询复杂并且高度连接的数据,图库的结构特别适合发现大数据集下数据之间的共性和特性,特别善于释放蕴含在数据关系之间的巨大价值.GraphDB引 ...

  9. thinkphp 空控制器

    空控制器的概念是指当系统找不到请求的控制器名称的时候,系统会尝试定位空控制器(EmptyController),利用这个机制我们可以用来定制错误页面和进行URL的优化. 大理石平台价格表 现在我们把前 ...

  10. retired!

    退役啦!估计不会再更新了,终于在大四拿到了icpc,ccpc,省赛,邀请赛金,也算是圆满了!