【问题标题】:Adding .bmp as a cover not showing correctly添加 .bmp 作为封面未正确显示
【发布时间】:2013-01-18 18:40:07
【问题描述】:

试图获得一个 bmp 来包裹一个物体(圆柱体)。我有一个非图像纹理来包装 圆柱体,但是当我尝试对图像执行相同操作时,它会出现 有一个模糊/白色的电视屏幕黑白颜色吗?我将发布我所做的更改以尝试让 bmp 工作。希望我能得到一些答案:d

首先我需要一个 24 位真彩色 256x256 图像。我在 Paint 中创建了这个 将其大小调整为 256 x 256 像素并保存为 24 位 (.bmp)

第二个是接口部分。因为它有一些类型和 const 可能会有所帮助 把这个想出来(解决;计算出;弄明白。在此我添加了 RTGB 类型和 TWrap 以及 var wapper。还 由于 24 位 windows bmp 文件没有 alpha,因此将 Const "ColorComps=3" 改为 4 零件。这是界面,因为它可能会有所帮助。但我认为问题在于函数 readbitmap。

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(我认为我的问题出在此处)。 应该怎么做。。 打开指定文件,获取文件大小并减去标题大小,得到实际位图的大小。然后它读取文件头并检查有效的位图签名。接下来,该函数读取信息标头并提取以像素为单位的宽度和高度,并通过 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;

最后,我为 oncreate 事件添加了一些更新。 var sWidth 和 tHeight 它应该从读取位图函数中获取宽度/高度。和 openGL 命令 用于包装

 Wrapper := ReadBitmap('SomeImage.bmp',sWidth,tHeight);
  glTexImage2D(GL_TEXTURE_2D,Level,ColorComps,sWidth,tHeight,Border,GL_RGB,GL_UNSIGNED_BYTE,Wrapper);
  freemem(Wrapper);

现在看起来像

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;

【问题讨论】:

  • 你的纹理是 RGBA,还是只是 RGB?它看起来像是 RGB,但您在 glTexImage2D 中绑定了一个 RGBA。只是一个想法......
  • 我添加的纹理/图像是 RBG windows 格式,在读取位图的末尾,我将 RBG 交换为 RGB .. 图像显示但只有黑白.. 和任何颜色图像上变成黑/白雪色
  • 非常感谢您的帮助。它正在将 rbga 更改为 rbg
  • 最后一条评论是这个问题的答案吗??

标签: delphi opengl delphi-xe2


【解决方案1】:
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);

刚刚从 GL_RGB 中取出 A

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多