QT里使用opengl进行纹理贴图(获取摄像机数据后直接当做纹理载入)的问题

u010482864 2014-01-07 04:11:42
使用QT进行纹理贴图,过程如下:开两个线程获取激光数据和相机拍到的图片数据(QImage格式),在第3个线程里进行数据匹配,每两条激光数据对应一张图片,然后两组激光数据和一张图片数据作为QVector传给继承自QWidget的类,进行纹理贴图。接收数据的函数里同时进行纹理绑定,在paintGL()里使用绑定了的纹理,程序正常运行,但是却画不出图来,有哪位高手能帮忙看一下问题在哪里。谢谢了 代码如下:
void GLWidget::recQdata(QVector<DataProcess*> *q)
{
// *_qLater = *_q;
if(_q){
_later = _q->size();
}
_q = q;

QImage tex, buf;
if(_later ==0){
for(int i=0;i<_q->size();i++){
buf = _q->at(i)->img();
glGenTextures(1,&texture[i]);
glBindTexture(GL_TEXTURE_2D, texture[i]);
glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(),
0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR );
}
}
else{
for(int i=_later;i<_q->size();i++){
buf = _q->at(i)->img();
glGenTextures(1,&texture[i]);
glBindTexture(GL_TEXTURE_2D, texture[i]);
glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(),
0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR );
}
}
}


void GLWidget::paintGL()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_MODELVIEW); //对模型视景矩阵堆栈应用随后的矩阵操作.
glLoadIdentity(); //重置当前指定的矩阵为单位矩阵
glMatrixMode(GL_PROJECTION); //对投影矩阵应用随后的矩阵操作.
glLoadIdentity(); //重置当前指定的矩阵为单位矩阵
gluPerspective(10.0,1.0,1,100); //这句话不能删!!!!!!不能注释掉;设置透视投影矩阵

double l = _l * cos(_b);
_eyex=l * cos(_a);
_eyey=_l* sin(_b);
_eyez=l * sin(_a);
gluLookAt(_eyex,_eyey,_eyez,0,0,0,0,1,0);

if(_q == NULL){
return;
}
for(int i = 0;i<_q->size();i++){
glBindTexture(GL_TEXTURE_2D,texture[i]);
glBegin(GL_TRIANGLES);
for(int j = 130;j<270;j++){
glTexCoord2f(Px0,Py0);
glVertex3d(-laserDist[j][1]/2000.0,
-laserDist[j][0]/2000.0,
laserDist[j][2]/2000.0);
glTexCoord2f(Px1,Py1); //已经计算出这个坐标值
glVertex3d(-laserDist[j+1][1]/2000.0,
-laserDist[j+1][0]/2000.0,
laserDist[j+1][2]/2000.0);
glTexCoord2f(Px2,Py2);
glVertex3d(-laserDist2[j][1]/2000.0,
-laserDist2[j][0]/2000.0,
laserDist2[j][2]/2000.0);

/***************** 右上三角形**************/
glTexCoord2f(Px2,Py2);
glVertex3d(-laserDist2[j][1]/2000.0,
-laserDist2[j][0]/2000.0,
laserDist2[j][2]/2000.0);
glTexCoord2f(Px1,Py1);
glVertex3d(-laserDist[j+1][1]/2000.0,
-laserDist[j+1][0]/2000.0,
laserDist[j+1][2]/2000.0);
glTexCoord2f(Px3,Py3);
glVertex3d(-laserDist2[j+1][1]/2000.0,
-laserDist2[j+1][0]/2000.0,
laserDist2[j+1][2]/2000.0);
}


}
glEnd();
}
...全文
132 点赞 收藏 1
写回复
1 条回复
彩阳 2014年01月07日
首先看看投影得正不正确,方法是将glBindTexture()和glTexCoord()什么的函数注释掉,然后换上glColor3f()这样的。看看能不能显示几何图形; 然后判断一下纹理是否正确,OpenGL有一个判断语句,叫做glIsTexture(),传入你生成的textureID,看看是否返回GL_TRUE。 最后实在不行的话,看看Qt的例子:framebufferobject2和pixelbuffers,这些例子都很给力的。
回复 点赞
发动态
发帖子
Qt
创建于2009-11-04

1.0w+

社区成员

2.5w+

社区内容

Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区公告
暂无公告