Qt中用OpenGL绘图,贴纹理的问题。
是这样的,我要把上千个一样大小位置移动的纹理依次显示,纹理是即时生成的QPixmap::LoadFromData(), 在数据比较小的时候还好,数据大了就会出现空白,就是应该贴纹理的地方一片白,但是不是程序死在那,还能转动,移动,也不是每一片都空白,随机的。。但是最开始几片一般不会。我试过把将要贴上去的十个纹理(QPixmap)放到QCache中(效果一样), 试过把bindTexture()返回的Gluint作为全局变量事先计算(没有用),试过用QTimer控制过一段时间再更新(时间没有办法控制,小数据太长,大数据不够),试过QThread(想不明白在什么地方发出update的信号, 就是我不知道什么地方不对了,因为QPixmap::loadFromData返回的值一直是true).下面是贴图的代码,每次update时调用display()函数, 因为纹理的位置每次都会变化,所以是即时计算的。请帮忙看看什么地方有问题。
ps:贴的纹理不变时,怎么迅速更新都不会出现这种情况,虽然也是差不多把下面代码都执行了一遍。
bool GLWidget::display(sideType type, int position, bool direction)
{
pixmaps[type].loadFromData(dhtIndex->getSliceArrayForBMP(cdpSlice, position));//生成变化的一个纹理,其他纹理都已经在外部生成好了
{
visibleRange[type] = position;
visibleRangePercent[type] =
(GLfloat)(visibleRange[type])/(dhtIndex->cdpMax - dhtIndex->cdpMin + 1);
visibleRangeDouble[type] = positionToPasteTexture(cdpSlice, visibleRange[type]);
if (type == cdpMinSide && position == visibleRange[cdpMaxSide])
setSingleVisibleRange(cdpMaxSide, dhtIndex->cdpMax);
else if(type == cdpMaxSide && position == visibleRange[cdpMinSide])
setSingleVisibleRange(cdpMinSide, dhtIndex->cdpMin);
//计算要贴图上去的位置visibleRangeDouble【6】
//和对应的纹理位置visibleRangePercent【6】,因为不是
//每次都把全部纹理(0, 0, ~ 1, 1,)贴上去的。
//因为visibleRangeDouble & visibleRangePercent只有一个量变化了,所以
//只计算一个分量 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
qglColor(QColor(Qt::white));
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
GLuint textures[6];
for ( int i = 0; i < 6; i ++)
textures[i] = bindTexture(pixmaps.at(i), GL_TEXTURE_2D);
//每次我要贴六个图上去,但是只有一个纹理内容发生了变化
//六个纹理的位置都发生变化
//在这里,我想先把bindTexture返回的Gluint存起来的,但是不能用。
glClearDepth(1.0f);
GLdouble pos[3];//每个顶点对应的坐标
GLfloat corner[4];//取纹理区域,
glColor4d(1, 1, 1, 1);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
//tag 1
corner[leftCorner] = visibleRangePercent[timeMinSide];//timeMin
corner[rightCorner] = visibleRangePercent[timeMaxSide];//timeMax
corner[buttomCorner] = visibleRangePercent[lineMaxSide];//lineMax
corner[topCorner] = visibleRangePercent[lineMinSide];//lineM
//计算取纹理的区域,这四个值在0,1之间 //enum{leftCorner = 0, rightCorner = 1, buttomCorner = 2, topeCorner = 3}
glBindTexture(GL_TEXTURE_2D, textures[cdpMinSide]);//x0
//这里,我把第二个参数换成外部生成的Gluint就会有问题。
pos[cdpAxis] = visibleRangeDouble[cdpMinSide];
//enum axisType{cdpAxis = 0, lineAxis = 1, timeAxis = 2}
//相当于xyz轴
glBegin(GL_QUADS);//cdp
glTexCoord2f(corner[leftCorner], corner[topCorner]);
pos[lineAxis] = visibleRangeDouble[lineMinSide];
pos[timeAxis] = visibleRangeDouble[timeMinSide];
glVertex3dv(pos);
glTexCoord2f(corner[leftCorner], corner[buttomCorner]);
pos[lineAxis] = visibleRangeDouble[lineMaxSide];
pos[timeAxis] = visibleRangeDouble[timeMinSide];
glVertex3dv(pos);
glTexCoord2d(corner[rightCorner], corner[buttomCorner]);
pos[lineAxis] = visibleRangeDouble[lineMaxSide];
pos[timeAxis] = visibleRangeDouble[timeMaxSide];
glVertex3dv(pos);
glTexCoord2d(corner[rightCorner], corner[topCorner]);
pos[lineAxis] = visibleRangeDouble[lineMinSide];
pos[timeAxis] = visibleRangeDouble[timeMaxSide];
glVertex3dv(pos);
glEnd();
//tag2
//以下省略与tag1 ~ tag2之间类似的五段代码,分别为立方体另外五个面
//纹理位置和内容信息变更。
sliceDisplayInfo.displayingSlicePos += (sliceDisplayInfo.direction)? 1: (-1);
return false;
}