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

首頁 > 編程 > Delphi > 正文

DELPHI中OPENGL程序設(shè)計(jì)

2019-11-18 18:38:10
字體:
供稿:網(wǎng)友
 

OPENGL圖形程序設(shè)計(jì)
OPENGL是一個(gè)三維圖形和模型庫,由于它在三維圖形方面的杰出性能,目前許多高級(jí)語言都提供了與OPENGL的接口,如:VC、DELPHI、C++Builder等。使用OPENGL可以極大地減少用戶開發(fā)圖形、圖像的難度,使用戶制作高水準(zhǔn)的商業(yè)廣告、圖形CAD、三維動(dòng)畫、圖形仿真和影視采集。

一、OPENGL的功能
 OPENGL原來是工作站上的一個(gè)圖形軟件庫,由于它在商業(yè)、軍事、醫(yī)學(xué)、航天航空等領(lǐng)域的廣泛應(yīng)用,目前在低檔電腦也可以開發(fā)出符合用戶要求的圖形。OPENGL不僅可以繪制基本圖像,而且提供了大量處理圖形圖像的函數(shù)與過程。
1、圖形變換
 是圖形顯示與制作的基礎(chǔ),動(dòng)畫設(shè)計(jì)和動(dòng)畫顯示都離不開圖形的變換,圖形變換在數(shù)學(xué)上是由矩形的乘法來實(shí)現(xiàn)的,變換一般包括平移、旋轉(zhuǎn)和縮放。按圖形的顯示性質(zhì)來分:視點(diǎn)變換、模型變換、投影變換、剪裁變換和視口變換等。
2、光照效果
 不發(fā)光的物體的顏色是由物體反射外界光所形成的,這是光照。在三維圖形中,如果光照使用不當(dāng),三維圖形就會(huì)失去真實(shí)的立體感,OPENGL把光照分為:輻射光、環(huán)境光、散射光、反射光等。
3、紋理映射
 通過紋理映射可以在三維表面添加顯示現(xiàn)實(shí)世界中的紋理。如:一個(gè)矩形它不能表示真實(shí)世界中的物體,如果填上"本質(zhì)"紋理,就逼真了。
4、圖形特效
 混合函數(shù)、反走樣函數(shù)和霧函數(shù),可以處理三維圖形聽之任之物體的透明和半透明、使用線段理加光滑以及提供霧化的效果。
5、圖像特效
 處理位圖的基本函數(shù):圖像繪制、圖像拷貝和存儲(chǔ)、映射和轉(zhuǎn)移、圖像的縮放等。位圖操作函數(shù)可以人繪圖原的低層說明中文字符的形成過程。

二、創(chuàng)建OPENGL應(yīng)用程序
1、一般原則
 A 有uses中添加OPENGL支持單元:OpenGL;
 B 在窗體的OnCreate事件過程中初始化OPENGL;
 C 在窗口的OnPaing 事件過程中初始化OPENGL;
 D 在窗口的OnResize事件過程中初始化OPENGL;
 E 在窗口的OnDestroy 事件過程中初始化 OPENGL;
2、簡單實(shí)例
 A 創(chuàng)建一個(gè)工程FILE->New application
B 在OnCreate事件中添加代碼:
PRocedure TfrmMain.FormCreate(Sender: TObject);
var
  pfd:TPixelFormatDescriptor;   //設(shè)置描述表
  PixelFormat:Integer;
begin
  ControlStyle:=ControlStyle+[csOpaque];
  FillChar(pfd,sizeof(pfd),0);
  with pfd do
  begin
    nSize:=sizeof(TPixelFormatDescriptor);
    nVersion:=1;
    dwFlags:=PFD_DRAW_TO_WINDOW or
        PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
    iPixelType:=PFD_TYPE_RGBA;
    cColorBits:=24;
    cDepthBits:=32;
    iLayerType:=PFD_MAIN_PLANE;
  end;
  PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
  SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
  hrc:=wglCreateContext(Canvas.Handle);
  w:=ClientWidth;
  h:=ClientHeight;
