程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi下OpenGL2d繪圖(01)-初始化

Delphi下OpenGL2d繪圖(01)-初始化

編輯:Delphi

一、前言:

Delphi默認支持OpenGl,可以uses OpenGL單元進行引用,便可以使用OpenGL的函數。OpenGl是跨平台的,而且Windows很早就支持並集成在系統中,存在於system32中的opengl32.dll,不需要額外安裝。雖然windows本身有d3d,但能力有限,還沒去學習怎麼用。

引用別人的話:OpenGL僅僅支持以下幾種基本幾何圖形:點,線和多邊形。沒有表面或者更高級的圖形(比如球狀圖形)能被作為基本圖形元素繪制。但是它們能夠用多邊形完美的模仿出來。隨意看看現代3D游戲,你會發現它們完全由三角形建立。因此,我們不會被此限制所約束。

二、初始化

在使用OpenGL之前,需要先進行一些相關的參數設置。一般流程為“設置匹配的像素格式”(ChoosePixelFormat、SetPixelFormat)、“創建一個新的OpenGL渲染描述表”(wglCreateContext)、“設置OpenGL相關參數”、“繪圖”(glBegin、glEnd)、“刪除OpenGL渲染描述表”(wglDeleteContext)等。

procedure TForm1.FormCreate(Sender: TObject);
var
 pfd:TPIXELFORMATDESCRIPTOR;
  pixelFormat: Integer;
begin
  With pfd do
  begin
    nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size
    nVersion := 1; // version
    dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering
    iPixelType := PFD_TYPE_RGBA; // color type
    cColorBits := 24; // preferred color depth
    cRedBits := 0;
    cRedShift := 0; // color bits (ignored)
    cGreenBits := 0;
    cGreenShift := 0;
    cBlueBits := 0;
    cBlueShift := 0;
    cAlphaBits := 0;
    cAlphaShift := 0; // no alpha buffer
    cAccumBits := 0;
    cAccumRedBits := 0; // no accumulation buffer,
    cAccumGreenBits := 0; // accum bits (ignored)
    cAccumBlueBits := 0;
    cAccumAlphaBits := 0;
    cDepthBits := 16; // depth buffer
    cStencilBits := 0; // no stencil buffer
    cAuxBuffers := 0; // no auxiliary buffers
    iLayerType := PFD_MAIN_PLANE; // main layer
    bReserved := 0;
    dwLayerMask := 0;
    dwVisibleMask := 0;
    dwDamageMask := 0;
  end;
  FDC := GetDC(Handle);
  pixelFormat := ChoosePixelFormat(FDC, @pfd);
  if pixelFormat = 0 then
    Exit;
  if not SetPixelFormat(FDC, pixelFormat, @pfd) then
    Exit;
  FHRC := wglCreateContext(FDC);
  wglMakeCurrent(FDC, FHRC);

  // 設置背景色為 黑色 參數為 RGBA
  glClearColor(0, 0, 0, 0);
  // 設置視圖投影變換矩陣 正投影
  glMatrixMode(GL_PROJECTION);
  // 重置當前指定的矩陣為單位矩陣
  glLoadIdentity;
  // 指定OpenGL在此區域內繪圖
  glViewPort(0, 0, ClientWidth, ClientHeight);
  // 設置世界坐標系的范圍
  gluOrtho2D(0, ClientWidth, ClientHeight, 0);
  // 將矩陣變換對象切換為模型視圖變換
  glMatrixMode(GL_MODELVIEW);
  // 重置當前指定的矩陣為單位矩陣
  glLoadIdentity;
end;

三、繪圖

OpenGL的基本圖元為點、線、多邊形等,每次繪圖都需要使用glBegin()與glEnd()。如以下繪制函數procedure Draw;

procedure TForm1.Draw;
begin
  // 清空緩沖區
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  // 清空緩沖區
  glColor3ub(0, 255, 0);
  glBegin(GL_TRIANGLES);//告訴OpenGL將要繪制三角形
  glVertex2f(200, 300);  //傳輸三角形的三個頂點坐標給OpenGL
  glVertex2f(400, 300);
  glVertex2f(300, 150);
  glEnd; //結束圖元的繪制。
  SwapBuffers(FDC); //交換雙緩沖區內容,這將把剛繪制的圖形翻印到屏幕上。
end;

四、最後記得釋放。全部代碼如下:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
    FDC: HDC;
    FHRC: HGLRC;
    procedure Draw;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Draw;
begin
  // 清空緩沖區
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  // 清空緩沖區
  glColor3ub(0, 255, 0);
  glBegin(GL_TRIANGLES);//告訴OpenGL將要繪制三角形
  glVertex2f(200, 300);  //傳輸三角形的三個頂點坐標給OpenGL
  glVertex2f(400, 300);
  glVertex2f(300, 150);
  glEnd; //結束圖元的繪制。
  SwapBuffers(FDC); //交換雙緩沖區內容,這將把剛繪制的圖形翻印到屏幕上。
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 pfd:TPIXELFORMATDESCRIPTOR;
  pixelFormat: Integer;
begin
  With pfd do
  begin
    nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size
    nVersion := 1; // version
    dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering
    iPixelType := PFD_TYPE_RGBA; // color type
    cColorBits := 24; // preferred color depth
    cRedBits := 0;
    cRedShift := 0; // color bits (ignored)
    cGreenBits := 0;
    cGreenShift := 0;
    cBlueBits := 0;
    cBlueShift := 0;
    cAlphaBits := 0;
    cAlphaShift := 0; // no alpha buffer
    cAccumBits := 0;
    cAccumRedBits := 0; // no accumulation buffer,
    cAccumGreenBits := 0; // accum bits (ignored)
    cAccumBlueBits := 0;
    cAccumAlphaBits := 0;
    cDepthBits := 16; // depth buffer
    cStencilBits := 0; // no stencil buffer
    cAuxBuffers := 0; // no auxiliary buffers
    iLayerType := PFD_MAIN_PLANE; // main layer
    bReserved := 0;
    dwLayerMask := 0;
    dwVisibleMask := 0;
    dwDamageMask := 0;
  end;
  FDC := GetDC(Handle);
  pixelFormat := ChoosePixelFormat(FDC, @pfd);
  if pixelFormat = 0 then
    Exit;
  if not SetPixelFormat(FDC, pixelFormat, @pfd) then
    Exit;
  FHRC := wglCreateContext(FDC);
  wglMakeCurrent(FDC, FHRC);

  // 設置背景色為 黑色 參數為 RGBA
  glClearColor(0, 0, 0, 0);
  // 設置視圖投影變換矩陣 正投影
  glMatrixMode(GL_PROJECTION);
  // 重置當前指定的矩陣為單位矩陣
  glLoadIdentity;
  // 指定OpenGL在此區域內繪圖
  glViewPort(0, 0, ClientWidth, ClientHeight);
  // 設置世界坐標系的范圍
  gluOrtho2D(0, ClientWidth, ClientHeight, 0);
  // 將矩陣變換對象切換為模型視圖變換
  glMatrixMode(GL_MODELVIEW);
  // 重置當前指定的矩陣為單位矩陣
  glLoadIdentity;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  wglMakeCurrent(FDC, FHRC);
  wglDeleteContext(FHRC);
  ReleaseDC(Handle, FDC);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Draw;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  // 窗口改變大小時重新指定繪圖區域
  glClearColor(0, 0, 0, 0);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glViewPort(0, 0, ClientWidth, ClientHeight);
  gluOrtho2D(0, ClientWidth, ClientHeight, 0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
end;

end.

五、運行效果圖如下:

2014-06-26 by lin

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved