我有一个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);
图像格式不正确,如下面的比较所示:
我的纹理加载功能如下。我相信我已经使用了正确的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;
}
我可以尝试的任何想法? 这是我查找过的内容:
答案 0 :(得分:3)
您可以按计算的索引访问元素:
( i * currentGrid.sizeWd() + j) + c
c 是一个频道,它的值为:0,1,2。
然而,这种表达可能是错误的。从这个表达式可以看出,两个相邻的纹素有一个浮点数的偏移量,但应该有三个浮点数的偏移量。 试试这个:
3 * ( i * currentGrid.sizeWd() + j) + c