通过将 RGB 浮点像素数据传递给 glTexImage2D 来加载纹理

Loading a texture by passing RGB floating point pixel data to glTexImage2D

我有一个二维浮点数组,其值映射在 0.0f 到 1.0f 的范围内。我使用单个通道将它加载到 OpenGL 中,即

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;
}

有什么我可以尝试的想法吗? 这是我查找的内容:

  1. 这是关于该主题的类似 question,这是我尝试遵循的内容,但无济于事。
  2. 我的直觉是我传递的数据的布局可能有问题,例如这个 question。我试过了,但它基本上将单通道图像挤压到纹理图像区域的左侧三分之一。

编辑:

根据@Podgorskiy 的回答,通过更改

更新了结果图像
( i * currentGrid.sizeWd() + j) + c

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

其中 c 是频道 0,1,2。结果图像如下:

您通过计算的索引访问元素:

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

其中c是一个通道,取值为:0,1,2。

不过,这个表述很可能是错误的。从这个表达式可以看出,两个相邻的纹素具有一个浮点数的偏移量,但应该具有三个浮点数的偏移量。 试试这个:

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