[英]Bind an SSBO to a fragment shader
我有一個SSBO,它為屏幕上的每個像素存儲vec4顏色值,並在主循環之前通過計算着色器預先填充值。
我現在正試圖在屏幕上獲取這些數據,我猜這涉及到使用片段着色器(雖然如果你知道一個更好的方法,我可以接受建議)
所以我試圖將緩沖區或至少其中的數據添加到片段着色器中,以便我可以將每個片段的顏色設置為緩沖區中的相應值,但我找不到任何方法這樣做?
有人告訴我,我可以將SSBO綁定到片段着色器,但我不知道該怎么做? 我的其他想法是以某種方式將數據從SSBO移動到紋理,但我也無法解決這個問題
更新:
作為回應thokra的優秀答案和以下評論是設置我的緩沖區的代碼:
//Create the buffer
GLuint pixelBufferID;
glGenBuffers(1, &pixelBufferID);
//Bind it
glBindBuffer(GL_SHADER_STORAGE_BUFFER, pixelBufferID);
//Set the data of the buffer
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(vec4) * window.getNumberOfPixels, new vec4[window.getNumberOfPixels], GL_DYNAMIC_DRAW);
//Bind the buffer to the correct interface block number
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, pixelBufferID);
然后我調用計算着色器,這部分工作,我檢查數據是否已正確填充。 然后在我的片段着色器中,就像測試一樣:
layout(std430, binding=0) buffer PixelBuffer
{
vec4 data[];
} pixelBuffer
void main()
{
gl_FragColor = pixelBuffer.data[660000];
}
我注意到的是,它似乎需要越來越長的索引越高,因此在660000它實際上並沒有崩潰,只是花了很多時間。
存儲緩沖區的工作方式與統一緩沖區的工 為了得到這些工作,我怎么建議是這樣的感覺這樣 。 主要區別在於存儲緩沖區可以容納更多的數據,您可以隨機讀取和寫入數據 。
有多種工作角度,但我會從最基本的角度開始 - 着色器中的界面塊。 我將僅描述使用接口塊時可能性的一部分,但它應該足以讓您入門。
與“普通”變量相比,您無法在全局范圍中指定buffer
變量。 您需要按照第4.3.7節 - GLSL 4.40規范使用接口塊 (第4.3.9節 - GLSL 4.40規范):
緩沖區限定符可用於聲明接口塊(第4.3.9節“接口塊”),然后將其稱為着色器存儲塊。 在全局范圍(塊外)聲明緩沖區變量是編譯時錯誤。
請注意,上述部分與ARB擴展略有不同。
因此,要訪問存儲緩沖區中的內容,您需要在片段着色器(或任何其他適用的階段)中定義buffer
接口塊 :
layout (binding = 0) buffer BlockName
{
float values[]; // just as an example
};
與沒有實例名稱的任何其他塊一樣,您將引用緩沖區存儲,就像values
在全局范圍內一樣,例如:
void main()
{
// ...
values[0] = 1.f;
// ...
}
在應用程序級別上,您現在唯一需要知道的是buffer
接口塊BlockName在程序成功鏈接后具有綁定0
。
使用應用程序創建存儲緩沖區對象后,首先將緩沖區綁定到您為相應接口塊指定的綁定
glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
用於將完整緩沖區綁定到索引或
glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
用於將由偏移量和緩沖區數量指定的子集綁定到索引 。
請注意, index
是指layout
為相應接口塊指定的binding
。
這基本上就是它。 請注意,存儲緩沖區大小,綁定點數,最大存儲塊大小等存在某些限制。 我將向您介紹GL和GLSL規范中的相應部分。
此外, ARB擴展中還有一個最小的例子。 閱讀擴展的問題部分還經常提供對暴露的功能及其背后的基本原理的進一步了解。 我建議你仔細閱讀。
如果遇到問題,請發表評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.