OpenGL compute-shader связывает несколько текстур - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь связать две текстуры с моим компьютерным шейдером.

О моих текстурах:

GLuint texOne;
glGenTextures(1, &texOne);
//glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texOne);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, w,h);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, bytes.data());

обе текстуры инициализируются таким образом.

Мой шейдер выглядит так:

#version 430 core
#extension GL_ARB_explicit_uniform_location : enable
#extension GL_ARB_separate_shader_objects : enable

layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout (location = 0, rgba8) uniform image2D imageSrc;
layout (location = 1, rgba8) uniform image2D imageDst;

void main()
{
    vec4 imageData = imageLoad(imageSrc, ivec2(gl_GlobalInvocationID.xy));
    imageStore(imageDst, ivec2(gl_GlobalInvocationID.xy), imageData); 
}

Я также пытался сохранить другие значения в текстуру imageDst в следующем стиле: vec4 (0,1,1,1) каким-то образом привязка видит только imageSrc, а не imageDst. При использовании только одной текстуры все работает нормально.

Привязка текстур к шейдеру

GLuint texOne;
glGenTextures(1, &texOne);
//glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texOne);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, w,h);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, bytes.data());
GLuint texTwo;
glGenTextures(1, &texTwo);
//glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, texTwo);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, w,h);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
//bind textures
glBindImageTexture(0, texOne, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8);
glBindImageTexture(1, texTwo, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8);
//compute

glMemoryBarrier(GL_ALL_BARRIER_BITS);
glDispatchCompute(w,h,1);
glMemoryBarrier(GL_ALL_BARRIER_BITS);

Я думаю, ошибка должна быть где-то в строке glBindImageTexture ... Как работает эта команда?

это первый параметр макета (локации)? второй параметр мой textureId?

Заранее спасибо

...