【发布时间】:2019-08-31 09:16:56
【问题描述】:
我有两张图片,都是 24 色 .bmp 32x32 像素。如果我用 OpenGL 加载一个,它可以工作,如果我用 OpenGL 加载另一个,它只会显示黑白线。
是否还有其他可能不同的地方,因此不让其中一张图片显示?
这个在代码中不起作用:
这个确实在代码中工作:
还检查了信息大小和文件头大小。两张图片的信息为 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;
【问题讨论】:
-
如果我们没有这些图像,就很难比较它们,但请尝试检查
TBitmapInfoHeader结构的biHeight的值。这可能是负值,并且您将该值传递给的函数可能不采用负值。但这只是一个猜测,因为我不知道这些图像,而且您没有显示您使用ReadBitmap方法做了什么。 -
我会测试一下,看看值是否有差异,给我几分钟。但是使用 ReadBitmap,在将数据发送到 opengl 之前,我几乎只是删除了 infoheader 和文件头。将数据存储到名为“grass”的指针中。在哪里使用它。我可以尝试提供图像的链接,但不确定我是否将它们上传到照片网站是否会以任何方式改变它们。但会在几分钟内完成。
-
这两个位图之间的区别在于每像素值的位数。无法显示的bitmap 是 8 位,而工作的是 24 位。对于 8 位位图,像素数组中的每个字节代表一个像素,因此您在方法结束时的颜色转换实际上会移动像素。如果
glTexImage2d函数甚至支持 8 位位图,也可以尝试 find the answer。 -
每个像素的位数存储在
TBitmapInfoHeader结构的biBitCount成员中。 -
您是否发现您的 TWrap 代码最终以您想要的方式工作?您实际上是在分配
b := r,因为您在第一条语句中覆盖了t的原始值。要旋转三个变量的值,您需要第四个临时变量。