2013-07-30 36 views
0

我不熟悉OpenGL,但如果可能我想要做的事情,我可能想深入研究。基本上,我想在GL着色語言中編寫着色器,併爲某些輸出值查詢着色器。我一直在瀏覽一些在線文章,並且從我看到的着色器看起來似乎是由OpenGL直接執行並映射到幾何。GL調用着色器並獲取輸出顏色

爲了把事情說清楚,一些夢想代碼,我想這樣寫:

// Load the GL shader `shader` 
// ... 

// GLShaderOutput and glQueryShader are imaginary names 

GLShaderOutput out = glQueryShader(shader, /* input parameters */); 

// Obtain the received data 

Color color; 
glGetOutputParameter(out, "gl_FragColor", &color); 

着色器或確切的代碼來計算與着色器的數據可以是任意的實現。我只是想使用GLSL進行計算。這可能嗎?

回答

2

這並不是着色器的工作原理。他們從渲染管線的一個階段獲取數據,對其進行處理並輸出在下一階段開始工作所需的數據。因此,通常情況下,您將有頂點數據輸入(頂點着色器),它將被轉換爲適當的向量空間,然後將從其構建基元(即三角形)(幾何着色器,曲面細分着色器),然後一組像素光柵化並且它們的顏色將在像素着色器中計算。然後將像素着色器的輸出與其他像素混合以產生最終圖像。着色器的要點是使渲染管線更加靈活,但它們仍然基本上被設計爲通過執行着色器的幾個階段來輸出圖像。

黑客確實存在,它允許您使用傳統渲染管道在GPU上執行通用GPU計算。這些黑客常常涉及繪製2X2紋理,並在像素着色器中執行所有計算。然後,您會讀回您在像素着色器中寫入的紋理的顏色緩衝區。

總之,由於事物的高度並行流水線性質,您無法查詢着色器的結果。您必須等待流水線完成將每個階段的所有輸入數據推送完畢,然後再讀回最終圖像。您可以使用變換反饋來簡化該過程,並獲取頂點着色器的輸出,但這可能不是您想要的。

現在,您可以直接跳過使用Direct3D或OpenGL,並直接與GPU上的流處理器進行交互。我沒有真正打算使用圖形流水線,而是建議您查看OpenCL或CUDA

或者,OpenGL和Direct3D的最新實現(需要DX11類硬件,目前驅動程序支持非常有限)中公開了計算着色器(繞過傳統渲染管線)。