gpt4 book ai didi

image - 为什么 OpenGL 不能正确显示我加载的图像?

转载 作者:行者123 更新时间:2023-12-03 15:48:32 26 4
gpt4 key购买 nike

我有两张图像,均为 24 色 .bmp 32x32 像素。如果我用 OpenGL 加载一个它可以工作,如果我用 OpenGL 加载另一个它只显示黑色和白色线条。

是否有其他可能不同的东西,从而不让其中一张图像显示?

这个在代码中不起作用:

grass1.bmp

这个在代码中确实有效:

grass.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;

最佳答案

您的位图至少在位深度上有所不同。无法加载的版本是 8 位,而工作的版本是 24 位。您需要的是将 8 位位图转换为 24 位(因为 glTexImage2D 函数调用中使用了 format 参数值)。

代码审查:

我已经审查了您的代码,这是结果;下面的代码使用文件流来读取文件(因为我不喜欢旧式I/O例程;无论如何你忘记了文件关闭),删除了颜色 channel 旋转部分,正如@Rob指出的那样(原因如下所述)。我添加了对必要位深度值的检查(必须是 24 位,带有将用于 glTexImage2D 函数调用的 format 标志):

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;

现在来说说为什么我删除了颜色 channel 旋转;我几乎没有 OpenGL 经验,但有件事告诉我,glTexImage2Dformat 参数的 GL_BGR 值。函数可能会简化这部分,因为我想说该函数随后需要 BGR 像素数组作为其 data 参数,这就是位图的存储方式。所以我的猜测是,您可以保留颜色 channel 旋转并调用 glTexImage2D具有 format 参数的 GL_BGR 值的函数:

glTexImage2D(GL_TEXTURE_2D, Level, Colorcomps, sGrass, tGrass, Border, GL_BGR,
GL_UNSIGNED_BYTE, grass);
...

关于image - 为什么 OpenGL 不能正确显示我加载的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14996357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com