我正在尝试移植此处找到的C openGL纹理加载代码: http://www.nullterminator.net/gltexture.html 到C ++。特别是我正在尝试从文件中读取一些纹理,以惯用和可移植的方式重写以下代码的最佳方法是什么:
GLuint texture;
int width = 256, height = 256;
BYTE * data;
FILE * file;
// open texture data
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
// allocate buffer
data = malloc( width * height * 3 );
// read texture data
fread( data, width * height * 3, 1, file );
fclose( file );
特别是以可移植的c ++方式替换BYTE宏的最佳方法是什么?
编辑:在我正在使用的当前环境中没有定义BYTE宏。我试图弄清楚其他系统上的基础类型是什么,这样我就可以为正确的类型输入typede。
答案 0 :(得分:3)
假设原始代码是可移植的,您可以保留它。请确保按原样引入BYTE
的定义。 C ++编译器向后兼容C,因此相应的头文件仍在那里。
(如果BYTE
真的是一个宏,我可能会typedef
。)
答案 1 :(得分:2)
当编译为C ++时,C代码应该可以正常工作。
不要使用BYTE
类型,只需使用OpenGL定义的类型GLbyte
,这是API实际使用的类型。它在gl.h
中定义:
typedef signed char GLbyte;
将上述代码快速(未经测试!)翻译成C ++就像是:
GLuint texture;
unsigned width = 256, height = 256;
unsigned buffer_size = width * height * 3;
GLbyte * data;
std::ifstream file;
// open texture data
file.open(filename, ios_base::in | ios_base::binary);
if (!file) return 0;
// allocate buffer
data = new BYTE[buffer_size];
// read texture data
file.read(data, buffer_size);
file.close();
// Process data...
// ...
// Don't forget to release it when you're done!
delete [] data;
答案 2 :(得分:0)
在这种情况下,BYTE *似乎只是char *或unsigned char *的宏。我错了,但我对此表示怀疑。因此在程序中使用char *或unsigned char *将是等效的。但是,如果要从C移植到C ++,可能需要考虑使用C ++标准库中的ifstream(以二进制模式)。
答案 3 :(得分:0)
使用unsigned char
代替BYTE
- 应按预期工作(您可能必须转换malloc()
的返回值。