Я пытаюсь использовать текстуру для хранения некоторых данных для передачи между вычислительным шейдером, где данные рассчитываются, на фрагментный шейдер, где он используется.
Я создаю текстуру и заполняю ее пустыми значениями, используя:
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). Я всегда получаю это независимо от того, что я установил в вычислительном шейдере.
Я, вероятно, упускаю что-то действительно очевидное, поэтому немного кода, показывающего, что я пропускаю, было бы здорово
Задача ещё не решена.