我正在尝试使用纹理来存储一些数据,以便在计算数据的计算着色器和使用它的片段着色器之间传递。
我创建纹理并使用空值填充它:
GLuint texID;
glGenTextures(1, &texID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_FLOAT, NULL);
然后,我使用以下命令将其提供给计算着色器:
glBindImageTexture(0, texID, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
这是此函数的规范,因此您可以检查我是否使用了正确的参数:https ://www.opengl.org/sdk/docs/man/html/glBindImageTexture.xhtml
然后在计算着色器中,我使用以下方法获取纹理:
layout(rgba32f) coherent uniform image2D Texture;
然后我将纹理的值之一设置为测试:
imageStore(Texture, ivec2(0,0), vec4(0.1, 0.2, 0.3, 1.0));
这应该将该 vec4 放入位置 (0,0) 的纹理中。
然后将纹理添加为片段着色器所属程序的统一:
GLint uniformID = glGetUniformLocation(programID, "Texture");
glUniform1i(uniformID, 0);
然后在片段着色器中我得到了纹理:
uniform sampler2D Texture;
并尝试将某些颜色设置为纹理中位置 (0,0) 的值:
color = texture2D(Texture, ivec(0,0));
但是结果我只是变黑了:即(0.0、0.0、0.0、1.0)。无论我在计算着色器中设置什么,我总是得到这个。
我可能遗漏了一些非常明显的东西,所以一些显示我遗漏的代码会很棒