程序的目的是把 "Data/Cemento"文件的数据转化为2维纹理贴图
读文件的子程序如下:
AUX_RGBImageRec *Texture::LoadBMP2(const char *Filename)
{
FILE *File=NULL; // ÎļþÖ¸Õë
AUX_RGBImageRec *pData ;
pData=(AUX_RGBImageRec *)malloc(sizeof(AUX_RGBImageRec));
pData-> sizeX = 256;
pData-> sizeY = 256;
pData-> data=(unsigned char*)malloc(pData-> sizeX*pData-> sizeY);
if (!Filename)
{
return NULL; // Èç¹ûÎļþÖ¸Õë²»´æÔÚ£¬Ôò·µ»Ø
} File=fopen(Filename,"rb");// ºËʵÎļþÊÇ·ñ´æÔÚ if (File) // Èç¹ûÎļþ´æÔÚ
{
fread(pData-> data,pData-> sizeX*pData-> sizeY,1,File);
fclose(File);
return pData;
} return NULL; // Èç¹û¶ÁÈëʧ°Ü£¬Ôò·µ»ØNULL
} 主函数读取文件并转化为纹理:
// ×°Èëλͼ²¢½«Î»Í¼×ª»»ÎªÎÆÀí
int Texture::LoadTextures()
{
FILE *File=NULL; // ÎļþÖ¸Õë int Status=FALSE; // ״ָ̬ʾÆ÷ AUX_RGBImageRec *TextureImage[1]; // ´´½¨±£´æÎÆÀíµÄ¿Õ¼ä
memset(TextureImage,0,sizeof(void *)*1); if (TextureImage[0]=LoadBMP2("Data/Cemento"))
{ Status=TRUE; // ÉèÖÃ״̬
glGenTextures(1, &texture[0]); // ´´½¨µÚ0ºÅÎÆÀí // Éú³É MipMapped ÎÆÀí
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3,TextureImage[0]-> sizeX, TextureImage[0]-> sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]-> data); }
调试TextureImage[0](红字)得返回值正确,读出了“Data/Cemento”的数据; 最终程序在gluBuild2DMipmaps(绿色)出现访问0xc00000005:access violate错误;
程序是在xp系统vc6.0下调试 哪儿可能有错误阿? 新手求指点
读文件的子程序如下:
AUX_RGBImageRec *Texture::LoadBMP2(const char *Filename)
{
FILE *File=NULL; // ÎļþÖ¸Õë
AUX_RGBImageRec *pData ;
pData=(AUX_RGBImageRec *)malloc(sizeof(AUX_RGBImageRec));
pData-> sizeX = 256;
pData-> sizeY = 256;
pData-> data=(unsigned char*)malloc(pData-> sizeX*pData-> sizeY);
if (!Filename)
{
return NULL; // Èç¹ûÎļþÖ¸Õë²»´æÔÚ£¬Ôò·µ»Ø
} File=fopen(Filename,"rb");// ºËʵÎļþÊÇ·ñ´æÔÚ if (File) // Èç¹ûÎļþ´æÔÚ
{
fread(pData-> data,pData-> sizeX*pData-> sizeY,1,File);
fclose(File);
return pData;
} return NULL; // Èç¹û¶ÁÈëʧ°Ü£¬Ôò·µ»ØNULL
} 主函数读取文件并转化为纹理:
// ×°Èëλͼ²¢½«Î»Í¼×ª»»ÎªÎÆÀí
int Texture::LoadTextures()
{
FILE *File=NULL; // ÎļþÖ¸Õë int Status=FALSE; // ״ָ̬ʾÆ÷ AUX_RGBImageRec *TextureImage[1]; // ´´½¨±£´æÎÆÀíµÄ¿Õ¼ä
memset(TextureImage,0,sizeof(void *)*1); if (TextureImage[0]=LoadBMP2("Data/Cemento"))
{ Status=TRUE; // ÉèÖÃ״̬
glGenTextures(1, &texture[0]); // ´´½¨µÚ0ºÅÎÆÀí // Éú³É MipMapped ÎÆÀí
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3,TextureImage[0]-> sizeX, TextureImage[0]-> sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]-> data); }
调试TextureImage[0](红字)得返回值正确,读出了“Data/Cemento”的数据; 最终程序在gluBuild2DMipmaps(绿色)出现访问0xc00000005:access violate错误;
程序是在xp系统vc6.0下调试 哪儿可能有错误阿? 新手求指点
绿色的是:gluBuild2DMipmaps(GL_TEXTURE_2D, 3,TextureImage[0]-> sizeX, TextureImage[0]-> sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]-> data); }
有可能是什么问题吗? 望指点
目前就是在源码进行的调试/结果老是非法地址 /
怀疑fread(pData-> data,pData-> sizeX*pData-> sizeY,1,File); 这一句
/我是用fwrite写了同样大的一块数据到File中/现在用fread读文件里面的数据/就如程序在File=fopen(Filename,"rb");之后就直接fread File文件了/这样读是否正确?? 不需要删除文件的一些格式,属性等数据就直接读取可以吗? /
PS:这样读取方法得到的pData->data前面的部分正确,所以之前没有怀疑它
我觉得问题出在pData-> data=(unsigned char*)malloc(pData-> sizeX*pData-> sizeY); //数据大小是等于
//pData-> sizeX*pData-> sizeY?
//有没有考虑每个象素占几个字节
if (!Filename)
{
return NULL; // Èç¹ûÎļþÖ¸Õë²»´æÔÚ£¬Ôò·µ»Ø
} File=fopen(Filename,"rb");// ºËʵÎļþÊÇ·ñ´æÔÚ if (File) // Èç¹ûÎļþ´æÔÚ
{
fread(pData-> data,pData-> sizeX*pData-> sizeY,1,File); //不要去除文件头吗?
fclose(File);
return pData;
}
二;使用fwrite的wb方式写了同样大的一块数据到File,是不是要去除文件头我也没经验;不过不管是写文件之前的数据块data1,写成的文件File(用二进制打开查看),还是从文件读入的数据data2,调试可见部分都是一致的;是否要去掉文件头,有经验的大侠指点下 ~
类似pData-> data=(unsigned char*)malloc(pData-> sizeX*pData-> sizeY);
都改为
pData-> data=(unsigned char*)malloc(pData-> sizeX*pData-> sizeY*sizeof(int));
程序是可以运行起来,也带来一些问题,很不理解为什么要这么改才行;以后再请教,谢谢以上各位
原因应该是你载入的BMP图片的问题,使用gluBuild2DMipmaps()函数的时候,载入的图片的长宽要是2*N,即图片的长度和宽度不能为奇数,你可以在载入的时候特殊处理一下,或者给个限制条件.