[英]How to process and return an array with JOGL
我正在嘗試使用JOGL在Java和GLSL之間進行接口以並行處理數組。 我對在屏幕上繪制任何內容都不感興趣。 我希望能夠使用一對float數組,將它們傳遞給着色器程序,使用GPU處理它們,然后將值返回給Java代碼。
例如,我有浮點數組
float[] array1 = {...};
float[] array2 = {...};
然后我有一個包含以下內容的着色器程序
float resultArray = sin(array2)*array1; // Just a random function of the two arrays
然后將'resultArray'作為浮點數組返回給我的Java程序,以用於其他目的。
我當前的代碼是
int v = gl.glCreateShader(GL.GL_VERTEX_SHADER);
int f = gl.glCreateShader(GL.GL_FRAGMENT_SHADER);
String vertShader =
"
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
";
gl.glShaderSource(v, 1, vertShader, (int[])null);
gl.glCompileShader(v);
String fragShader =
"
out float resultArray;
varying float array1;
varying float array2;
void main( void )
{
// Assuming this code should go in the fragment shader
float resultArray = sin(array2)*array1;
}
";
gl.glShaderSource(f, 1, fragShader, (int[])null);
gl.glCompileShader(f);
int shaderprogram = gl.glCreateProgram();
gl.glAttachShader(shaderprogram, v);
gl.glAttachShader(shaderprogram, f);
gl.glLinkProgram(shaderprogram);
gl.glValidateProgram(shaderprogram);
gl.glUseProgram(shaderprogram);
float[] resultArray = gl.callSomeMethodThatDoesntExist(shaderprogram, array1, array2);
但是我不確定如何將float數組傳遞到着色器中,也不確定如何處理后的結果。
誰能指出我正確的方向?
嘿@Daniel,您可以使用制服將數組傳遞到着色器中。 我喜歡將制服視為着色器的參數或輸入。
從https://www.khronos.org/opengl/wiki/Uniform_(GLSL) :
這些[制服]充當着色器程序的用戶可以傳遞給該程序的參數。
struct Thingy
{
vec4 an_array[3];
int foo;
};
layout(location = 2) uniform Thingy some_thingies[6];
有些人喜歡將數組作為紋理傳遞,其中r,g,b值表示您的着色器中需要的一些值。
uniform sampler2D myTexture;
為了獲取您的輸出; 通常,您的着色器將輸出到默認的幀緩沖區。
默認幀緩沖區是用於創建OpenGL的幀緩沖區。 它與OpenGL上下文一起創建。 像幀緩沖對象一樣,默認的幀緩沖是一系列圖像。 與FBO不同,這些圖像之一通常代表您實際在屏幕的某個部分看到的圖像。 默認的幀緩沖區是在構造OpenGL上下文時創建的。
據我所知,片段着色器只能輸出到幀緩沖區,因此,如果您需要取回某種數組,則需要輸出到幀緩沖區,然后從幀緩沖區中提取數據。
片段着色器的用戶定義輸出表示一系列“顏色”。 這些顏色值基於glDrawBuffers狀態被定向到特定的緩沖區中。 盡管您可以將它們視為任意數據,但是它們被稱為“碎片顏色”。
您還可以根據設置幀緩沖區的方式輸出到多個緩沖區,請參見: https : //www.khronos.org/opengl/wiki/Fragment_Shader#Output_buffers
片段顏色和幀緩沖區中的實際緩沖區之間的映射由glDrawBuffers定義,它是幀緩沖區狀態的一部分。 例如,如果我們像這樣設置繪制緩沖區:
const GLenum緩沖區[] = {GL_COLOR_ATTACHMENT4,GL_COLOR_ATTACHMENT2,GL_NONE,GL_COLOR_ATTACHMENT0}; glDrawBuffers(4,緩沖區);
不幸的是,盡管片段着色器僅基於每個像素對它們可用的數據進行操作,並且您無法控制哪個像素。 為了解決這個問題,人們經常使用一種稱為延遲着色的技術,該技術將有關像素所需的信息作為片段着色器的紋理輸入(通常用於后處理)進行傳遞。
希望這個答案不會冗長而復雜,不幸的是,使用着色器返回數組比您預期的要復雜一些。
另外,盡管我沒有經驗,但OpenCL可能更適合您要執行的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.