end;
C 在OnDestroy事件中的代碼
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  wglDeleteContext(hrc);
end;
D 在OnPaint事件中的代碼
procedure TfrmMain.FormPaint(Sender: TObject);
begin
  wglMakeCurrent(Canvas.Handle,hrc);
  glClearColor(1,1,1,1);
  glColor3f(1,0,0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  MyDraw;
  glFlush;
  SwapBuffers(Canvas.Handle);
end;
E 在OnResize事件中的代碼
procedure TfrmMain.FormResize(Sender: TObject);
begin
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
  glViewPort(0,0,ClientWidth,ClientHeight);
  MyDraw;
end;
F 在MyDraw函數(shù)中的代碼(用戶在窗口類中聲明)
procedure TfrmMain.MyDraw;
begin
  glPushMatrix;
  Sphere:=gluNewQuadric;
  gluQuadricDrawStyle(Sphere,GLU_LINE);
  gluSphere(Sphere,0.5,25,25);
  glPopMatrix;
  SwapBuffers(Canvas.handle);
  gluDeleteQuadric(Sphere);
end;

附本程序原碼:
unit MainFrm;

interface

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

type
  TfrmMain = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
    hrc:HGLRC;
    w,h:glFloat;
    Sphere:GLUquadricObj;
  public
    { Public declarations }
    procedure MyDraw;
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
var
  pfd:TPixelFormatDescriptor;
  PixelFormat:Integer;
begin
  ControlStyle:=ControlStyle+[csOpaque];
  FillChar(pfd,sizeof(pfd),0);
  with pfd do
  begin
    nSize:=sizeof(TPixelFormatDescriptor);
    nVersion:=1;
    dwFlags:=PFD_DRAW_TO_WINDOW or
        PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
    iPixelType:=PFD_TYPE_RGBA;
    cColorBits:=24;
    cDepthBits:=32;
    iLayerType:=PFD_MAIN_PLANE;
  end;
  PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
  SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
  hrc:=wglCreateContext(Canvas.Handle);
  w:=ClientWidth;
  h:=ClientHeight;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  wglDeleteContext(hrc);
end;

procedure TfrmMain.FormPaint(Sender: TObject);
begin
  wglMakeCurrent(Canvas.Handle,hrc);
  glClearColor(1,1,1,1);
  glColor3f(1,0,0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  MyDraw;
  glFlush;
  SwapBuffers(Canvas.Handle);
end;

procedure TfrmMain.MyDraw;
begin
  glPushMatrix;
  Sphere:=gluNewQuadric;
  gluQuadricDrawStyle(Sphere,GLU_LINE);
  gluSphere(Sphere,0.5,25,25);
  glPopMatrix;
  SwapBuffers(Canvas.handle);
  gluDeleteQuadric(Sphere);
end;

procedure TfrmMain.FormResize(Sender: TObject);
begin
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
  glViewPort(0,0,ClientWidth,ClientHeight);
  MyDraw;
end;

end.

三、OPENGL變量和函數(shù)的約定
1、OPENGL的庫約定
 它共三個(gè)庫:基本庫、實(shí)用庫、輔助庫。在DELPHI中,基本庫由OpenGL單元實(shí)現(xiàn),在Windows環(huán)境中,一般不使用輔助庫。
2、OPENGL常數(shù)約定
 OPENGL常數(shù)均使用大寫字母,以"GL"開頭,詞匯之間使用下劃線分隔,如:GL_LINES,表示使用基本庫繪制直線。
3、OPENGL函數(shù)的命名約定
 A 第一部分以gl或wgl開頭,如glColor3f中的gl。
 B 第二部分是用英文表示的函數(shù)功能,單詞的首字母大寫出。
 C 第三部分是數(shù)字,表示函數(shù)的參數(shù)。
 D 第四部分是小寫字母,表示函數(shù)的類型。
b 9位整數(shù)
s 16位整數(shù)
i 32位整數(shù)
f 32位浮點(diǎn)數(shù)
d 64位浮點(diǎn)數(shù)
ub 9位無符號(hào)整數(shù)
例:glVertex2f(37,40);  {兩個(gè)32位的浮點(diǎn)數(shù)作參數(shù)}
glVertex3d(37,40,5); {三個(gè)64位的浮點(diǎn)數(shù)作參數(shù)}
   p[1..3]:array of glFloat;
glVertes3fv(p);     {3f表示三個(gè)浮點(diǎn)數(shù),v表示調(diào)用一個(gè)數(shù)組作為頂點(diǎn)坐標(biāo)輸入}

四、OPENGL的初始化
1、PIXELFORMATDESCRIPTOR結(jié)構(gòu)
 主要描述像素點(diǎn)的性質(zhì),如像素的顏色模式和紅、綠、藍(lán)顏色構(gòu)成方式等。
  tagPIXELFORMATDESCRIPTOR = packed record
    nSize: Word;
    nVersion: Word;
    dwFlags: DWORD;
    iPixelType: Byte;
    cColorBits: Byte;
    cRedBits: Byte;
    cRedShift: Byte;
    cGreenBits: Byte;
    cGreenShift: Byte;
    cBlueBits: Byte;
    cBlueShift: Byte;
    cAlphaBits: Byte;
    cAlphaShift: Byte;
    cAccumBits: Byte;
    cAccumRedBits: Byte;
    cAccumGreenBits: Byte;
    cAccumBlueBits: Byte;
    cAccumAlphaBits: Byte;
    cDepthBits: Byte;
    cStencilBits: Byte;
    cAuxBuffers: Byte;
    iLayerType: Byte;
    bReserved: Byte;
    dwLayerMask: DWORD;
    dwVisibleMask: DWORD;
    dwDamageMask: DWORD;
  end;
  TPixelFormatDescriptor = tagPIXELFORMATDESCRIPTOR;
   dwFlags代表點(diǎn)格式的屬性:
PFD_DRAW_TO_WINDOW 圖形繪在屏幕或設(shè)備表面
PFD_DRAW_TO_BITMAP 在內(nèi)存中繪制位圖
PFD_SUPPORT_GDI 支持GDI繪圖
PFD_SUPPORT_OPENGL 支持OPENGL函數(shù)
PFD_DOUBLEBUFFER 使用雙緩存
PFD_STEREO 立體緩存
PFD_NEED_PALLETTE 使用RGBA調(diào)色板
PFD_GENERIC_FORMAT 選擇GDI支持的格式繪圖
PFD_NEED_SYSTEM_PALETTE 使用OPENGL支持的硬件調(diào)色板
   iPixelType設(shè)置像素顏色模式:PFD_TYPE_RGBA或PFD_TYPE_INDEX.。
   cColorBits設(shè)置顏色的位,如是9表示有256種顏色表示點(diǎn)的顏色。
   cRedBits、cGreenBits、cBlueBits 使用RGBA時(shí),三原色所使用的位數(shù)。
   cRedShitfs、cGreenShifts、cBlueShifts 使用RGBA時(shí),三原色可以調(diào)節(jié)的位數(shù)。
   cAlphaBits、cAlphaShifts 使用RGBA時(shí),Alpha使用的位數(shù)與可調(diào)節(jié)的位數(shù)。
 cAccumBits設(shè)置累積緩存區(qū)的位面總數(shù)。
 cAccumRedBits、cAccumGreenBits、cAccumBlueBits設(shè)置累積緩存區(qū)的三原色位面總數(shù)。
 cAccumAlphaBits設(shè)置累積緩存區(qū)的Alpha位面總數(shù)。
 cDepthBits設(shè)置濃度緩存的深度。
 cStencilBits設(shè)置Stencil緩存的深度。
 cAuxBuffers指輔助緩存的大小。
 iLayerType指定層的類型。
 bReserved不使用,必須是零。
 dwLayerMask指定覆蓋層的屏蔽。
 dwDamageMask設(shè)置在相同的框架緩存下是否共用同一種像素模式。
2、OPENGL的初始化步驟
 A 使用Canvas.Handle獲得窗口句柄。
 B 創(chuàng)建一個(gè)TPixelFormatDescriptor變量定義像素格式。
 C 使用ChoosePixelFormat函數(shù)選擇像素格式。
 D 使用SetPixelFormat函數(shù)使用像素格式生效。
 E 使用wglCreateContext函數(shù)建立翻譯描述表。
 F 使用wglMakeCurrent函數(shù)把建立的翻譯描述表作為當(dāng)前翻譯描述表。
3、資源釋放
 A 使用wglDeleteContext過程刪除像素描述表。
 B 使用ReleaseDC過程釋放窗口內(nèi)存。
 在窗口的OnDestroy事件中:
 begin
  if hrc<>null then
   wglDeleteCurrent(hrc);
  if hdc<>null then
   ReleaseDC(Handle,hdc);
 end;

五、OPENGL基本圖形的繪制
1、圖形的顏色
 注意底色的設(shè)置,顏色設(shè)置通常與像素描述變量有關(guān),即與TPixelFormatDescriptor定義中的iPixelType成員有關(guān)。
 iPixelType:=PFD_TYPE_COLORINDEX;
 則只能使用glIndexd,glIndexf,glIndexi,glIndexs,glIndexv,glIndexfv,glIndexiv,glIndexsv過程設(shè)置圖形顏色。
 iPixelType:=PFD_TYPE_RGBA;
 則只能使用 glColor3b,glColor3f,glColor4b,glColor4f,glColor4fv設(shè)置圖形顏色。
A 圖形底色:屏幕與窗口的顏色,即顏色緩沖區(qū)的顏色。改變圖形底色首先應(yīng)使用glClearColor過程設(shè)定底色,然后使用glClear過程以這種底色刷新窗口和屏幕。
 procedure glClearColor(red:GLClampf,green:GLClampf,blue:GLClampf,alpha:GLClampf);
 procedure glClear(mask:GLBitField);
 red,green,blue,alpha是準(zhǔn)備設(shè)置的底色,它們的取值是0到1。mask是刷新底色的方式。
例:將繪聲繪色圖窗口設(shè)置為綠色
glClearColor(0,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);
mask的取值和意義:
GL_COLOR_BUFFER_BIT 設(shè)置當(dāng)前的顏色緩沖
GL_DEPTH_BUFFER_BIT 設(shè)置當(dāng)前的深度緩沖
GL_ACCUM_BUFFER_BIT 設(shè)置當(dāng)前的積累緩沖
GL_STENCIL_BUFFER_BIT 設(shè)置當(dāng)前的STENCIL(模板)緩沖
繪圖窗口設(shè)置為灰色
glClearColor(0.3,0.3,0.3,1);
glClear(GL_COLOR_BUFFER_BIT);
B 圖形顏色
 使用glClear3f與glClear4f可以設(shè)置圖形的繪制顏色。若用三個(gè)參數(shù),則分別指設(shè)置紅、藍(lán)、綠三色光。若用四個(gè)參數(shù),則第四個(gè)表示RGBA值。
 例設(shè)置當(dāng)前的繪圖顏色為藍(lán)色:
 glColor3f(0,0,1);
 設(shè)置繪圖顏色為白色:
 glColor3f(1,1,1);
2、簡單圖形的繪制
 在glBegin與glEnd過程之間繪制簡單圖形,如點(diǎn)、線、多邊形等。
 glBegin(mode:GLenum);{繪制過程}glEnd;
 mode的取值:
GL_POINTS 畫多個(gè)點(diǎn)
GL_LINES 畫多條線,每兩點(diǎn)繪制一條直線
GL_LINE_STRIP 繪制折線
GL_LINE_LOOP 繪制首尾相接的封閉多邊形
GL_TRIANGLES 繪制三角形
GL_TRIANGLE_STRIP 繪制三邊形,每三個(gè)點(diǎn)繪制繪制一個(gè)三邊形
GL_TRIANGLE_FAN 繪制三角形
GL_QUADS 繪制四邊形
GL_QUAD_STRIP 繪制四邊條,每四點(diǎn)繪制一個(gè)四邊條
GL_POLYGON 繪制多邊形
 例繪制三個(gè)點(diǎn):
 begin
  glPushMatrix;
  glBegin(GL_POINT);
   glVertex2f(0.1,0.1);
   glVertex2f(0.5,0.5);
   glVertex2f(0.1,0.3);
  glEnd;
  SwapBuffers(Canvas.Handle);
 end;
如果將GL_POINT改為GL_LINES,則將畫一條線.第三個(gè)點(diǎn)無效.在glVertex2f之前執(zhí)行g(shù)lColor3f(0,0,1)則將線條的顏色改為綠色. 如果將GL_LINES改為GL_LINE_STRIP則可以繪制兩條直線.
 使用glPointSize過程可以設(shè)置點(diǎn)的大小;使用glLineWidth過程可以設(shè)置線的寬度.
 使用glLineStipple過程設(shè)置點(diǎn)劃線的樣板,使用glEnable(GL_LINE_STIPPLE)過程和對(duì)應(yīng)參數(shù)使繪圖能夠繪制點(diǎn)劃線.glDisable(GL_LINE_STIPPLE)過程和對(duì)應(yīng)參數(shù)關(guān)閉點(diǎn)劃線.
 procedure glLineStipple(factor:GLint,pattern:GLushort);
 參數(shù)factor表示點(diǎn)劃線樣板Pattern的重復(fù)次數(shù),factor取值1255,Pattern是二進(jìn)制序列.
 glLineStipple(1,0,0x11C);{0x11C表示為10001110,0表示不畫點(diǎn),1表示畫點(diǎn)}
例:   begin
  glColor3f(1,0,0);
  glLineWidth(2);
  glLineStipple(1,$11C);
  glEnable(GL_LINE_STIPPLE);
  glBegin(GL_LINES);
   glVertex2f(-0.9,0.3);
   glVertex2f(0.9,0.3);
  glEnd;
  glDisable(GL_LINE_STIPPLE);
  glColor3f(1,0,1);
  glLineStipple(2,$11C);
  glEnable(GL_LINE_STIPPLE);
  glBegin(GL_LINES);
   glVertex2f(-0.9,0.1);
   glVertex2f(0.9,0.1);
  glEnd;
  glDisable(GL_LINE_STIPPLE);
  SwapBuffers(Canvas.Handle);
 end;
 多邊形繪制與點(diǎn)線相似,要改變參數(shù)為GL_POLYGON,GL_QUADS,GL_TRANGLES.在繪制時(shí)的注意事項(xiàng):
 A 多邊形的邊與邊只在頂點(diǎn)相交
 B 多邊形必須是凸多邊形,如果是凹多邊形,用戶只有折成凸多邊形,加快繪制速度.
例: glBegin(GL_POLYGON);
  glVertex2f(-0.9,0.3);
  glVertex2f(0.9,0.3);
  glVertex2f(0.9,-0.6);
  glVertex2f(0.5,-0.6);
  glVertex2f(-0.9,-0.2);
 glEnd;
多邊形有正面與反面,與之相關(guān)的過程:
glPolygonMode 控制多邊形正,反面繪圖模式
glFrontface 指定多邊形的正面
glCullFace 顯示多邊形是設(shè)置消除面
glPolygonStripple 形成多邊形填充的樣式
3、簡單二次曲面
 圓柱,圓環(huán)和球都屬于二次曲面.
A 圓柱
gluCylinder(qobj:GLUquadricObj,baseRadius:GLdouble,topRadius:GLdouble,height:GLdouble,
slices:GLint,stacks:GLint);
qobj指定一個(gè)二次曲面,baseRadius為圓柱的底半徑;topRadius為所繪制圓柱的上頂面半徑;height為圓柱的高;slices為繞Z軸的分割線數(shù);stacks為沿Z軸的分割線數(shù).
如果baseRadius和topRadius不相等,則可以繪制錐臺(tái)與圓錐.
procedure TfrmMain.MyDraw;
var
  qObj:GLUQuadricObj;
begin
  glPushMatrix;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glColor3f(1,0,0);
  qObj:=gluNewQuadric;
  gluQuadricDrawStyle(qObj,GLU_LINE);
  gluCylinder(qObj,0.5,0.1,0.2,10,10);
end;
B 圓環(huán)
gluDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
loops:GLint);
procedure TfrmMain.MyDraw;
var
  qObj:GLUQuadricObj;
begin
  glPushMatrix;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glColor3f(1,0,0);
  qObj:=gluNewQuadric;
  gluQuadricDrawStyle(qObj,GLU_LINE);
  gluDisk(qObj,0.2,0.5,10,5);
  SwapBuffers(Canvas.Handle);
end;
C 半圓環(huán)
gluPartialDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
loops:GLint,startAngle:GLdouble,sweepAngle:GLdouble);
startAngle,sweepAngle是半圓環(huán)的起始角與終止角.
procedure TfrmMain.MyDraw;
var
  qObj:GLUQuadricObj;
begin
  glPushMatrix;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glColor3f(1,0,0);
  qObj:=gluNewQuadric;
  gluQuadricDrawStyle(qObj,GLU_LINE);
  gluPartialDisk(qObj,0.2,0.5,10,5,90,190);
  SwapBuffers(Canvas.Handle);
end;
D 球體
function gluSphere(qObj:GLUquadricObj,radius:GLdouble,slices:GLint,stacks:GLint);
procedure TfrmMain.MyDraw;
var
  qObj:GLUQuadricObj;
begin
  glPushMatrix;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glColor3f(1,0,0);
  qObj:=gluNewQuadric;
  gluQuadricDrawStyle(qObj,GLU_LINE);
{ silhouette[ silu(:)5et ]n.側(cè)面影象, 輪廓}
  gluSphere(qObj,0.5,20,20);
  SwapBuffers(Canvas.Handle);
end;
E 關(guān)于二次曲面的過程
gluNewQuadric 創(chuàng)建一個(gè)新的二次曲面對(duì)象
gluDeleteQuadric 刪除一個(gè)二次曲面對(duì)象
gluQuadricDrawStyle 指定要繪制的二次曲面類型
gluQuadricNormal 設(shè)置二次曲面的法矢量
gluQuadricOrientation 設(shè)置二次曲面是內(nèi)旋還是外旋轉(zhuǎn)
gluQuadricTexture 設(shè)置二次曲面是否使用紋理
F 繪制二次曲面的一般步驟
 首先定義一個(gè)GLUquadricObj對(duì)象;
 其次創(chuàng)建一個(gè)曲面對(duì)象gluNewQuadric;
 再次設(shè)置二次曲面的特性(gluQuadricDrawStyle, gluQuadricTexture)
 繪制二次曲面(gluCylinder,gluSphere,gluDisk, gluPartialDisk)

六、OPENGL中的變換
 變換是動(dòng)畫設(shè)計(jì)的基礎(chǔ),包括圖形的平移,旋轉(zhuǎn),縮放等操作,在數(shù)學(xué)上是通過矩陣來實(shí)現(xiàn)的。
1 glLoadIdentity過程
 能夠把當(dāng)前矩陣變?yōu)閱挝痪仃嚒?BR>2 glLoadMatrix過程
 能夠把指定的矩陣設(shè)為當(dāng)前矩陣。
 procedure glLoadmatrixd(m:GLdouble);
 procedure glLoadmatrixf(m:GLfloat);
 m表示4X4矩陣,下面的代碼定義并使之成為當(dāng)前矩陣
 M:array[1..4,1..4] of GLfloat;
 glLoadMatrix(@M);
3 glMultMatrix過程
 能夠?qū)?dāng)前矩與指定矩陣相乘,并把結(jié)果作為當(dāng)前矩.
 procedure glMultMatrixd(M:GLdouble);
 procedure glMultMatrixf(M:GLfloat);
4 glPushMatrix和glPopmatrix
 glPushMatrix能夠把當(dāng)前矩壓入矩陣堆棧, glPopMatrix能夠把當(dāng)前矩彈出矩陣堆棧.
 glPushMatrix能夠記憶矩陣當(dāng)前位置,glPopmatrix能夠返回以前所在的位置.
 注:glPushMatrix與glPopMatrix必須放在glBegin與glEnd之外.
5 投影變換
A glOrtho能夠創(chuàng)建一個(gè)正投影矩陣,把當(dāng)前矩乘以該正投影矩陣,其結(jié)果作為當(dāng)前矩陣.
function glOrtho(left:GLdouble,right:GLdouble,bottom:GLdouble,top:GLdouble,
near:GLdouble,far:GLdouble);
 procedure TfrmMain.FormResize(Sender: TObject);
var
  nRange:GLfloat;
begin
  nRange:=50.0;
  w:=clientWidth;
  h:=clientHeight;
  if h=0 then
    h:=1;
  glViewPort(0,0,w,h);
  if w<=h then
    glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,
      -nRange,nRange)
  else
    glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
      -nRange,nRange);
  repaint;
end;
B glOrtho2D只定義正投影視景體前,后,左,右.
 procedure glOrtho(left:GLdouble,right:GLdouble,bottom:GLdouble,top:GLdouble);
C glMatrixMode過程
 能夠設(shè)置當(dāng)前操作矩陣的類型
 procedure glMatrixMode(mode:GLenum);
 mode的取值:
GL_MODELVIEW 指定以后的矩陣操作為模型矩陣堆棧
GL_PROJECTION 指定以后的矩陣操作為投影矩陣堆棧
GL_TEXTURE 指定以后的矩陣操作為紋理矩陣堆棧
D glFrustum過程
 創(chuàng)建一個(gè)透視斜投影矩陣,并把當(dāng)前矩陣乘以該斜投影矩陣,其結(jié)果為當(dāng)前矩陣.
 procedure glFrustum(left:GLdouble,right:GLdouble,bottom:GLdouble,top:GLdouble,
  next:GLdouble,far:GLdouble);
 這些參數(shù)定義了斜投影的左,右,上,下,前,后剪裁面.
E gluPerspective過程
 能夠定義一個(gè)以Z軸為中線的四棱臺(tái)視景體.
 procedure gluPerspetive(fovy:GLdouble,aspect:GLdouble,zNear:GLdouble,zFar:GLdouble);
 fovy定義了xoz平面的視角,aspect定義了x和y方向上的比例,zNear和zFar分別定義了視點(diǎn)到剪裁面和后剪裁面的距離.
 procedure TfrmMain.FormResize(Sender: TObject);
var
  aspect:GLfloat;
begin
  w:=ClientWidth;
  h:=ClientHeight;
  if h=0 then
    h:=1;
  glViewPort(0,0,clientWidth,Clientheight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  aspect:=w/h;
  gluPerspective(30.0,aspect,1.0,50.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
end;
6 幾何變換矩陣
 三維物體的運(yùn)動(dòng)姿態(tài)變換,是指物體的平移,旋轉(zhuǎn),縮放.
A glTranslate過程能夠把坐標(biāo)原點(diǎn)移到(x,y,z),它的聲明語法:
 procedure  glTranslated(x:GLdouble,y:GLdouble,z:GLdouble);
 procedure  glTranslatef(x:GLdouble,y:GLdouble,z:GLdouble);
B glRotate能夠使物體旋轉(zhuǎn)一定的角度,它的聲明語法:
 procedure glRotated(angle:GLdobule,x:GLdouble,y:GLdouble,z:GLdouble);
 procedure glRotatef(angle:GLdobule,x:GLdouble,y:GLdouble,z:GLdouble);
 其中angle為旋轉(zhuǎn)角,旋轉(zhuǎn)的中心軸是由(0,0,0)與(x,y,z)兩點(diǎn)的連線.
C glScale能夠?qū)ψ鴺?biāo)系進(jìn)行縮放,它的聲明語法為:
 procedure glScaled(x:GLdouble,y:GLdoble,z:GLdouble);
 procedure glScalef(x:GLdouble,y:GLdoble,z:GLdouble);
x,y,z的值大于1表示放大,小于1表示縮小.

例子原代碼:
unit MainFrm;

interface

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

type
  TfrmMain = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormResize(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    hrc:HGLRC;
    w,h:Integer;
    latitude,longitude:GLfloat;
    radius:GLdouble;
  public
    { Public declarations }
    procedure MyDraw;
    procedure InitializeGL(var width:GLsizei;height:GLsizei);
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
var
  pfd:TPixelFormatDescriptor;
  PixelFormat:Integer;
begin
  ControlStyle:=ControlStyle+[csOpaque];
  FillChar(pfd,sizeof(pfd),0);
  with pfd do
  begin
    nSize:=sizeof(TPixelFormatDescriptor);
    nVersion:=1;
    dwFlags:=PFD_DRAW_TO_WINDOW or
        PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
    iPixelType:=PFD_TYPE_RGBA;
    cColorBits:=24;
    cDepthBits:=32;
    iLayerType:=PFD_MAIN_PLANE;
  end;
  PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
  SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
  hrc:=wglCreateContext(Canvas.Handle);
  w:=ClientRect.Right;
  h:=ClientRect.Bottom;
  InitializeGL(w,h);
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  wglDeleteContext(hrc);
end;

procedure TfrmMain.FormPaint(Sender: TObject);
begin
  wglMakeCurrent(Canvas.Handle,hrc);
  glClearColor(1,1,1,1);
  glColor3f(1,0,0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  MyDraw;
  glFlush;
end;

procedure TfrmMain.MyDraw;
var
  qObj:GLUQuadricObj;
begin
  glPushMatrix;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glColor3f(1,0,0);
  glRotated(0.5,0.0,1.0,0.0);
  glRotated(-latitude,1.0,0.0,0.0);
  glrotated(longitude,0.0,0.0,1.0);
  qObj:=gluNewQuadric;
  gluQuadricDrawStyle(qObj,GLU_LINE);
  gluSphere(qObj,0.5,20,20);
  SwapBuffers(Canvas.Handle);
end;

{procedure TfrmMain.FormResize(Sender: TObject);
var
  nRange:GLfloat;
begin
  nRange:=50.0;
  w:=clientWidth;
  h:=clientHeight;
  if h=0 then
    h:=1;
  glViewPort(0,0,w,h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  if w<=h then
    glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,
      -nRange,nRange)
  else
    glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
      -nRange,nRange);
  glMatrixMode(GL_MODELVIEW);
  glLoadidentity;
  repaint;
end;
}
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=VK_ESCAPE then
    Close;
  if Key=VK_UP then
    glRotatef(-5,1.0,0.0,0.0);
  if Key=VK_DOWN then
    glRotatef(5,1.0,0.0,0.0);
  if Key=VK_LEFT then
    glRotatef(-5,0.0,1.0,0.0);
  if Key=VK_RIGHT then
    glRotatef(5.0,0.0,1.0,0.0);
  repaint;
end;

procedure TfrmMain.FormResize(Sender: TObject);
begin
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
  glViewPort(0,0,clientWidth,clientHeight);
  repaint;
  invalidate;
end;

procedure TfrmMain.InitializeGL(var width: GLsizei; height: GLsizei);
var
  maxObjectSize,aspect:GLfloat;
  near_plane:GLdouble;
begin
  glClearindex(0);
  glClearDepth(1.0);
  glEnable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  aspect:=1.0;
  gluPerspective(45.0,aspect,3.0,7.0);
  glmatrixMode(GL_MODELVIEW);
  near_plane:=0.3;
  maxObjectSize:=0.3;
  radius:=near_plane+maxObjectSize/2.0;
  latitude:=0.3;
  longitude:=0.6;
end;

procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
  timer1.Enabled:=false;
  MyDraw;
  Yield;
  Timer1.Enabled:=true;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  timer1.Enabled:=false;
  if hrc<>null then
    wglDeleteContext(hrc);
end;

end.

七、OPENGL的光照與紋理
 都是增強(qiáng)三維立體效果和色彩效果的手段,光照能夠增加圖形的亮度和三維效果,紋理能夠使用圖形更加趨近現(xiàn)實(shí)。通過使用光照,可以將物體的外觀很強(qiáng)列的表現(xiàn)出來,紋理則可以使物體顯示多種多樣的外觀。
1 光照和光源過程及應(yīng)用
A glIndex過程能夠使顏色索引表中的某一種顏色成為當(dāng)前顏色。
 procedure glIndexd(c:GLdouble);
 procedure glIndexf(c:GLdouble);
 procedure glIndexi(c:GLdouble);
 procedure glIndexs(c:GLdouble);
 參數(shù)C為索引值,如果使用glIndex過程,則TPiexlFormatDescriptor結(jié)構(gòu)中的iPixelType成員設(shè)置為PFD_TYPE_COLORINDEX。
B glShadeModel過程
 glShadeModel過程設(shè)置填充模式,取值:GL_SMOOTH.
 procedure  glShadeModel(mode:GLenum);
 注:以上兩個(gè)過程只能在glBegin.....glEnd之外使用。
C glLight過程定義光源
 procedure glLightf(light:GLenum,pname:GLenum,param:GLfloat);
 procedure glLighti(light:GLenum,pname:GLenum,param:GLfloat);
 參數(shù)light定義光源,其值可?。篏L_LIGHT0.....GL_LIGHTN,N值小于GL_MAX_LIGHT.
 參數(shù)pname指定光源參數(shù):
GL_AMBIENT 環(huán)境光的分量強(qiáng)度
GL_DIFFUSE 散射光的分量強(qiáng)度
GL_SPECULAR 反射光的分量強(qiáng)度
GL_POSITION 光源位置
GL_SPOT_DIRECTION 光源的聚光方向
GL_SPOT_EXPONENT 光源的聚光指數(shù)
GL_SPOT_CUTOFF 光源的聚光方向
GL_CONSTANT_ATTENUATION 光常數(shù)衰退因子
GL_LINEAR_ATTENUATION 光二次衰減因子
 啟用和關(guān)閉光源使用glEnable()與glDisable()過程
 glEnable(GL_LIGHTING);  //啟用光源
 glDisable(GL_LIGHTING); //關(guān)閉光源
 glEnable(GL_LIGHT0);       //啟用第0個(gè)光源
 glDisable(GL_LIGHT0);      //關(guān)閉第0個(gè)光源
 設(shè)置光源的實(shí)例:
 var
  sdirection:Array[1..4] of GLfloat:={0.0,1.0,0.0,0.0};
  glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,60);
  glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,sdirection);
2 材質(zhì)和光照模型
A glMaterial過程設(shè)置材質(zhì)參數(shù)
 procedure  glMaterialf(face:GLenum,pname :GLenum,param:GLfloat);
 procedure  glMateriali(face:GLenum,pname :GLenum,param:GLfloat);
 procedure  glMaterialfv(face:GLenum,pname :GLenum,param:GLfloat);
 procedure  glMaterialiv(face:GLenum,pname :GLenum,param:GLfloat);
 參數(shù)face指定物體表面,它的取值:GL_FRONT,GL_BACK,GL_FRONT_BACK.
 pname,param本資料沒作介紹.
B glLightModel過程
 procedure glLightModelf(pname:GLenum,param:GLfloat);
 參數(shù)pname為光源模型參數(shù),可以取值GL_LIGHT_MODEL_AMBIENT,
 GL_LIGHT_MODEL_LOCAL_VIEWER,GL_LIGHT_MODEL_TWO_SIDE.
實(shí)例代碼:
procedure TfrmMain.SetLighting;
var
  MaterialAmbient:array[1..4] of GLfloat;
  MaterialDiffuse:Array[1..4] of GLfloat;
  MaterialSpecular:Array[1..4] of GLfloat;
  AmbientLightPosition:Array[1..4] of GLfloat;
  LightAmbient:Array[1..4] of GLfloat;
  MaterialShininess:GLfloat;
begin
  MaterialAmbient[1]:=0.5;
  MaterialAmbient[2]:=0.8;
  MaterialAmbient[1]:=0.2;
  MaterialAmbient[1]:=1.0;

  MaterialDiffuse[1]:=0.4;
  MaterialDiffuse[2]:=0.8;
  MaterialDiffuse[3]:=0.1;
  MaterialDiffuse[4]:=1.0;

  MaterialSpecular[1]:=1.0;
  MaterialSpecular[2]:=0.5;
  MaterialSpecular[3]:=0.1;
  MaterialSpecular[4]:=1.0;

  materialShininess:=50.0;

  AmbientLightPosition[1]:=0.5;
  AmbientLightPosition[2]:=1.0;
  AmbientLightPosition[3]:=1.0;
  AmbientLightPosition[4]:=0.0;

  LightAmbient[1]:=0.5;
  LightAmbient[2]:=0.2;
  LightAmbient[3]:=0.8;
  LightAmbient[4]:=1.0;

  glMaterialfv(GL_FRONT,GL_AMBIENT,@MaterialAmbient);
  glMaterialfv(GL_FRONT,GL_DIFFUSE,@MaterialDiffuse);
  glMaterialfv(GL_FRONT,GL_SPECULAR,@MaterialSpecular);
  glMaterialfv(GL_FRONT,GL_SHININESS,@MaterialShininess);

  glLightfv(GL_LIGHT0,GL_POSITION,@AmbientLightPosition);
  glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@LightAmbient);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  GLShadeModel(GL_SMOOTH);
end;
3 紋理的應(yīng)用
A glTexImage1D定義一維紋理映射.
 procedure glTexImage1D(target:GLenum,level:GLint,components:GLint,width:GLsizei,
  border:GLint,format:GLenum,type:GLenum,pixels:GLvoid);
 參數(shù)targer值為GL_TEXTURE_1D,定義為紋理映射,level為多級(jí)分辨率的紋理圖像的等級(jí),width為紋理寬,值為2n,n取值為32,64,129等.border為紋理的邊界,其值為0或1,Pixel為紋理在內(nèi)存中的位置.Component指定RGBA的混合和調(diào)整: 
1 選擇B成分
2 選擇B,A成分
3 選擇R,G,B成分
4 選擇R,G,B,A成分
B glTexImage2D定義二維紋理映射
 procedure glTexImage2D(target:GLenum,level:GLint,components:GLint,width:GLsizei,
  border:GLint,format:GLenum,type:GLenum,pixels:GLvoid);
若參數(shù)target為GL_TEXTURE_2D,意義為二維紋理映射,height為紋理的高,函數(shù)中的其它參數(shù)與glTexImage1D相同.component參數(shù)取值同上.
實(shí)例代碼:
procedure TfrmMain.SetTextures;
var
  bits:Array[1..64,1..64,1..64] of GLubyte;
  bmp:TBitmap;
  i,j:Integer;
begin
  bmp:=TBitmap.Create;
  bmp.LoadFromFile('d:/dsoft/1119/01/logon.bmp');
  for i:=1 to 64 do
    for j:=1 to 64 do
    begin
      bits[i,j,1]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
      bits[i,j,2]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
      bits[i,j,3]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
      bits[i,j,4]:=255;
    end;
  {0代表為單色著色水平,GL_RGBA表示混合值
   64X64代表紋理的高和寬,0表示無邊界,
   GL_RGBA代表紋理類型,GL_UNSIGNED_TYPE代表數(shù)據(jù)類型,@代對(duì)象地址}
  glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,64,0,GL_RGBA,
    GL_UNSIGNED_BYTE,@bits);
  glEnable(GL_TEXTURE_2D);
end;
C glTexParameter過程設(shè)置紋理參數(shù)
 procedure glTexParameterf(target:GLenum,pname:GLenum,param:GLfloat);
 procedure glTexParameteri(target:GLenum,pname:GLenum,param:GLfloat);
 參數(shù)target代表GL_TEXTURE_1D或GL_TEXTURE_2D,param為紋理值.
D glTexEnv函數(shù)設(shè)置紋理的環(huán)境參數(shù)
 function glTexEnvf(target:GLenum,pname:GLenum,param:GLfloat);
 function glTexEnvi(target:GLenum,pname:GLenum,param:GLfloat);
 參數(shù)target為GL_TEXTURE_ENV,
參數(shù)pname為紋理參數(shù)值,取值為GL_TEXTURE_ENV_MODE
參數(shù)param為環(huán)境值,取值為GL_MODULATE,GL_DECAL和GL_BLEND.
本程序示例代碼:
unit MainFrm;

interface

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

type
  TfrmMain = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormResize(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    hrc:HGLRC;
    w,h:Integer;
    latitude,longitude:GLfloat;
    radius:GLdouble;
  public
    { Public declarations }
    procedure SetLighting;
    procedure SetTextures;
    procedure MyDraw;
    procedure InitializeGL(var width:GLsizei;height:GLsizei);
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
var
  pfd:TPixelFormatDescriptor;
  PixelFormat:Integer;
begin
  ControlStyle:=ControlStyle+[csOpaque];
  FillChar(pfd,sizeof(pfd),0);
  with pfd do
  begin
    nSize:=sizeof(TPixelFormatDescriptor);
    nVersion:=1;
    dwFlags:=PFD_DRAW_TO_WINDOW or
        PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
    iPixelType:=PFD_TYPE_RGBA;
    cColorBits:=24;
    cDepthBits:=32;
    iLayerType:=PFD_MAIN_PLANE;
  end;
  PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
  SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
  hrc:=wglCreateContext(Canvas.Handle);
  w:=ClientRect.Right;
  h:=ClientRect.Bottom;
  InitializeGL(w,h);
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  wglDeleteContext(hrc);
end;

procedure TfrmMain.FormPaint(Sender: TObject);
begin
  wglMakeCurrent(Canvas.Handle,hrc);
  glClearColor(1,1,1,1);
  glColor3f(1,0,0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  SetTextures;
  MyDraw;
  SetLighting;
  glFlush;
end;

procedure TfrmMain.MyDraw;
var
  qObj:GLUQuadricObj;
begin
  glPushMatrix;
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glColor3f(1,0,0);
  glRotated(0.5,0.0,1.0,0.0);
  glRotated(-latitude,1.0,0.0,0.0);
  glrotated(longitude,0.0,0.0,1.0);
  qObj:=gluNewQuadric;
  gluQuadricDrawStyle(qObj,GLU_LINE);
  gluSphere(qObj,0.5,20,20);
  SwapBuffers(Canvas.Handle);
  SetLighting;
  SetTextures;
end;

{procedure TfrmMain.FormResize(Sender: TObject);
var
  nRange:GLfloat;
begin
  nRange:=50.0;
  w:=clientWidth;
  h:=clientHeight;
  if h=0 then
    h:=1;
  glViewPort(0,0,w,h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  if w<=h then
    glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,
      -nRange,nRange)
  else
    glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
      -nRange,nRange);
  glMatrixMode(GL_MODELVIEW);
  glLoadidentity;
  repaint;
end;
}
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=VK_ESCAPE then
    Close;
  if Key=VK_UP then
    glRotatef(-5,1.0,0.0,0.0);
  if Key=VK_DOWN then
    glRotatef(5,1.0,0.0,0.0);
  if Key=VK_LEFT then
    glRotatef(-5,0.0,1.0,0.0);
  if Key=VK_RIGHT then
    glRotatef(5.0,0.0,1.0,0.0);
  repaint;
end;

procedure TfrmMain.FormResize(Sender: TObject);
begin
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
  glViewPort(0,0,clientWidth,clientHeight);
  repaint;
  invalidate;
end;

procedure TfrmMain.InitializeGL(var width: GLsizei; height: GLsizei);
var
  maxObjectSize,aspect:GLfloat;
  near_plane:GLdouble;
begin
  glClearindex(0);
  glClearDepth(1.0);
  glEnable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  aspect:=1.0;
  gluPerspective(45.0,aspect,3.0,7.0);
  glmatrixMode(GL_MODELVIEW);
  near_plane:=0.3;
  maxObjectSize:=0.3;
  radius:=near_plane+maxObjectSize/2.0;
  latitude:=0.3;
  longitude:=0.6;
end;

procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
  timer1.Enabled:=false;
  MyDraw;
  Yield;
  Timer1.Enabled:=true;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  timer1.Enabled:=false;
  if hrc<>null then
    wglDeleteContext(hrc);
end;

procedure TfrmMain.SetLighting;
var
  MaterialAmbient:array[1..4] of GLfloat;
  MaterialDiffuse:Array[1..4] of GLfloat;
  MaterialSpecular:Array[1..4] of GLfloat;
  AmbientLightPosition:Array[1..4] of GLfloat;
  LightAmbient:Array[1..4] of GLfloat;
  MaterialShininess:GLfloat;
begin
  MaterialAmbient[1]:=0.5;
  MaterialAmbient[2]:=0.8;
  MaterialAmbient[1]:=0.2;
  MaterialAmbient[1]:=1.0;

  MaterialDiffuse[1]:=0.4;
  MaterialDiffuse[2]:=0.8;
  MaterialDiffuse[3]:=0.1;
  MaterialDiffuse[4]:=1.0;

  MaterialSpecular[1]:=1.0;
  MaterialSpecular[2]:=0.5;
  MaterialSpecular[3]:=0.1;
  MaterialSpecular[4]:=1.0;

  materialShininess:=50.0;

  AmbientLightPosition[1]:=0.5;
  AmbientLightPosition[2]:=1.0;
  AmbientLightPosition[3]:=1.0;
  AmbientLightPosition[4]:=0.0;

  LightAmbient[1]:=0.5;
  LightAmbient[2]:=0.2;
  LightAmbient[3]:=0.8;
  LightAmbient[4]:=1.0;

  glMaterialfv(GL_FRONT,GL_AMBIENT,@MaterialAmbient);
  glMaterialfv(GL_FRONT,GL_DIFFUSE,@MaterialDiffuse);
  glMaterialfv(GL_FRONT,GL_SPECULAR,@MaterialSpecular);
  glMaterialfv(GL_FRONT,GL_SHININESS,@MaterialShininess);

  glLightfv(GL_LIGHT0,GL_POSITION,@AmbientLightPosition);
  glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@LightAmbient);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  GLShadeModel(GL_SMOOTH);
end;

procedure TfrmMain.SetTextures;
var
  bits:Array[1..64,1..64,1..64] of GLubyte;
  bmp:TBitmap;
  i,j:Integer;
begin
  bmp:=TBitmap.Create;
  bmp.LoadFromFile('d:/dsoft/1119/02/logon.bmp');
  for i:=1 to 64 do
    for j:=1 to 64 do
    begin
      bits[i,j,1]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
      bits[i,j,2]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
      bits[i,j,3]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
      bits[i,j,4]:=255;
    end;
  glPixelStorei(GL_UNPACK_ALIGNMENT,4);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  {0代表為單色著色水平,GL_RGBA表示混合值
   64X64代表紋理的高和寬,0表示無邊界,
   GL_RGBA代表紋理類型,GL_UNSIGNED_TYPE代表數(shù)據(jù)類型,@代對(duì)象地址}
  glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,64,0,GL_RGBA,
    GL_UNSIGNED_BYTE,@bits);
  glEnable(GL_TEXTURE_2D);
  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
end;

end.


上一篇:DELPHI的奇異菜單的編寫

下一篇:DELPHI的通配符比較

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

国产中文字幕视频在线观看| 亚洲欧美国内爽妇网| 美女在线免费视频| 久久国产精品国语对白| 亚洲一区二区三区四区中文字幕| 久久亚洲欧洲| 91牛牛免费视频| 久久精品久久久精品美女| 51精品久久久久久久蜜臀| 少妇在线看www| 中文字幕免费在线看| 国产欧美精品| 色哟哟欧美精品| 日本少妇xxxx软件| av动漫精品一区二区| 国产成人在线免费视频| 欧美国产日韩一区| 日本高清+成人网在线观看| 午夜小视频在线播放| jvid福利在线一区二区| blackedav金发美女大战黑人| 欧美亚洲免费电影| 激情欧美一区二区三区在线观看| 人人干人人视频| 在线观看国产一级片| 欧美jizzhd欧美| 欧洲精品久久久久毛片完整版| 欧美亚一区二区| 亚洲欧美日韩动漫| 一级黄色录像免费看| 精品人妻一区二区三区免费| 欧美色视频日本高清在线观看| 性欧美激情精品| 欧美爱爱免费视频| 日韩一区二区三区在线看| 91在线资源| 五月香视频在线观看| 成人网18免费软件大全| 亚洲v日本v欧美v久久精品| 久久久三级国产网站| 日韩精品1区2区3区| 国产精品美女网站| 日韩av.com| 性欧美18—19sex性高清| 丁香花高清电影在线观看完整版| 操她视频在线观看| 国产欧美1区2区3区| ckplayer中文字幕| 国产丝袜一区视频在线观看| 国产精品美女久久| 青青九九免费视频在线| 手机在线免费看毛片| 97超级在线观看免费高清完整版电视剧| 国产丝袜一区视频在线观看| 精品72久久久久中文字幕| 日本24小时在线高清视频| 国内毛片毛片毛片毛片毛片| 亚洲777理论| 精品电影在线| 男人添女人下部高潮视频在观看| 国产精品天美传媒入口| 日韩大片免费在线观看| 自拍偷拍第八页| 国产网站麻豆精品视频| 一级欧美视频| 超碰在线免费看| 激情五月综合色婷婷一区二区| 欧美xxxxxxxx| 国产一二三四区在线观看| 人妻少妇精品视频一区二区三区| √最新版天堂资源网在线| 国产精品x8x8一区二区| 三级a在线观看| 91超薄肉色丝袜交足高跟凉鞋| 日韩中文字幕在线视频观看| av电影网站在线观看| aaa在线观看| 久久亚洲精品中文字幕蜜潮电影| 狠狠色综合网站久久久久久久| 狠狠躁狠狠躁视频专区| 精品在线播放| 亚洲精品第一页| 亚洲美女av网站| 看女生喷水的网站在线观看| 国产精品天美传媒| 女人18毛片一区二区三区| 97se综合| 艳妇乳肉豪妇荡乳av无码福利| www.桃色.com| 亚洲精品98久久久久久中文字幕| 91抖音在线观看| 欧美日韩精品一区二区| 青春草在线视频免费观看| 韩国黄色一级大片| 久久免费少妇高潮久久精品99| 夜夜躁狠狠躁日日躁婷婷小说| 在线观看视频一区二区| 色综合亚洲精品激情狠狠| 夜夜骑天天干| 成人高清电影网站| 国产精品一区二区三区成人| 欧美成人毛片| 精品国产乱码久久久久久浪潮| 国产精品久久久久一区二区三区| 久久国产三级| 日韩av免费观影| 懂色av中文一区二区三区天美| 最近2019好看的中文字幕免费| 亚洲精品视频大全| 一本一道久久a久久精品综合| 日韩一本大道| 婷婷综合影院| 亚洲性线免费观看视频成熟| 日本免费一区二区视频| 亚洲视频自拍偷拍| 久久伊人一区二区| 在线观看黄色av网站| 精品无码一区二区三区的天堂| 国产一区视频免费观看| 亚洲欧美一区二区三区国产精品| 欧美亚洲视频一区二区| 国产一区二区三区免费在线观看| 欧美日韩国产一区二区三区不卡| 日韩美香港a一级毛片| 在线观看日韩| 欧美日韩亚洲一区三区| 岛国毛片在线观看| 国产精品久久久久久久久久久久午夜片| 国产一区二区在线视频你懂的| 欧洲成人一区二区三区| 亚洲中文字幕在线观看| 国产精九九网站漫画| 天天舔夜夜操| 免费在线播放第一区高清av| 国产欧美日本一区视频| 综合久久一区| 亚洲精品乱码久久久久久| 亚洲色图另类小说| 国产精品伦一区二区三区视频| 亚洲毛片亚洲毛片亚洲毛片| 日韩h在线观看| 国产精品久久久久久超碰| 亚洲国产精品va在线看黑人| h片在线观看视频免费免费| 国产精品theporn动漫| 在线观看欧美黄色| 午夜免费播放观看在线视频| 911国产网站尤物在线观看| 欧美少妇一区二区| 欧美乱妇一区二区三区不卡视频| 在线欧美日韩| 日本高清成人vr专区| 少妇视频在线观看| 69中国xxxxxxxxx69| 在线免费观看一区二区| 天堂av中文在线观看| 91麻豆蜜桃| 风间由美一区二区三区| 一区二区三区视频免费视频观看网站| 中文字幕精品视频在线观看| 国产日韩欧美精品| 欧美 日韩 国产 在线| 久久久久国产精品一区三寸| 欧美日韩dvd在线观看| a资源在线观看| 亚洲精品国偷拍自产在线观看蜜桃| 国产成人精品久久二区二区| 糖心vlog精品一区二区| 久久99精品久久| 久久久久久一区| 亚洲成人偷拍| 久久毛片亚洲| 国内成+人亚洲+欧美+综合在线| 亚洲三区在线观看| 亚洲理论中文字幕| 91视频国产观看| 波多野结衣在线一区| 亚洲桃色综合影院| 日韩精品第一页| 国产乱码午夜在线视频| 久久免费视频99| 天堂网www中文在线| 亚洲视频一区| 成人做爰69片免费看网站| 91久久精品一区二区三区| 国产亚洲精品aa午夜观看| 色av一区二区| 久久在线中文字幕| 中文在线第一页| 国产高清视频色在线www| 黄色成人精品网站| 男人的天堂影院| 操bbb操bbb| 国产精品久久久久久久牛牛| 亚洲一区日韩精品中文字幕| 黄色av网站在线| free性欧美16hd| 日本中文字幕观看| 国产黄a三级三级三级av在线看| 欧美大交乱xxxx| 精品福利在线| 一级毛片免费看| 欧美日韩在线免费观看| 久久久久一本一区二区青青蜜月| 亚洲成人先锋电影| 91麻豆精品国产91久久久平台| 精品色蜜蜜精品视频在线观看| 91精品国产91久久久久久最新| 精品一区二区中文字幕| 亚洲一区二区三区四区五区午夜| 在线免费观看高清视频| 成人免费毛片网| 国产精品美乳一区二区免费| 欧美一级欧美三级| 伊人久久免费视频| 欧美成人女星排行榜| 午夜探花在线观看| 性の欲びの女javhd| 蜜桃视频在线观看免费视频| 黄色aaa大片| 99久热re在线精品视频| 成人av电影在线网| 国产毛片一区二区三区| **精品中文字幕一区二区三区| 久久久精品国产sm调教网站| 91精品啪在线观看国产手机| 黄色一区二区三区四区| 免费在线观看av网站| 全彩无遮挡全彩口工漫画h#| 欧美黑人xx片| 91高跟黑色丝袜呻吟在线观看| 国产黄色高清视频| avav在线看| 亚洲在线视频观看| 欧美黑人xxxxx| 日韩专区视频| 欧美另类精品xxxx孕妇| 国产精品色一区二区三区| 天天操天天干天天做| 性感美女激情视频在线观看| 久久精品无码一区二区三区毛片| 国产三级电影在线观看| 97在线观看免费| 久草视频一区二区| 中文字幕在线观看一区二区| 一级免费视频| 樱花草www在线观看| 黑人巨大精品欧美一区二区桃花岛| 欧美一区国产一区| 波多野结衣中文字幕在线播放| 亚洲制服一区| 色综合久久天天| 青青草视频国产| 国产无遮挡裸体免费久久| 26uuu色噜噜精品一区| 依依综合在线| 日韩精品一区二区亚洲av观看| 91香蕉视频网| 男男视频亚洲欧美| 免费观看欧美成人禁片| 欧美午夜激情影院| 九九热播视频在线精品6| 亚洲精品色婷婷福利天堂| 久久综合色婷婷| 国产小视频在线观看免费| 91九色综合| 中文字幕亚洲欧美| 欧美一级大片在线观看| 蜜桃精品视频在线| 国产精品久久久久毛片大屁完整版| 中文字幕精品视频| 美洲天堂一区二卡三卡四卡视频| 91传媒理伦片在线观看| aaa国产精品| 激情伊人五月天久久综合| 欧美性高潮床叫视频| 国产精品国产三级国产aⅴ原创| 国产高清不卡无码视频| 中文字幕免费在线观看| 日日噜噜噜夜夜爽亚洲精品| 一本加勒比hezyo黑人| 国产亚洲精品久久久久久无几年桃| 欧美亚洲精品一区二区| 免费看h片网站| 视频在线91| 91超碰rencao97精品| 久草免费在线视频观看| 亚洲激情网站免费观看| 国产吞精囗交久久久| 国产人妻精品一区二区三区不卡| 在线免费看av网站| jizzjizz日本少妇| 亚洲色图久久久| 国产欧美精品日韩区二区麻豆天美| 欧美日韩一区二区电影| 国产成人免费电影| 欧美日韩成人一区二区| 蜜臀av一级做a爰片久久| 任我爽在线视频精品一| 国产日韩欧美在线播放不卡| 国产亚洲视频在线| 欧美日韩五区| 精品蜜桃传媒| 精品国产欧美日韩不卡在线观看| 国产三级在线免费观看| 欧美激情午夜| japansex久久高清精品| 国产91精品欧美| 欧美一区二区三区成人| 国产又爽又黄的视频| 女同性恋一区二区| 99久久综合精品| 天堂а在线中文在线无限看推荐| 自拍小视频在线观看| 成人精品一区二区三区电影免费| 自拍偷拍视频亚洲| 国产精品久久久久久久久免费樱桃| 一本到高清视频免费精品| 蜜桃久久精品成人无码av| 人妻精品一区一区三区蜜桃91| 伊人伊人av电影| 一本加勒比hezyo黑人| 精品久久久久久中文字幕人妻最新| 色欧美自拍视频| 国产精美视频| 噜噜噜在线观看免费视频日韩| 一级片手机在线观看| 超碰在线观看99|