Создание и чтение одномерных текстур в OpenGL 4.x

У меня проблемы с использованием одномерных текстур в OpenGL 4.x.

Я создаю свою одномерную текстуру таким образом (кстати: я удалил свои проверки ошибок, чтобы сделать код более понятным и коротким — обычно после каждого вызова gl следует BLUE_ASSERTEx(glGetError() == GL_NO_ERROR, "glGetError failed.");):

glGenTextures(1, &textureId_);

// bind texture
glBindTexture(GL_TEXTURE_1D, textureId_);

// tells OpenGL how the data that is going to be uploaded is aligned
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

BLUE_ASSERTEx(description.data, "Invalid data provided");

    glTexImage1D(
        GL_TEXTURE_1D,      // Specifies the target texture. Must be GL_TEXTURE_1D or GL_PROXY_TEXTURE_1D.
        0,                  // Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
        GL_RGBA32F,
        description.width,  
        0,                  // border: This value must be 0.
        GL_RGBA, 
        GL_FLOAT,
        description.data);
    BLUE_ASSERTEx(glGetError() == GL_NO_ERROR, "glGetError failed.");

// texture sampling/filtering operation.
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glBindTexture(GL_TEXTURE_1D, 0);

После создания я пытаюсь прочитать пиксельные данные созданной текстуры следующим образом: const int width = width_; константная высота = 1;

// Allocate memory for depth buffer screenshot
float* pixels = new float[width*height*sizeof(buw::vector4f)];

// bind texture
glBindTexture(GL_TEXTURE_1D, textureId_);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, pixels);
glBindTexture(GL_TEXTURE_1D, 0);

buw::Image_4f::Ptr img(new buw::Image_4f(width, height, pixels));

buw::storeImageAsFile(filename.toCString(), img.get());

delete pixels;

Но возвращаемые данные пикселей отличаются от входных данных пикселей (вход: цветовая шкала, выход: черное изображение).

Любые идеи, как решить проблему? Возможно, я использую неправильный вызов API.


person Vertexwahn    schedule 28.08.2014    source источник
comment
glReadPixels читает с экрана (или связанного фреймбуфера), а не из текстуры. Вы хотите glGetTexImage.   -  person Colonel Thirty Two    schedule 28.08.2014


Ответы (1)


Замена glReadPixels на glGetTexImage решает проблему.

person Vertexwahn    schedule 28.08.2014