2015-05-17 3 views
3

У меня есть 2D массив с плавающей запятой со значениями, отображаемыми в диапазоне от 0.0f до 1.0f. Я загрузить его в OpenGL с использованием одного каналаЗагрузка текстуры, передавая данные пикселя с плавающей запятой RGB в glTexImage2D

т.е.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_FLOAT, data);

, который прекрасно работает. Тем не менее, я пытаюсь добавить еще два канала, чтобы в конечном итоге превратить его в RGB цвета, как показано ниже:

// Get the current grid 
Array2D<real_t> currentGrid = m_Continuum->getCurrentGrid(); 
float R, G, B; 

std::vector<GLfloat> image; 
image.resize(currentGrid.size()*3, 0.0f); 

for (size_t i = 0; i != currentGrid.sizeWd(); ++i) 
{ 
    for (size_t j = 0; j != currentGrid.sizeHt(); ++j) 
    { 
     // I have to switch i and j in currentGrid due to the way the Array2D type is layed out 
     image[(i * currentGrid.sizeWd() + j) + 0] = currentGrid(j, i); 
     image[(i * currentGrid.sizeWd() + j) + 1] = currentGrid(j, i); 
     image[(i * currentGrid.sizeWd() + j) + 2] = currentGrid(j, i); 
    } 
} 

Теперь, когда я обновляю и использовать glTexImage2D:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, width, height, 0, GL_RGB, GL_FLOAT,data); 

изображение неправильный формат, как показано в приведенной ниже сравнения: Single Channel Image

RGB Image

Моя функция текстуры нагрузка ниже. Я считаю, что я использовал правильные параметры отображения пикселей и текстуры.

bool Texture::load(const size_t width, const size_t height, const float *data) 
{ 
    glPixelStoref(GL_UNPACK_ALIGNMENT, 1); 

    // Allocate a texture name 
    //glGenTextures(1, &m_TextureObj); called in another function 

    // select current texture 
    glBindTexture(GL_TEXTURE_2D, m_TextureObj); 

    // select replace to ensure texture retains each texel's colour 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    // if texture wraps over at the edges 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT,data); 

    glGenerateMipmap(GL_TEXTURE_2D); 

    m_Loaded = true; 
    return true; 
} 

Любые идеи о том, что я мог попробовать? Вот что я посмотрел:

  1. Вот подобный question на тему, которая является то, что я попытался следующие, но безрезультатно.
  2. Могу ли я предположить, что может возникнуть проблема с компоновкой данных, которые я передаю, например, question. Я пробовал это, но он в основном сквозит изображение одного канала в левую треть области текстурного изображения.

РЕДАКТИРОВАТЬ:

Обновленный в результате чего изображение, на основе @Podgorskiy ответа, путем изменения

(i * currentGrid.sizeWd() + j) + c 

к

(3 * i * currentGrid.sizeWd() + j) + c 

, где с это канал 0, 1,2. Результирующее изображение ниже: RGB Image updated result

ответ

3

доступ к элементам Вы по индексу, который вы вычислить как:

(i * currentGrid.sizeWd() + j) + c 

Где с является каналом, и он принимает значения от: 0, 1, 2.

Однако это выражение может быть неправильным. Из этого выражения следует, что два соседних текселя имеют смещение одного поплавка, но должны иметь смещение трех поплавков. Попробуйте вместо этого:

3 * (i * currentGrid.sizeWd() + j) + c 
+0

Я попробовал, что хорошо, и, как упоминалось во второй точке в конце, он давит исходное изображение левой трети площади изображения текстуры, хотя и немного лучший результат чем некорректный, но все же неправильный. – ccoder83

+0

Ответ, на который вы ссылаетесь во втором вопросе в конце вашего вопроса, может иметь одинаковую опечатку. Не могли бы вы предоставить изображение результата при применении множителя из 3? – Podgorskiy

+0

К сожалению, я связался с тем же вопросом, что и в пункте 1, я обновил его, а также обновил вопрос, чтобы включить результат изображения после применения множителя 3. – ccoder83