【发布时间】:2020-11-04 01:05:43
【问题描述】:
我正在尝试从包含预计算纹理的 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 指向我的一维数组的指针可以吗?
数组的大小是宽度*高度*3,纹理的格式应该是宽度*高度,有 3 个通道......所以我猜大小应该没问题?!
我的程序仍然无法按预期运行,这是一个潜在的错误来源。
【问题讨论】:
-
事实上,将纹理指定为一维数组是最常见的将纹理传递到 OpenGL 的方法之一。您在指定宽度和高度以及像素格式(您的“3通道”声明)时也是正确的。与您在此处提供的内容相比,所有这些看起来都是正确的。是不是你的纹理没有出现在几何体上?您是否使用
glTexParamter指定了缩小过滤器?如果没有,请尝试使用GL_NEAREST调用它以查看您的纹理是否出现。您可以从那里进行细化。 -
嘿!感谢您的快速和令人鼓舞的回答!确实,我在阅读文件时发现了一个错误。在我也有一个 alpha 通道之前,所以我写了
image[ 4 * i * width-1 + 1 ] = fData;而不是image[ 3 * i * width-1 + 1 ] = fData;,我猜错误是在另一行代码。但我现在更有信心找到它!谢谢!