我有两张图片,都是24色.bmp 32x32像素。如果我用OpenGL加载一个它可以工作,如果我用OpenGL加载另一个它只显示黑线和白线。
还有其他可能不同的东西,因此不会让其中一张图片出现吗?
这个在代码中不起作用:
grass1.bmp http://turboimg.com/p/aur1361433642q.bmp
这个在代码中起作用:
grass.bmp http://turboimg.com/p/udj1361433715c.bmp
还检查了信息大小和文件头大小。两张图片的信息均为40张,文件大小为14张。 biWidth和BiHeight的图像仍为32x32。
这显示了我如何用图像草纹理十六进制
//GRASS
glTexImage2d(GL_TEXTURE_2D,Level,Colorcomps,sGrass,tGrass,Border,GL_RGB,GL_UNSIGNED_BYTE,grass);
glLoadName(1);
glBegin(GL_POLYGON);
for I := 0 to 6 do
begin
glTexCoord2f(COS(i/6.0*2*PI),SIN(i/6.0*2*pi));
glVertex3f((((COS(i/6.0*2*PI)/12)+offsetx)+0.2),((SIN(i/6.0*2*pi)/12)+offsety),-2);
end;
glEnd;
grass
是一个指针,如下所示:
grass := Readbitmap('Grass.bmp',sGrass,tGrass);
我如何获取图像数据(因为它与其他图像一起使用时应该没问题,我真的认为它的另一个图像会使两者不同)?
Function TFCreateMap.ReadBitmap(const FilePath:String;var sWidth,tHeight:GLsizei):pointer;
const
szh=SizeOf(TBitmapFileHeader);
szi=SizeOf(TBitmapInfoHeader);
var
bmpfile: file;
bfh:TBitmapFileHeader;
bmi:TBitmapInfoHeader;
t:byte;
x,
fpos,
size: integer;
begin
assignfile(bmpfile,FilePath);
reset(bmpfile,1);
size := FileSize(bmpfile)-szh-szi;
blockread(bmpfile,bfh,szh);
if bfh.bfType<>$4D42 then
raise EinvalidGraphic.Create('Invalid Bitmap');
blockread(bmpfile,bmi,szi);
with bmi do
begin
sWidth := biWidth;
tHeight := biHeight;
end;
getmem(result,size);
blockread(bmpfile,result^,size);
for x := 0 to sWidth*tHeight-1 do
with TWrap(result^)[x] do
begin
t := r;
r := b;
b := t;
end;
end;
答案 0 :(得分:4)
您的位图至少在位深度上有所不同。无法加载的是8位,而工作的是24位。您需要的是将8位位图转换为24位(因为glTexImage2D
函数调用中使用了format
参数值)。
代码审核:
我已经对您的代码进行了审核,结果如下;下面的代码使用文件流来读取文件(因为我不是旧式I / O例程的粉丝;无论如何你忘了关闭文件),删除颜色通道旋转部分,因为@Rob指向错误(由于下面提到的原因)。我已经添加了对必要位深度值的检查(对于glTexImage2D
函数调用将使用format
标志,该值必须为24位:
function TFCreateMap.ReadBitmap(const AFilePath: string; var AWidth,
AHeight: GLsizei): Pointer;
var
DataSize: Integer;
FileStream: TFileStream;
FileHeader: TBitmapFileHeader;
InfoHeader: TBitmapInfoHeader;
const
FileTypeBitmap = $4D42;
FileHeaderSize = SizeOf(TBitmapFileHeader);
InfoHeaderSize = SizeOf(TBitmapInfoHeader);
begin
Result := nil;
FileStream := TFileStream.Create(AFilePath, fmOpenRead);
try
FileStream.ReadBuffer(FileHeader, FileHeaderSize);
if (FileHeader.bfType <> FileTypeBitmap) then
raise EinvalidGraphic.Create('Invalid file type!');
FileStream.ReadBuffer(InfoHeader, InfoHeaderSize);
if (InfoHeader.biBitCount <> 24) then
raise EinvalidGraphic.Create('Invalid bit depth!');
DataSize := FileStream.Size - FileHeaderSize - InfoHeaderSize;
GetMem(Result, DataSize);
FileStream.ReadBuffer(Result^, DataSize);
AWidth := InfoHeader.biWidth;
AHeight := InfoHeader.biHeight;
finally
FileStream.Free;
end;
end;
现在,为什么我删除了颜色通道旋转;我几乎没有使用OpenGL的经验,但有些事情告诉我,glTexImage2D
函数的GL_BGR
参数的format
值可能会简化这一部分,因为我会说这个函数然后期望BGR像素阵列的data
参数,这就是你的位图的存储方式。所以我的猜测是你可以保持颜色通道旋转并使用GL_BGR
参数的format
值调用glTexImage2D
函数:
glTexImage2D(GL_TEXTURE_2D, Level, Colorcomps, sGrass, tGrass, Border, GL_BGR,
GL_UNSIGNED_BYTE, grass);
...
答案 1 :(得分:2)
第一张图片有索引颜色格式,但第二张图片有RGB。您可以尝试使用GIMP或其他编辑器更改颜色格式。