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