У меня есть 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);
изображение неправильный формат, как показано в приведенной ниже сравнения:
Моя функция текстуры нагрузка ниже. Я считаю, что я использовал правильные параметры отображения пикселей и текстуры.
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;
}
Любые идеи о том, что я мог попробовать? Вот что я посмотрел:
- Вот подобный question на тему, которая является то, что я попытался следующие, но безрезультатно.
- Могу ли я предположить, что может возникнуть проблема с компоновкой данных, которые я передаю, например, question. Я пробовал это, но он в основном сквозит изображение одного канала в левую треть области текстурного изображения.
РЕДАКТИРОВАТЬ:
Обновленный в результате чего изображение, на основе @Podgorskiy ответа, путем изменения
(i * currentGrid.sizeWd() + j) + c
к
(3 * i * currentGrid.sizeWd() + j) + c
, где с это канал 0, 1,2. Результирующее изображение ниже:
Я попробовал, что хорошо, и, как упоминалось во второй точке в конце, он давит исходное изображение левой трети площади изображения текстуры, хотя и немного лучший результат чем некорректный, но все же неправильный. – ccoder83
Ответ, на который вы ссылаетесь во втором вопросе в конце вашего вопроса, может иметь одинаковую опечатку. Не могли бы вы предоставить изображение результата при применении множителя из 3? – Podgorskiy
К сожалению, я связался с тем же вопросом, что и в пункте 1, я обновил его, а также обновил вопрос, чтобы включить результат изображения после применения множителя 3. – ccoder83