亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi版OpenGL樣例代碼導游

2019-11-18 18:40:19
字體:
來源:轉載
供稿:網友
 

由于Delphi自帶OpenGL.pas是1.0版的,而現在實際使用的至少是1.1版,Windows純軟件模擬方式也是1.1版的,所以要自己導入一些必要的函數。也可用一些開源的免費單元,如Mike Lischke的OpenGL12.pas。當然,自己寫可以設計得更簡潔,而且不必在過于超前完備的龐大代碼中找錯誤。

首先引入必要的單元Windows, Messages, OpenGL

要增加一些必要的擴展。

const
  // GL_EXT_bgra
  GL_BGR_EXT                                 = $80E0;
  GL_BGRA_EXT                                = $80E1;

  // polygon offset
  GL_POLYGON_OFFSET_UNITS                    = $2A00;
  GL_POLYGON_OFFSET_POINT                    = $2A01;
  GL_POLYGON_OFFSET_LINE                     = $2A02;
  GL_POLYGON_OFFSET_FILL                     = $8037;
  GL_POLYGON_OFFSET_FACTOR                   = $8038;


PRocedure glBindTexture(target: GLEnum; texture: GLuint); stdcall; external opengl32;
procedure glDeleteTextures(n: GLsizei; textures: PGLuint); stdcall; external opengl32;
procedure glGenTextures(n: GLsizei; textures: PGLuint); stdcall; external opengl32;
function glIsTexture(texture: GLuint): GLboolean; stdcall; external opengl32;
procedure glPolygonOffset(factor, units: GLfloat); stdcall; external opengl32;

// 此聲明用于糾正OpenGL.pas的一個bug
function gluBuild2DMipmaps(target: GLEnum; components, width, height: GLint; format, atype: GLEnum; Data: Pointer): GLint; stdcall; external opengl32;

現在接口已經基本升級到1.1版。如果還需要其他擴展,可類似增加。

接下來,要創建OpenGL的繪圖上下文RC,為此需要GDI窗口的設備上下文DC。TForm.Handle屬性或其他TWinControl的Handle屬性都是DC??墒褂萌缦潞瘮涤蒁C創建RC,返回值為RC的句柄。之后即可使用OpenGL繪圖。一般可在Form的OnCreate事件內使用。此函數的選項含義分別為深度緩沖區,模版緩沖區,積累緩沖區,生成Alpha通道的值。

type
  TRCOptions = set of (roDepth, roStencil, roAccum, roAlpha);

function CreateRC(dc: HDC; opt: TRCOptions): HGLRC;
var
  PFDescriptor: TPixelFormatDescriptor;
  PixelFormat: Integer;
begin
  FillChar(PFDescriptor, SizeOf(PFDescriptor), 0);
  with PFDescriptor do
  begin
    nSize := SizeOf(PFDescriptor);
    nVersion := 1;
    dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER;
    iPixelType := PFD_TYPE_RGBA;
    cColorBits := GetDeviceCaps(DC, BITSPIXEL) * GetDeviceCaps(DC, PLANES);
    if roDepth in opt then cDepthBits := 24;
    if roStencil in opt then cStencilBits := 8;
    if roAccum in opt then cAccumBits := 64;
    iLayerType := PFD_MAIN_PLANE;
  end;

  PixelFormat := ChoosePixelFormat(DC, @PFDescriptor);
  Assert(PixelFormat <> 0);
  Assert(SetPixelFormat(DC, PixelFormat, @PFDescriptor));
  Result := wglCreateContext(DC);
  Assert(Result <> 0);
  wglMakeCurrent(dc, Result);
end;

在Form的OnPaint事件里繪圖。記住,繪圖完成后要用SwapBuffers(dc: HDC)交換繪圖緩沖和顯示緩沖,這樣圖象才會顯示出來。還要記得在Form的OnResize事件里調用 glViewport(0, 0, ClientWidth, ClientHeight); 好讓RC和DC同步。

