这个函数最近折磨了我很久很久,因为需要用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. sql count 函数用法

    count(*) 会查询所有记录数,,包括为null值的数据: count(column)不会包含 column值为null的情况: count(1) 和 count(*)相同,,不同的是,,mysq ...

  2. delphi 第4课

    try 语句;(正常)except 语句; (意外处理部分) end: 例子: begin sum:=; try n:=strtoint(edit1.Text); except showMessage ...

  3. android Toast提示异常:java.lang.RuntimeException: Can't create handler inside thread that has not called

    Toast只能在UI线程弹出,解决此问题可以在Toast前后加两行代码,如下所示: Looper.prepare(); Toast.makeText(getApplicationContext(),& ...

  4. Bugs Integrated, Inc.

    Bugs Integrated, Inc. 给出一个\(n\times m\)的矩形网格图,给出其中K个障碍物的位置,求其中最多能摆的\(2\times 3\)的矩形的个数,\(n\leq 150,m ...

  5. 【JZOJ6345】ZYB建围墙

    description analysis 打表找规律,自认为样例给的提示很明显 容易想到最优方案是让家庭尽量先围成一个正六边形,剩下的在最外层绕一个圈 手推一波可以知道,如果正六边形有\(n\)层,剩 ...

  6. Pipe进程之间的通信

    #_author:来童星#date:2019/12/11#Pipefrom multiprocessing import Process, Pipedef f(conn): conn.send([42 ...

  7. day31 类的组合及继承,文件目录规范

    Python之路,Day18 = Python基础18-面向对象继承与组合 类的继承 def talk(): print("I am come from talk..a") cla ...

  8. sublime 3打开中文乱码问题

    首先到官网 https://packagecontrol.io/installation#Simple 下载一个控制台支持的扩展包Package Control.sublime-package 在su ...

  9. csps模拟93序列,二叉搜索树,走路题解

    题面: 模拟93考得并不理想,二维偏序没看出来,然而看出来了也不会打 序列: 对a,b数列求前缀和,那么题意转化为了满足$suma[i]>=suma[j]$且$sumb[i]>=sumb[ ...

  10. 出现不不能引java.util.Date包的情况

    出现不不能引java.util.Date包的情况 那个时间段不能引,IDE的bug,等一会儿就好了 心得:很多时候没必要和bug死磕,因为真的不是你的问题.