因爲除了窗口的大小都會發生變化,這是否正常?我的程序需要一個完整的核心才能在最大化的窗口上渲染場景?
我在窗口的C++語言中使用Qt 4.7來繪製這些維度的150個圖片(組件是RGBA,每個字節):1754 * 1240。 我打開我的紋理是這樣的:繪製場景時CPU佔用率過高;起源?
glGenFramebuffers(TDC_NB_IMAGE, _fborefs);
glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
//initialize tex
glGenTextures(TDC_NB_IMAGE, _picrefs);
for (int i = 0 ; i < TDC_NB_IMAGE ; i++)
{
qDebug() << "loading texture num : " << i;
_pics[i].scale = 1.f;
_pics[i].pos.rx() = i % ((int)sqrt((float)TDC_NB_IMAGE));
_pics[i].pos.ry() = i/((int)sqrt((float)TDC_NB_IMAGE));
_pics[i].text.load("imgTest.png");
glBindTexture(GL_TEXTURE_2D, _picrefs[i]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//GL_LINEAR_MIPMAP_LINEAR
glTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
TDC_IMG_WIDTH, TDC_IMG_HEIGHT, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
_pics[i].text.toImage().bits()
);
//glGenerateMipmap(GL_TEXTURE_2D);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _picrefs[i], 0);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
我畫我的場景是這樣的:
glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
glClear(GL_COLOR_BUFFER_BIT);
//for each image
for (int i = 0 ; i < TDC_NB_IMAGE ; i++)
{
//compute coords
if (_update)
{
//pos on 0,0
_pics[i].quad.topleft.rx() = 0;
_pics[i].quad.topleft.ry() = 0;
_pics[i].quad.topright.rx() = TDC_IMG_WIDTH;
_pics[i].quad.topright.ry() = 0;
_pics[i].quad.botright.rx() = TDC_IMG_WIDTH;
_pics[i].quad.botright.ry() = TDC_IMG_HEIGHT;
_pics[i].quad.botleft.rx() = 0;
_pics[i].quad.botleft.ry() = TDC_IMG_HEIGHT;
//translate
QPointF dec(0, 0);
dec.rx() = _pics[i].pos.x() * TDC_IMG_WIDTH + _pics[i].pos.x() * TDC_SPACE_IMG;
dec.ry() = _pics[i].pos.y() * TDC_IMG_HEIGHT + _pics[i].pos.y() * TDC_SPACE_IMG;
_pics[i].quad.topleft += dec;
_pics[i].quad.topright += dec;
_pics[i].quad.botright += dec;
_pics[i].quad.botleft += dec;
//scale
_pics[i].quad.topleft *= _globalScale;
_pics[i].quad.topright *= _globalScale;
_pics[i].quad.botright *= _globalScale;
_pics[i].quad.botleft *= _globalScale;
_update = false;
}
//prepare tex drawing
//draw drawing area
glBindTexture (GL_TEXTURE_2D, 0);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);glVertex3f (_pics[i].quad.topleft.x(), _pics[i].quad.topleft.y(), 0);
glTexCoord2f (1.0, 0.0);glVertex3f (_pics[i].quad.topright.x(), _pics[i].quad.topright.y(), 0);
glTexCoord2f (1.0, 1.0);glVertex3f (_pics[i].quad.botright.x(), _pics[i].quad.botright.y(), 0);
glTexCoord2f (0.0, 1.0);glVertex3f (_pics[i].quad.botleft.x(), _pics[i].quad.botleft.y(), 0);
glEnd();
//draw texture
glBindTexture (GL_TEXTURE_2D, _picrefs[i]);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);glVertex3f (_pics[i].quad.topleft.x(), _pics[i].quad.topleft.y(), 0);
glTexCoord2f (1.0, 0.0);glVertex3f (_pics[i].quad.topright.x(), _pics[i].quad.topright.y(), 0);
glTexCoord2f (1.0, 1.0);glVertex3f (_pics[i].quad.botright.x(), _pics[i].quad.botright.y(), 0);
glTexCoord2f (0.0, 1.0);glVertex3f (_pics[i].quad.botleft.x(), _pics[i].quad.botleft.y(), 0);
glEnd();
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
一些基準測試後,似乎沉重的CPU使用率都來自於「//繪製紋理」塊。實際上,有時需要0ms,有時需要400ms。總的來說,當窗口最大化時,paintGL函數需要5秒來渲染場景,而當窗口尺寸爲800 * 600時,它接近0。
我在渲染過程中更改比例尺(只修改_globalScale),所以無論窗口大小如何,我都可以看到150張圖片。圖片的比例不會改變任何CPU使用率。
2周前我開始使用OpenGL,所以我肯定錯過了文檔和教程中的東西..但即使我再次閱讀它們,我也沒有找到解釋或其他方式來呈現這些150張照片。
將來可以用圖形輸入板甚至鼠標修改一張圖片(更確切地說是一張圖片,這意味着更多的紋理),所以我需要提高速度。
你的GPU有多少內存? – genpfault
@genpfault 256MB,它是一個GeForce 6800 – Aigrefin
我的不好,我嘗試用較少的紋理。我在內存中有超過27個未壓縮紋理的問題,代表了235MB。我使用的內存太多了。我真的不知道如何一次顯示這150張圖片,而如果縮放因子已經增加,則能夠以全分辨率看到一張。可能每次縮放因子改變時我都應該加載足夠的分辨率,但不是如果我們想要看到實時渲染的變化,渲染緩慢嗎? – Aigrefin