在Form的OnDestroy事件里銷毀RC。

procedure DestroyRC(rc: HGLRC);
begin
  if rc = 0 then Exit;
  wglMakeCurrent(0, 0);
  wglDeleteContext(rc);
end;

至此,一個OpenGL程序的框架就大致成型。但還有問題要解決。

第一,要防止Windows擦除背景而影響速度。在Form中加入成員函數

  private
    procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;

procedure TGLWindow.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
  Message.Result := 1;
end;

第二,為了更保險些。再增加以下成員函數。

  protected
    procedure CreateParams(var Params: TCreateParams); override;

procedure TGLWindow.CreateParams(var Params: TCreateParams);
begin
  inherited;
  with Params do
  begin
    Style := Style or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
    WindowClass.Style := CS_VREDRAW or CS_HREDRAW or CS_OWNDC;
  end;
end;

好,現在就可以忘掉這些麻煩的東西了,寫你的精彩3D顯示吧:)

還得嘮叨幾句,在一個線程里不要創建多個RC,這樣會嚴重影響性能。有些個人的OpenGL窗口控件演示有在一個Form上放多個控件,其實并非好主義。應該用一個OpenGL窗口顯示多個視圖。另外,不要跨線程訪問OpenGL函數。

還有Windows自動安裝顯卡驅動時不會安裝OpenGL的硬件加速,一定要自己安裝顯卡廠商的驅動!

另外,副贈全屏顯示的函數:)

function FullScreen(win: TWinControl; width, height, bitdepth: integer): boolean;
var displaymode: DEVMODE;
begin
  FillChar(displaymode, sizeof(displaymode), 0);
  with displaymode do
  begin
    dmSize := sizeof(displaymode);
    dmPelsWidth := width;
    dmPelsHeight := height;
    dmBitsPerPel := bitdepth;
    dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;
  end;
  if ChangeDisplaySettings(displaymode, CDS_FULLSCREEN) = DISP_CHANGE_SUCCESSFUL
  then begin
    ShowWindow(win.Handle, WS_MAXIMIZE);
    result := true;
  end
  else result := false;
end;

procedure RestoreDisplay(win: TWinControl);
begin
  ChangeDisplaySettings(PDEVMODE(0)^, 0);
  ShowWindow(win.Handle, SW_RESTORE);
end;


上一篇:Delphi中的類和對象

下一篇:delphi中的時間操作技術(2)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久人人97超碰精品888| 中文字幕久热精品视频在线| 亚洲精品福利在线观看| 欧美综合一区第一页| 日韩免费在线看| 日韩一区视频在线| 国产精品一香蕉国产线看观看| 亚洲精品久久久久久久久| 日韩av手机在线| 国内精品久久久久久久久| 亚洲国产成人久久综合| 中文字幕久精品免费视频| 日韩精品视频中文在线观看| 国内精品久久久久久中文字幕| 国产精品视频精品视频| 精品亚洲国产成av人片传媒| 欧美伊久线香蕉线新在线| 国产精品观看在线亚洲人成网| 欧美国产精品va在线观看| 亚洲精品aⅴ中文字幕乱码| 色偷偷88888欧美精品久久久| 日韩专区中文字幕| 欧美性高跟鞋xxxxhd| 日韩av电影手机在线| 九色精品免费永久在线| 91人人爽人人爽人人精88v| 久久99精品久久久久久噜噜| 欧洲精品久久久| 国产免费久久av| 国产精品久久久久久久久久久久久| 国语自产精品视频在线看一大j8| 欧美精品videossex88| 欧美激情第1页| 久久久国产91| 国产成+人+综合+亚洲欧美丁香花| 日韩精品视频在线播放| 亚洲爱爱爱爱爱| 亚洲国产古装精品网站| 亚洲综合在线小说| 欧美天天综合色影久久精品| 成人福利视频网| 91sao在线观看国产| 亚洲福利在线观看| 亚洲国产精品久久久久久| 欧美日韩免费区域视频在线观看| 国产精品88a∨| 96精品视频在线| 久久久女女女女999久久| 国产精品视频永久免费播放| 国产精品欧美日韩久久| 欧美精品aaa| 久久人人爽人人爽爽久久| 国产亚洲欧美aaaa| 国产在线精品自拍| 在线看欧美日韩| 精品视频在线播放免| 日韩av在线导航| 91精品国产成人www| 久久久久久亚洲精品| 91国语精品自产拍在线观看性色| 欧美成人在线影院| 国产欧美在线视频| 日韩福利在线播放| 午夜精品美女自拍福到在线| 欧美一区二区影院| 成人美女av在线直播| 亚洲第一视频在线观看| 国产精品视频男人的天堂| 91沈先生作品| 成人精品aaaa网站| 国产亚洲一区精品| 亚洲国产精品va在线看黑人| 精品久久久一区二区| 日韩电影第一页| 成人网中文字幕| 欧美视频在线视频| 最近免费中文字幕视频2019| 在线播放日韩av| 91豆花精品一区| 欧美噜噜久久久xxx| 98精品国产自产在线观看| 日韩av一区在线观看| 色妞一区二区三区| 2019国产精品自在线拍国产不卡| 国产精品视频免费在线| 91老司机精品视频| 亚洲欧美国内爽妇网| 91av视频在线| 亚洲国产精品久久91精品| 激情久久av一区av二区av三区| 久久精品欧美视频| 欧美亚洲国产视频小说| 国产精品日韩在线观看| 最近中文字幕mv在线一区二区三区四区| 精品无人区太爽高潮在线播放| 欧亚精品在线观看| 国产有码一区二区| 欧美性视频在线| 国产成人精品综合久久久| 一区二区在线视频播放| 美女性感视频久久久| 精品激情国产视频| 欧美国产日韩二区| 欧美一级成年大片在线观看| 久久精品国产一区二区电影| 亚洲欧美日韩一区在线| 久热在线中文字幕色999舞| 国产成人精品日本亚洲专区61| 久久九九免费视频| 精品二区三区线观看| 91大神福利视频在线| 亚洲日本欧美中文幕| 国产一区二区视频在线观看| 精品久久久久久久久国产字幕| 色噜噜久久综合伊人一本| 国产精品第七十二页| 成人免费在线视频网址| 日韩av最新在线观看| 亚洲欧美激情一区| 亚洲已满18点击进入在线看片| 韩国一区二区电影| 欧洲永久精品大片ww免费漫画| 在线观看久久av| 中文字幕视频在线免费欧美日韩综合在线看| 91影视免费在线观看| 91av成人在线| 亚洲国产另类 国产精品国产免费| 久久伊人精品天天| 国产一区二区三区日韩欧美| 国产日韩在线观看av| 欧美视频在线观看免费网址| 97色伦亚洲国产| 日韩精品免费综合视频在线播放| 伊人久久久久久久久久久| 久久成人精品一区二区三区| 久久精品视频99| 成人h猎奇视频网站| 欧美性xxxxxxxxx| 国产精选久久久久久| 国产欧美久久久久久| 欧美成人合集magnet| 亚洲美女激情视频| 久久久视频在线| 国模视频一区二区三区| 992tv成人免费影院| 国产精品中文字幕在线| 性色av一区二区三区在线观看| 欧美插天视频在线播放| 亚洲乱码国产乱码精品精天堂| www.99久久热国产日韩欧美.com| 久久久久久国产精品三级玉女聊斋| 日韩亚洲欧美中文高清在线| 黄色一区二区三区| 日韩大片在线观看视频| 精品丝袜一区二区三区| 国自产精品手机在线观看视频| 日韩高清av在线| 亚洲一区二区中文| 亚洲天堂av图片| 亚洲福利视频在线| 国色天香2019中文字幕在线观看| 国产精品va在线播放| 欧美刺激性大交免费视频| 2019中文字幕免费视频|