2011-10-26 89 views
2

因爲除了窗口的大小都會發生變化,這是否正常?我的程序需要一個完整的核心才能在最大化的窗口上渲染場景?

我在窗口的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張照片。
將來可以用圖形輸入板甚至鼠標修改一張圖片(更確切地說是一張圖片,這意味着更多的紋理),所以我需要提高速度。

+0

你的GPU有多少內存? – genpfault

+1

@genpfault 256MB,它是一個GeForce 6800 – Aigrefin

+1

我的不好,我嘗試用較少的紋理。我在內存中有超過27個未壓縮紋理的問題,代表了235MB。我使用的內存太多了。我真的不知道如何一次顯示這150張圖片,而如果縮放因子已經增加,則能夠以全分辨率看到一張。可能每次縮放因子改變時我都應該加載足夠的分辨率,但不是如果我們想要看到實時渲染的變化,渲染緩慢嗎? – Aigrefin

回答

0

加載縮小版本的圖像以獲得快速渲染和低內存壓力。然後,當您放大圖像的特定子集時,可以加載全分辨率圖像,並顯示這些圖像而不是低分辨率紋理。

+0

好吧,我開始這樣做。我有另一個問題,因爲我仍然有性能問題:當調用glTexImage2D(在x的GLuint級別)時查詢較低的mimap縮小圖像還是加載縮小的圖片副本(GLuint級別爲0)會更快嗎? – Aigrefin

+0

您可以使用紋理LOD偏差來僅對已加載的mipmap級別進行取樣,但我認爲OpenGL仍會爲所有mip級別的完整紋理分配內存。所以你可以通過'glTexSubImage2D()'將你的低分辨率圖像粘貼到自己的紋理對象(mipmapped與否,不會影響內存使用),並擁有一個紋理ID池(可能是5-10,碾壓或不)隨着您的視角移動,您的高分辨率圖像。通常你想避免用'glTexImage2D()'重新創建紋理,因爲它可能比'glTexSubImage2D()'慢。 – genpfault

+1

非常感謝,它按預期工作。我每次更改分辨率時都必須創建紋理,因爲'glTexSubImage2D()'僅適用於紋理的一部分(並且我需要更改整個紋理)。但是用這種方法一切都很順利。 – Aigrefin