2014-01-16 55 views
1

雖然與計算着色器我看到剛剛創建的GL_SHADER_STORAGE_BUFFERS最例子,像正常的緩衝帶打:瞭解GL_SHADER_STORAGE_BLOCK結合

glGenBuffers, glBindBuffer, glBufferData

,然後將它們像這樣使用:

glUseProgram(computeShader); 
    glBindBufferRange(GL_SHADER_STORAGE_BUFFER, **3**, bufferA, 0, bufferSize); 
    glBindBufferRange(GL_SHADER_STORAGE_BUFFER, **4**, bufferB, 0, bufferSize); 
    glDispatchCompute(computeShader); 

在計算着色器中,緩衝區聲明如下:

layout (**binding = 3**) buffer 
buffer1 
{ 
vec4 data1[]; 
}; 
layout (**binding = 4**) buffer 
buffer2 
{ 
vec4 data2[]; 
}; 

然後我得到了一些建議,在初始化之後我應該做這樣的事情:

GLuint index = glGetProgramResourceIndex(computeShader, GL_SHADER_STORAGE_BLOCK, "buffer1"); 
    glShaderStorageBlockBinding(shader, index, index); 

爲什麼是這個必要嗎?

自glBindBufferRange需要佈局指定的索引(binding = x)以來它有什麼用途?

+0

那些隨機**在代碼中做的是什麼? – Vallentin

+0

我只是想大膽他們... – Alex

回答

2

在這種情況下,它沒有任何目的。您已經明確地在着色器中設置綁定 - 但如果查詢着色器存儲塊的索引,也可以手動執行。您可能希望在加載時更改它,而不是將其硬編碼到着色器,因爲Shader存儲緩衝區對象可以使用全局綁定點進行共享,就像統一緩衝區對象一樣。

事實上,它們與UBO非常相似,直到幾乎相同的API。真正的區別是,您可以:

  1. 寫信給他們,你的shader裏面(你更好,如果你做到這一點使用一個內存屏障)
  2. 使用更大的存儲(最多16個MIB最小值)
  3. 有可變長度。

當UBO被引入時,ARB_shading_language_420pack(給出layout (binding = ...))還沒有被創建;這可能就是爲什麼你看到明確綁定SSB指數的建議。