Java 如何使用JOGL处理和返回数组

Java 如何使用JOGL处理和返回数组,java,jogl,Java,Jogl,我正在尝试使用JOGL来连接Java和GLSL,以便并行处理数组。我对在屏幕上画任何东西都不感兴趣。我希望能够获得一对浮点数组,将它们传递给着色器程序,用GPU处理它们,并将值返回到Java代码 例如,我有浮点数组 float[] array1 = {...}; float[] array2 = {...}; 然后,我有一个着色器程序,其中包含该行 float resultArray = sin(array2)*array1; // Just a random function of the

我正在尝试使用JOGL来连接Java和GLSL,以便并行处理数组。我对在屏幕上画任何东西都不感兴趣。我希望能够获得一对浮点数组,将它们传递给着色器程序,用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);
但我不知道如何将浮点数组传递到着色器中,也不知道处理后如何获得结果


有人能给我指出正确的方向吗?

嘿@Daniel你可以使用制服将数组传递给着色器。我喜欢将制服视为着色器的参数或输入

发件人:

这些[制服]充当着色器程序的用户可以传递给该程序的参数

有些人喜欢将数组作为纹理传入,其中r、g、b值表示着色器中需要的一些值

uniform sampler2D myTexture;
为了收回你的产出;通常,着色器将输出到默认帧缓冲区

默认帧缓冲区是OpenGL创建时使用的帧缓冲区。它是与OpenGL上下文一起创建的。与帧缓冲区对象一样,默认帧缓冲区是一系列图像。与FBO不同,这些图像中的一个通常代表您在屏幕的某个部分实际看到的内容。 默认帧缓冲区是在构建OpenGL上下文时创建的

据我所知,片段着色器只能输出到帧缓冲区,因此如果需要返回某种数组,则需要输出到帧缓冲区,然后从帧缓冲区提取数据

片段着色器的用户定义输出表示一系列 “颜色”。这些颜色值将根据需要定向到特定的缓冲区 在glDrawBuffers状态上。不过,这些被称为“碎片颜色” 您可以将它们视为任意数据

根据设置帧缓冲区的方式,您还可以输出到多个缓冲区。请参见:

帧缓冲区中片段颜色和实际缓冲区之间的映射由glDrawBuffers定义,glDrawBuffers是帧缓冲区状态的一部分。 例如,如果我们像这样设置绘图缓冲区:

const GLenum buffers[]={GL_COLOR_ATTACHMENT4,GL_COLOR_ATTACHMENT2, GL_NONE,GL_COLOR_ATTACHMENT0};glDrawBuffers(4,buffers)

不幸的是,尽管片段着色器仅在每个像素的基础上对可用数据进行操作,并且您无法控制哪个像素是可用的。为了解决这个问题,人们通常使用一种称为延迟着色的技术,其中像素所需的信息作为片段着色器的纹理输入传入(通常用于后期处理)

希望这个答案不会太长,也不会太复杂,不幸的是,使用着色器返回数组比您预期的要复杂一些


或者,OpenCL可能更适合您尝试做的事情,尽管我没有这方面的经验。

谢谢您的回答!听起来JOGL并不是用来返回信息的。我试过OpenCL,效果好多了。很高兴我能帮上忙!!好运=)
uniform sampler2D myTexture;