2014-10-06 63 views
2

我正在使用鼠標繪製3D對象。如何加快OpenGL中紋理的繪製速度? (3.3 +/4.1)

Teapot with stack overflow written on it

我這樣做是正確的,現在的方式是,我包通過片段着色器於RG像素爲這樣的UV座標:

in highp vec2 UV; 
out vec4 fragColor; 
void main() 
{ 
    fragColor.r = UV.x; 
    fragColor.g = UV.y; 
} 

我使那些爲米屏幕上的FBO,然後在鼠標下讀取像素以獲得CPU端的UV座標。

float pixel_array[4]; 

CALL_GL(glReadBuffer(GL_COLOR_ATTACHMENT0)); 
CALL_GL(glReadPixels(normMouseX*WINDOW_WIDTH,normMouseY*WINDOW_HEIGHT,1,1,GL_RGBA,GL_FLOAT,pixel_array)); 

float u = pixel_array[0]; 
float v = pixel_array[1]; 

然後,我使用這些UV座標在正確的位置「繪製」紋理。

CALL_GL(glBindTexture(GL_TEXTURE_2D, mesh.diffuseTexture)); 
CALL_GL(glTexSubImage2D(GL_TEXTURE_2D, 
     0, 
     u*diffuseTextureWidth, 
     v*diffuseTextureHeight, 
     5, 
     5, 
     GL_RGBA, 
     GL_UNSIGNED_BYTE, 
     brush_pixels)); 

問題是,根據紋理的分辨率,這個過程非常緩慢。有什麼方法可以加快速度嗎?

回答

4

我將它們渲染到離屏FBO,然後使用鼠標下的readPixel獲取CPU側的UV座標。

確保只在需要時才從該紋理進行回讀。還試圖破解回讀。讀取單個像素並且往往效率低下。讀取完整紋理後(更改視圖後)會更有效。

要加速繪製到紋理而不是glTexSubImage2D -ing它,只需將它綁定到FBO作爲顏色附件並使用常規OpenGL繪圖操作繪製到它。

+0

呵呵,我一直認爲從GPU上讀取任何東西都很慢。儘管你的答案比我的好,但甚至沒有想過使用OpenGL操作來繪製(哦諷刺)。 – BWG 2014-10-06 18:23:46

+1

@BWG:當GPU和CPU之間的連接是通過AGP的非對稱帶寬時,它過去很慢。今天,我們得到了具有> 10GiB/s對稱帶寬的PCI-E 3。使用PBO和良好對齊的訪問併爲讀出緩衝區選擇原生像素格式和佈局,GPU可以執行異步DMA傳輸。但從技術上講,您可以在Shader Model 3 GPU上執行*所有操作,包括將畫筆放置在目標紋理上。在頂點着色器中,您可以從幾何緩衝區紋理讀取數據,並根據讀回的UV座標變形 - 放置一個「刷子」網格,然後繪製它。 – datenwolf 2014-10-06 18:31:19

+0

對不起,什麼是幾何緩衝區?谷歌它沒有取得好成績? – BWG 2014-10-06 19:44:14