opengl红宝书 第8章的代码中readImage()的简单解决方法(Intel 处理器上)

opengl红宝书 第8章的代码在Intel 处理器上, readImage()读取不正确.

原因如下 :

字节交换(byte swapping):高位优先(big endians)和低位优先(little 
endians)
高位优先和低位优先,指的是两种不同的方式,把整数储存在计算机中的的方式。因为整数是多于一个字节的,那么,问题在于:最重要的字节是否应该首先被读写。最不重要的字节是变化的最频繁的。这就是,如果你不断给一个整数加一,最不重要的字节要改变256次,次不重要的字节才只变化一次。
不同的处理器用不同的方式储存整数。Intel 
处理器一般用低位优先方式来储存整数,换句话说,低位首先被读写。大多数其它处理器用高位优先方式来储存整数。因此,当二进制文件在不同平台上读写时,你就有可能不得不对字节重新排序以便得到正确的顺序。
在 UNIX 平台上,还有一种特殊的问题,因为UNIX可以在Sun 
Sparc处理器、HP处理器、IBM Power PC、Inter的芯片等多种处理器上运行。当从一种处理器转移到另一种处理器上时,就意味着那些变量的字节排列顺序必须翻转,以便于它们能满足新处理器所要求的顺序。

最简单的修改方法:

GLubyte *
readImage( 
const   char *  filename, GLsizei *  width, GLsizei  * height )
{
    
int       n;
    GLubyte
*  pixels;

    FILE
* infile = fopen( filename, "rb" );

    
if ( !infile ) {
    fprintf( stderr, 
"Unable to open file '%s' ", filename );
    
return NULL;
    }



    
/*fread( &byHeightLow, sizeof( BYTE ), 1, infile );
    fread( &byHeightHi, sizeof( BYTE ), 1, infile );
*/

    
*width = 599;
    
*height = 401;
    n 
= 3 * (*width) * (*height);

    pixels 
= (GLubyte *) malloc( n * sizeof( GLubyte ));
    
if ( !pixels ) {
    fprintf( stderr, 
"Unable to malloc() bytes for pixels " );
    
return NULL;
    }


    fread( pixels, 
sizeof( GLubyte ), n, infile );
    
    fclose( infile );

    
return pixels;
}

 

你可能感兴趣的:(opengl红宝书 第8章的代码中readImage()的简单解决方法(Intel 处理器上))