2017-07-18 53 views
1

我寫一個着色器SSBO裏面的一些頂點數據。然後我想使用寫入SSBO的數據作爲VBO。這些將用於下一次的平局。如何才能做到這一點?使用SSBO作爲VBO輸入下一個繪製調用

這裏,我現在該怎麼做,但它仍然出現segfaults:

int new_vertex_count = …; 
int new_index_count = …; 
int* new_indices = …; 

GLuint ssbo[3]; 
glGenBuffers(3, ssbo); 


glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo[1]); 
glBufferData(GL_SHADER_STORAGE_BUFFER, new_vertex_count * 3 * sizeof(float), nullptr, GL_DYNAMIC_DRAW); 
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo[1]); 

glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo[2]); 
glBufferData(GL_SHADER_STORAGE_BUFFER, new_vertex_count * 2 * sizeof(float), nullptr, GL_DYNAMIC_DRAW); 
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, ssbo[2]); 

glBindVertexArray(vao); //bind the original VAO 
glPatchParameteri(GL_PATCH_VERTICES, 16); 
glEnable(GL_RASTERIZER_DISCARD); //disable displaying 
glDrawElements(GL_PATCHES, index_count, GL_UNSIGNED_INT, 0); //don't draw, just 
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); //sync writing 
glFinish(); 
glDisable(GL_RASTERIZER_DISCARD); //reanable displaying for next draw call 
glBindVertexArray(0); //unbind original VAO in order to use new VBOs 


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ssbo[0]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_count * sizeof(uint), indices, GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, ssbo[1]); //bind SSBO as VBO, is this even possible? 
//or should I use new VBOs and copy? How would I copy then? 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glBindBuffer(GL_ARRAY_BUFFER, ssbo[2]); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0); 

glDrawElements(GL_PATCHES, new_index_count, new_indices, GL_UNSIGNED_INT, 0); //here the real drawing 

回答

3

有沒有這樣的事,作爲一個「SSBO」或「VBO」。只有緩衝對象。存儲塊和頂點數組是用於緩衝對象的用途,但一個特定的緩衝區不固有地鏈接到特定的用途。沒有什麼能夠阻止你通過存儲塊寫入緩衝區,然後在渲染操作中讀取它。

只要你遵循incoherent memory access規則對於那些寫的,當然。除非明確地使其可用,否則通過存儲塊寫入不可用於讀取操作。你可以使用glMemoryBarrier這個。和方式memory barrier works是枚舉指定要能夠看到任何寫的結果的操作。

你要被解讀爲頂點屬性陣列寫入數據。所以,你使用:

glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT​); 
相關問題