我正在尝试从一个包含预计算纹理的CSV file中读取浮点数,将其存储在一个一维数组中,然后将读取的数据放入一个二维纹理中。
我需要确保下面的代码做到这一点,因为我在访问数据时遇到了问题,并且我找不出错误在哪里:
// Allocate memory
float * image = new float [width * height * 3 ];
for( int i = 0; i < height; i++)
{
for( int j = 0; j < width-1; j++)
{
fscanf( fDataFile, "%f,", &fData );
image[ 4 * i * j + 0 ] = fData;
image[ 4 * i * j + 1 ] = fData;
image[ 4 * i * j + 2 ] = fData;
}
fscanf( fDataFile, "%f", &fData );
image[ 4 * i * width-1 + 0 ] = fData;
image[ 4 * i * width-1 + 1 ] = fData;
image[ 4 * i * width-1 + 2 ] = fData;
} 这里应该不会有什么问题,但让我困扰的是:
// create the texture
glGenTextures(1, &texHandle);
glBindTexture(GL_TEXTURE_2D, texHandle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, &image[0]); 可以只给glTexImage2D指向我的一维数组的指针吗?
数组的大小是width*height*3,纹理的格式应该是width*height with 3 channel...所以我想大小应该没问题吧?!尽管如此,我的程序仍然不会像预期的那样工作,这是一个潜在的错误来源。
发布于 2013-03-06 23:58:19
我解决了我混乱的纹理读取问题。我不知道我是怎么回事,但是我的数组的初始化纯粹是无关紧要的。以下是我在尝试编写测试纹理时发现的更正后的代码:
// Allocate memory
float * image = new float [width * height * 3 ];
for( int i = 0; i < height; i++)
{
for( int j = 0; j < width-1; j++)
{
fscanf( fDataFile, "%f,", &fData );
image[ 3 * (i * width + j) + 0 ] = fData;
image[ 3 * (i * width + j) + 1 ] = fData;
image[ 3 * (i * width + j) + 2 ] = fData;
//image[ 4 * i * j + 2 ] = 1.0f;
}
fscanf( fDataFile, "%f", &fData );
image[ 3 * (i * width + width-1) + 0 ] = fData;
image[ 3 * (i * width + width-1) + 1 ] = fData;
image[ 3 * (i * width + width-1) + 2 ] = fData;
//image[ 4 * i * width-1 + 2 ] = 1;
} 此外,它现在可以独立于内部格式工作。GL_RGB, GL_RGBA, GL_RGB32F and GL_RGBA32F在不改变我读取纹理的方式的情况下都工作得很好。
发布于 2013-03-06 08:23:44
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, &image[0]);您应该使用floating-point internal format。例如,GL_RGB32F。这应该是第三个参数。
https://stackoverflow.com/questions/15236196
复制相似问题