我试图通过将其作为 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 的着色器代码,所以我希望上面的代码或着色器代码错过了一些愚蠢的东西。
关于可能出了什么问题的任何想法?