MyGUI 中RTT 纹理在OSG中显示发转的问题

来源:互联网 发布:微信公众号支付java 编辑:程序博客网 时间:2024/04/29 20:51

这几天在研究MyGUI中RTT后纹理在OSG中贴图,经过一番研究,发现在OSG中是反转的,百思不得其解

MyGUI <wbr>中RTT <wbr>纹理在OSG中显示发转的问题

中间是MyGUI RTT后在MyGUI中的显示,右面是MyGUI后在OSG中的显示,可以看出其实就是纹理坐标V反了。

开始各种搜,以为是MyGUI RTT FBO设置了什么玩意,发现没有啊,都是正常步骤,后来又看是否是纹理设置问题,也没找到原因,最后终于发现了端倪,在MyGUI_OpenGLRTTexture.cpp83行 glOrtho(-1, 1, 1, -1, -1, 1);看见了吧,y的范围设置了1,-1,与我们平常设置的相反。

 

知道原因后,我就改为了正常的(-1,1),的确,是这句的原因,在OSG里面显示正常了,但MyGUI中显示反了。果然人家的代码还是不要轻易改啊!

 

本来找到问题后,我在OSG端发转一下就完事了,但是为何MyGUI会这样弄呢,它又是怎么反回去的,初始想到的肯定就是它在某处自己反转了一下像素,但是不对啊,这是RTT的,是存在GPU端的,不会读出来改了再存进去吧!那肯定就是纹理坐标的问题了,果然我找出了一些依据

在MyGUI_CommonStateInfo.h中45行(CoordConverter::convertTextureCoord(coord,size);)在MyGUI_CoordConvert.h 20-28行

static FloatRect convertTextureCoord(const IntCoord& _coord,const IntSize& _textureSize)
  {
   if(!_textureSize.width || !_textureSize.height) returnFloatRect();
   returnFloatRect(
    (float)_coord.left/ (float)_textureSize.width,
    (float)_coord.top/ (float)_textureSize.height,
    (float)_coord.right()/ (float)_textureSize.width,
    (float)_coord.bottom()/ (float)_textureSize.height);
  }

 

看到了吧,由于MyGUI是把左上角点当成原点,所以左上角纹理坐标为(0,0),右下角为(1,1),v坐标刚好与我们在OSG、OpenGL中相反,MyGUI为什么这样弄的原因,我想应该是读取图片时候读取顺序的问题,它应该是从上往下,从左到右读取了直接顺序存储了,所以左上点就是原点。到底是不是,由于时间关系,就不去追究了,唉,又周五了,怎么向头汇报工作呢,都倒腾这些东西了。。。。

 

0 0
原创粉丝点击