通过将 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;
}
有什么我可以尝试的想法吗? 这是我查找的内容:
- 这是关于该主题的类似 question,这是我尝试遵循的内容,但无济于事。
- 我的直觉是我传递的数据的布局可能有问题,例如这个 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