使用glBindImageTexture将单精度浮点数组传递给GLSL着色器

使用glBindImageTexture将单精度浮点数组传递给GLSL着色器,glsl,Glsl,我想将单精度浮点的2D数组传递给GLSL着色器。我正在尝试使用glBindImageTexture实现此目的 在主OpenGL渲染循环之前,我定义纹理并使用 glGenTextures(1,@imagetexture); glBindTexture(GL_TEXTURE_2D,imagetexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D

我想将单精度浮点的2D数组传递给GLSL着色器。我正在尝试使用glBindImageTexture实现此目的

在主OpenGL渲染循环之前,我定义纹理并使用

glGenTextures(1,@imagetexture);
glBindTexture(GL_TEXTURE_2D,imagetexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
setlength(arrayvalues,imwidth*imheight);
for loop:=0 to imwidth*imheight-1 do arrayvalues[loop]:=random;
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, imwidth, imheight, 0, GL_R32F, GL_FLOAT, arrayvalues);
setlength(arrayvalues,0);
glBindImageTexture( 0,                  //unit
                    imagetexture,       //texture
                    0,                  //level
                    false,              //layered
                    0,                  //layer
                    GL_READ_WRITE,      //access
                    GL_R32F);           //format
着色器代码是测试的最低要求

#version 430

layout (binding=0,r32f) uniform image2D my_image;

void main()
{
    float f = imageLoad( my_image, ivec2(gl_FragCoord.xy) ).r;
    //f = 0.5;
    gl_FragColor=vec4(f,f,f,1.0);
}
代码全部运行,但输出始终为黑色?你知道我错过了什么吗

相同的周围代码适用于其他不依赖glBindImageTexture的着色器,因此我假设一切正常


如果我取消标记f=0.5,则会得到一个灰色图像,否则一切看起来都正常。

如果使用
glGenTextures
创建纹理名称,则在首次绑定之前,该纹理将被视为未使用。我不是说
glBindImageTexture
;我的意思是
glBindTexture

glBindImageTexture
不会将纹理绑定到纹理单元;它将纹理绑定到图像单元以用作图像。它不会出于操纵目的将其绑定到上下文。因此,对
glTexParameter
等函数的调用并不关心绑定到图像单元的内容


您必须使用
glBindTexture
绑定纹理,然后建立其大小等信息,然后将其绑定以用作图像。

工作代码。问题在于我最初并没有在glBIndImageTexture之前调用glBindTexture,也没有使用GL_R32F而不是GL_RED

glGenTextures(1,@imagetexture);
glBindTexture(GL_TEXTURE_2D,imagetexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
setlength(arrayvalues,imwidth*imheight);
for loop:=0 to imwidth*imheight-1 do arrayvalues[loop]:=random;
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, imwidth, imheight, 0, GL_RED, GL_FLOAT, arrayvalues);
setlength(arrayvalues,0);
glBindImageTexture( 0,                  //unit
                    imagetexture,       //texture
                    0,                  //level
                    false,              //layered
                    0,                  //layer
                    GL_READ_WRITE,      //access
                    GL_R32F);           //format

谢谢你的提示。这是一个需要纹理的问题。此外,我有一个GL_R32F而不是GL_RED。我已经在原始帖子中将代码更新为工作版本,因为它可能在将来帮助其他人。好的,我回答了我自己的问题。