osg::readPixels,glreadPixels截图,保存图片的alpha不对,总是255(1)
这个函数最近折磨了我很久很久,因为需要用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)的更多相关文章
- flash as3.0 截图保存图片
import flash.display.MovieClip; import flash.events.MouseEvent; import flash.filesystem.*; ///////// ...
- WPF C#截图功能 仿qq截图
原文:WPF C#截图功能 仿qq截图 先上效果图 源码下载地址:http://download.csdn.net/detail/candyvoice/9788099 描述:启动程序,点击窗口butt ...
- UIView的无损截图
UIView的无损截图 说明 1. 烂大街的代码 2. 写成category后,方便直接从drawRect中获取绘制出来的图片 3. 可以直接绘制图片供按钮设置背景图片用 4. 无损截图(包括alph ...
- C#使用WebBrowser对指定网页截图
使用webbrowser获取html,然后输出的位图即可. WebBrowser wb = new WebBrowser(); // 创建一个WebBrowser wb.ScrollBarsEnabl ...
- Alpha项目测试--个人第五次作业
img {border:solid 1px black} 这个作业属于哪个课程 <https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanal ...
- 什么是Alpha通道?
图像处理(Alpha通道,RGB,...)祁连山(Adobe 系列教程)****的UI课程 一个也许很傻的问题,在图像处理中alpha到底是什么? Alpha通道是计算机图形学中的术语,指的是特别的 ...
- Alpha通道
Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区.真正让图片变透明的不是Alpha 实际是Alpha所代表的数值和其他数值做了一次运算 为 ...
- alpha和color key
一.alpha 1.透明度,一般取值0-255 2.Alpha 通道: Alpha 通道是为保存选择区域而专门设计的通道.在生成一个图像文件时,并不必须产生 Alpha 通道.通常它是由人们在图 ...
- Alpha通道是什么意思,和rgb通道有什么区别
Alpha通道是什么意思,和rgb通道有什么区别 Alpha通道: 阿尔法通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明.不透明和半透明区域,其中白表示不透明,黑表示 ...
随机推荐
- Postgraduate
https://account.chsi.com.cn/passport/login?entrytype=yzgr&service=https%3A%2F%2Fyz.chsi.com.cn%2 ...
- SPR, subpixel rendering
参考例子:https://www.grc.com/ctwhat.htm https://en.wikipedia.org/wiki/Subpixel_rendering http://archernz ...
- nginx css,js合并插件,淘宝nginx合并js,css插件
先下载Nginx_concat_module,下载后把它放在/usr/local/src/文件夹中,新建文件夹nginx-http-concat把下载的config ngx_http_concat_ ...
- (转) Mac下面的SecureCRT(附破解方案) 更新到最新的7.3.7
Mac下面的SecureCRT(附破解方案) 更新到最新的7.3.7 转自 http://blog.csdn.net/skykingf/article/details/17450561 http:// ...
- jedis3.1.0在weblogic(jdk1.6)中无法运行
文章目录 错误 探索 总结 错误 在tomcat中运行是没有问题的,可是在weblogic中是不能够运行的,weblogic中的jdk客户要求是1.6的. 如果更换版本jedis2.9.0是没有问题的 ...
- Docker系列(二):Docker基础命令
docker的部署安装(Linux kernel至少3.8以上): yum install docker docker1.8安装:(下面 是两个命令) # cat >/etc/yum.repos ...
- 伪造ip头
x-forwarded-for: 127.0.0.1x-remote-IP: 127.0.0.1x-remote-ip: 127.0.0.1x-client-ip: 127.0.0.1x-client ...
- LVS/Nginx/HAProxy负载均衡器的对比分析
转自:http://www.blogjava.net/ivanwan/archive/2013/12/25/408014.html LVS的特点是: 抗负载能力强.是工作在网络4层之上仅作分发之用,没 ...
- leetcode-第5周双周赛-1136平行课程
方法一: class Solution(object): def minimumSemesters(self, N, relations): """ :type N: i ...
- 三剑客之一------>awk
awk : 一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...