0

オブジェクト (円柱) をラップする bmp を取得しようとしています。シリンダーをラップする画像以外のテクスチャを取得しましたが、画像で同じことをしようとすると、ぼやけた/白いテレビ画面の白黒が表示されますか? bmpを機能させるために変更したものを投稿します。うまくいけば、私はいくつかの答えを得ることができます:d

まず、24 ビットのトゥルーカラー 256x256 画像が必要でした。これをペイントで作成し、256 x 256 ピクセルにサイズ変更して、24 ビット (.bmp) として保存しました。

2 つ目はインターフェース部分です。これを理解するのに役立ついくつかの型と const があるためです。これで、タイプ RTGB と TWrap を var wapper と共に追加しました。また、24 ビット Windows の bmp ファイルにはアルファ コンポーネントがないため、Const を 4 ではなく "ColorComps=3" にしました。これはインターフェースです。しかし、問題は 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;
4

1 に答える 1

0
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 を取り出しただけです

于 2013-02-06T07:37:46.403 に答える