【问题标题】:Loading a texture by passing RGB floating point pixel data to glTexImage2D通过将 RGB 浮点像素数据传递给 glTexImage2D 来加载纹理
【发布时间】:2015-07-29 04:32:26
【问题描述】:

我有一个 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);

图片格式不正确,如下图对比:

我的纹理加载功能如下。我相信我使用了正确的像素存储和纹理映射参数。

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。结果如下图:

【问题讨论】:

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


    【解决方案1】:

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

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

    其中c为通道,取值:0、1、2。

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

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

    【讨论】:

    • 我也试过了,正如最后第二点所述,它将原始图像压缩到纹理图像区域的左三分之一,尽管结果比畸形图像稍好上面一个,但仍然不正确。
    • 您在问题末尾的第二点中提到的答案可能有相同的印刷错误。您能否提供应用乘数 3 时的结果图像?
    • 糟糕,我链接到与第 1 点相同的问题,我已对其进行了更新,并且还更新了问题以包含应用乘数 3 后的结果图像。
    • 我发现了问题,天哪,这么愚蠢的错误,我错误地使用了括号(3 * i * currentGrid.sizeWd() + j) + c而不是3 * ( i * currentGrid.sizeWd() + j) + c。接受你的回答。谢谢@Podgorskiy
    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多