2012-11-26 64 views
2

在GPU上進行一些計算後,我想將存儲在FBO中的結果複製到VBO進行渲染。將FBO複製到VBO時出錯

問題:它看起來像我的副本時,一些數據已損壞。我已經檢查了兩種緩衝區的格式和大小,並檢查了FBO中存儲的數據是否正確。

考慮下面的代碼初始化FBO:

unsigned int verticesTextureId = AllocateTexture(GL_TEXTURE_RECTANGLE, mVBOSize, 1, GL_RGBA32F, GL_RGBA); 
CHECK_FOR_OPENGL_ERRORS(); 

unsigned int normalsTextureId = AllocateTexture(GL_TEXTURE_RECTANGLE, mVBOSize, 1, GL_RGBA32F, GL_RGBA); 
CHECK_FOR_OPENGL_ERRORS(); 

SetUpViewport(mVBOSize, 1); 

glBindFramebuffer(GL_FRAMEBUFFER, mFBOId); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, verticesTextureId, 0); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_RECTANGLE, normalsTextureId, 0); 

而下面的代碼初始化一個FBO到維也納組織駐維也納各組織和拷貝數據:

mVerticesBufferId = AllocateVBO(); 
CHECK_FOR_OPENGL_ERRORS(); 

glBindBuffer(GL_PIXEL_PACK_BUFFER, mVerticesBufferId); 
glBufferData(GL_PIXEL_PACK_BUFFER, mVBOSize * 4 * sizeof(float), 0, GL_STATIC_DRAW); 

mNormalsBufferId = AllocateVBO(); 
CHECK_FOR_OPENGL_ERRORS(); 

glBindBuffer(GL_PIXEL_PACK_BUFFER, mNormalsBufferId); 
glBufferData(GL_PIXEL_PACK_BUFFER, mVBOSize * 4 * sizeof(float), 0, GL_STATIC_DRAW); 

glReadBuffer(GL_COLOR_ATTACHMENT0); 
glBindBuffer(GL_PIXEL_PACK_BUFFER, mVerticesBufferId); 
glReadPixels(0, 0, mVBOSize, 1, GL_RGBA, GL_FLOAT, 0); 

glReadBuffer(GL_COLOR_ATTACHMENT1); 
glBindBuffer(GL_PIXEL_PACK_BUFFER, mNormalsBufferId); 
glReadPixels(0, 0, mVBOSize, 1, GL_RGBA, GL_FLOAT, 0); 

在這裏,我結合維也納組織作爲頂點/普通屬性並調用draw:

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 

glBindBuffer(GL_ARRAY_BUFFER, mVerticesBufferId); 
glVertexPointer(4, GL_FLOAT, 4 * sizeof(float), 0); 

glBindBuffer(GL_ARRAY_BUFFER, mNormalsBufferId); 
glNormalPointer(GL_FLOAT, 4 * sizeof(float), 0); 

glDrawArrays(GL_POINTS, 0, mVBOSize); 

glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 

在此調用之後,大多數p oint在屏幕上正確顯示,但有些出現奇怪的不合適的地方。這似乎與信號或夾緊無關,因爲具有負值或大於1個分量的頂點正在正確顯示。

我附上了未正確呈現的kosh雪花(曲線)的圖片。呈現爲點

1)頂點:

Kosh Snowflake (with wrong vertices rounded with red circles)

2)頂點呈現爲線帶,利用簡單的幾何形狀着色器:

Kosh Snowflake (wrong vertices circled in red)

參考圖象:

Correct Kosh Snowflake

+1

請注意:[「緩衝區對象」](http://www.opengl.org/wiki/Buffer_Object)是您一直稱之爲VBO的一般術語。頂點緩衝對象是緩衝對象的特殊*使用*。像素緩衝區對象表示緩衝區對象的另一個* use *。緩衝區對象不會改變;它只是你如何使用它。 –

+1

「*在GPU中進行一些計算後,我不想將存儲在FBO中的結果複製到VBO,以便進一步處理幾何着色器。*」您是否考慮過變換反饋?它比渲染更簡單,然後複製到緩衝區,然後再次渲染。 –

+0

哦,如果你正在重新創建緩衝區的存儲空間*每幀*,那麼緩衝區不是'GL_STATIC_DRAW'。它是'GL_STREAM_DRAW'。實際上,它是'GL_STREAM_COPY',因爲你從來不寫信或從OpenGL讀取它。 –

回答

3

使用gDEBugger我發現我的VBOs上的數據也是正確的。問題是在片段着色器計算之後,我的向量(w)的同質分量對它們產生了垃圾,從而對轉換產生了不希望的效果。

相關問題