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

时间:2015-05-17 17:57:09

标签: c++ image opengl texture-mapping texture2d

我有一个2D浮点数组,其值映射在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);

图像格式不正确,如下面的比较所示: Single Channel Image

RGB Image

我的纹理加载功能如下。我相信我已经使用了正确的pixelstore和纹理映射参数。

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。我已经尝试过了,但它基本上将单通道图像压缩到纹理图像区域的左三分之一。
  3. 修改

    根据@Podgorskiy答案,通过更改

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

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

    其中 c 是通道0,1,2。结果图如下: RGB Image updated result

1 个答案:

答案 0 :(得分:3)

您可以按计算的索引访问元素:

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

c 是一个频道,它的值为:0,1,2。

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

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