0

我试图通过将其作为 SSBO 传递给 OpenGLSL 着色器来获取一个 2D 双精度数组。

着色器代码是

#version 430

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;

const int image_width=960;
const int image_height=540;

layout(std430, binding=0) buffer Tmatrix
{
  double data[image_width][image_height];
} amatrix;

void main()
{
    int pixel_x = int(gl_FragCoord.x);
    int pixel_y = int(gl_FragCoord.y);
    array_value = amatrix.data[pixel_x][pixel_y];
    gl_FragColor=vec4(array_value,array_value,array_value,1.0);
}

我的(Delphi)设置SSBO的代码是(ssbo被声明为gluint)

procedure SetShaderStorageBufferObject(prognum:integer);
var data:array of double;
    loop:integer;
begin
     ssbo:=0;
     setlength(data,array_width*array_height);
     for loop:=0 to array_width*array_height-1 do data[loop]:=random;
     glGenBuffers(1,@ssbo);
     glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
     glBufferData(GL_SHADER_STORAGE_BUFFER,sizeof(data),@data,GL_READ_WRITE);
     glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo);
     glBindBuffer(GL_SHADER_STORAGE_BUFFER,0);
     setlength(data,0);
end;

设置统一值后,我在着色器的每一帧都调用 SetShaderStorageBufferObject。

我希望每次更新都能获得静态图像,因为我将 SSBO 设置为随机双精度值,但它只显示黑色图像。

除了这个 SSBO 之外,我处理 GLSL 的其余代码工作正常,我可以毫无问题地运行其他没有 SSBO 的着色器代码,所以我希望上面的代码或着色器代码错过了一些愚蠢的东西。

关于可能出了什么问题的任何想法?

4

0 回答 0