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)頂點:
2)頂點呈現爲線帶,利用簡單的幾何形狀着色器:
參考圖象:
請注意:[「緩衝區對象」](http://www.opengl.org/wiki/Buffer_Object)是您一直稱之爲VBO的一般術語。頂點緩衝對象是緩衝對象的特殊*使用*。像素緩衝區對象表示緩衝區對象的另一個* use *。緩衝區對象不會改變;它只是你如何使用它。 –
「*在GPU中進行一些計算後,我不想將存儲在FBO中的結果複製到VBO,以便進一步處理幾何着色器。*」您是否考慮過變換反饋?它比渲染更簡單,然後複製到緩衝區,然後再次渲染。 –
哦,如果你正在重新創建緩衝區的存儲空間*每幀*,那麼緩衝區不是'GL_STATIC_DRAW'。它是'GL_STREAM_DRAW'。實際上,它是'GL_STREAM_COPY',因爲你從來不寫信或從OpenGL讀取它。 –