Delphi 将.bmp添加为封面未正确显示
尝试获取bmp以包裹对象(圆柱体)。我得到了一个非图像纹理来包装 圆柱体,但当我试着对图像做同样的处理时,它出来了 有了模糊/白色的电视屏幕,黑白色就可以了吗?我将发布我所做的更改,以尝试让bmp正常工作。希望我能得到一些答案:d 首先,我需要一个24位真彩色256x256图像。我用油漆做的 将其大小调整为256像素乘256像素,并保存为24位(.bmp) 其次是接口部分。因为它有一些类型和常量可能会有所帮助 把这个弄清楚。在本文中,我添加了类型RTGB和TWrap以及var-wapper。阿尔索 由于24位windows bmp文件没有alpha,将常量“ColorComps=3”改为4 组成部分。这就是接口,因为它可能会有所帮助。但我认为问题在于readbitmap函数Delphi 将.bmp添加为封面未正确显示,delphi,opengl,delphi-xe2,Delphi,Opengl,Delphi Xe2,尝试获取bmp以包裹对象(圆柱体)。我得到了一个非图像纹理来包装 圆柱体,但当我试着对图像做同样的处理时,它出来了 有了模糊/白色的电视屏幕,黑白色就可以了吗?我将发布我所做的更改,以尝试让bmp正常工作。希望我能得到一些答案:d 首先,我需要一个24位真彩色256x256图像。我用油漆做的 将其大小调整为256像素乘256像素,并保存为24位(.bmp) 其次是接口部分。因为它有一些类型和常量可能会有所帮助 把这个弄清楚。在本文中,我添加了类型RTGB和TWrap以及var-wapper。阿尔
unit zap1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls,opengl,shapes, Vcl.Forms, Vcl.Dialogs, Transfrm, cOpenGL;
type
TTexe13=packed record
red,
green,
blue: GLubyte;
end;
TTexe14=packed record
red,
green,
blue,
alpha: gLubyte;
end;
TForm2 = class(TForm)
OpenGL1: TOpenGL;
Transform1: TTransform;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Transform1Paint(Sender: TObject);
procedure CylinderT(sTex,tTex:glFloat);
private
{ Private declarations }
deltax,
deltaY,
deltaZ:GLfloat;
procedure idle(Sender:TObject;var Done:boolean);
public
{ Public declarations }
Function ReadBitmap(const FilePath:string;var sWidth,tHeight:glsizei):pointer;
end;
var
Form2: TForm2;
const
Level=0;
Border=0;
ColorComps=3;
type
TRGB=packed record
r,g,b: byte;
end;
TWrap=array[0..0] of TRGB;
var
Wrapper: pointer;
接下来我添加了ReadBitmap(我认为我的问题就在这里)。
它应该做什么。。
打开指定的文件,获取文件大小并减去头大小以获取实际位图的大小。然后读取文件头并检查有效的位图签名。接下来,该函数读取info报头并提取宽度和高度(以像素为单位),并通过var参数与调用者通信
finally it allocates the required memory and asigns the bimap into that memory. the function then returns a pointer to the memory containing the raw true-color bitmap. Then at the end i added a pixel-flipping loop. due to openGL uses RGB and windows BGR.
Function TForm2.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;
现在看起来像
procedure TForm2.FormCreate(Sender: TObject);
var
swidth,
theight: GLsizei;
begin
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
Wrapper := ReadBitmap('Fig11-11.bmp',sWidth,tHeight);
glTexImage2D(GL_TEXTURE_2D,Level,ColorComps,sWidth,tHeight,Border,GL_RGBA,GL_UNSIGNED_BYTE,Wrapper);
freemem(wrapper);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
application.OnIdle := idle;
deltaX := 0.01;
deltaY := 0.01;
deltaZ := 0.01;
cylinderBase;
end;
到
刚刚从GL_RGB中取出A你的纹理是RGBA还是RGB?看起来像是RGB,但您正在GLTEXAGE2D中绑定RGBA。我只是想…我添加的纹理/图像是RBG windows格式,在readbitmap的末尾,我将RBG替换为RGB。。图像会显示,但仅以黑白显示。。图像上的任何颜色都会变成黑色/白色雪地颜色谢谢你的帮助。将rbga更改为rbgIs是对这个问题的答案的最后评论??
procedure TForm2.FormCreate(Sender: TObject);
var
swidth,
theight: GLsizei;
begin
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
Wrapper := ReadBitmap('Fig11-11.bmp',sWidth,tHeight);
glTexImage2D(GL_TEXTURE_2D,Level,ColorComps,sWidth,tHeight,Border,GL_RGBA,GL_UNSIGNED_BYTE,Wrapper);
freemem(wrapper);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
application.OnIdle := idle;
deltaX := 0.01;
deltaY := 0.01;
deltaZ := 0.01;
cylinderBase;
end;
glTexImage2D(GL_TEXTURE_2D,Level,ColorComps,sWidth,tHeight,Border,GL_RGBA,GL_UNSIGNED_BYTE,Wrapper);
glTexImage2D(GL_TEXTURE_2D,Level,ColorComps,sWidth,tHeight,Border,GL_RGB,GL_UNSIGNED_BYTE,Wrapper);