簡體   English   中英

如何使用JOGL處理和返回數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM