数学建模社区-数学中国

标题: 给出我目前所使用的OpenGL测试框架代码(2D) [打印本页]

作者: xShandow    时间: 2004-11-19 11:10
标题: 给出我目前所使用的OpenGL测试框架代码(2D)
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.
0 `7 T! @1 u7 H7 [9 m, s7 j8 |* u
这是文件下载地址.7 t/ Z+ ^0 Z4 P( M5 @. o  e$ G4 {
[attach]756[/attach]</P>
: a- u% `9 `7 y0 D8 C& ~<>. O  @" F: Y7 a- J! \3 R( L
#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,
6 N4 ~8 [3 A" b, K#include &lt;gl/gl.h&gt;5 k/ ?* P& y& X$ `( H' Z* o3 i4 m. s4 i
#include &lt;math.h&gt;</P>$ c: L& l/ i: s9 Z+ B/ t/ N
<>#pragma comment(lib,"OpenGL32.lib")</P>
  ~; D5 X1 \+ w3 d8 T) C) i4 j6 u+ B<>HGLRC hRC;
- |2 H5 o8 d, w" i9 w% e; YHDC   hDC;</P>1 `6 c4 u$ k. S; q
<>//回调函数3 P0 w8 M( M' E4 j0 j4 u
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>
$ P0 r! f7 b2 L& A  n$ U<>//设置视见区大小
, O7 R, q: U  q3 {. R5 d: [; `void SceneResizeViewport(GLsizei w,GLsizei h)
& b5 U* Y: D8 m9 V{; R* R! N! [& u
if(h==0)
! r2 y0 S+ i* U" G  h=1;, w7 u+ D2 l9 ^# P
//设置视见区
! e5 J& \  g, {) W% e& p+ EglViewport(0,0,w,h);</P>2 K0 Z: o2 ]4 T* ~, n7 ~
<>//重置投影矩阵
1 D; h* Y3 x0 a& g! v, j+ b7 K( jglMatrixMode(GL_PROJECTION);
$ h$ X  z" [* @8 m7 r2 a  }2 k7 IglLoadIdentity();</P>
8 g( _" A3 b2 E# [9 l<>//设置修剪范围
% O8 K$ J) F4 n7 v" a! mglOrtho(0,w,h,0,0,1);' x; l, S& I- j9 o$ [- O3 F
//重置模形矩阵" f& J* G6 {- U5 m! n) T+ V
glMatrixMode(GL_MODELVIEW);2 ^. r' O* T0 v. C1 p6 T
glLoadIdentity();
! k" d3 O8 {6 c1 z% Z6 {5 S3 e( l( X% Q}</P>0 g  n1 ^- j, f/ @! Q$ m
<>//把绘制信息全放到一个函数里进行. ^6 W2 _; O5 L. U0 {, O8 _/ g
//#define GL_PI 3.1415f
2 ]/ j) ]1 l" ~4 E* {void Draw()
: p0 K4 t/ Z! L% f2 T1 S5 |{0 m& z4 U4 q/ Z% u1 v  L3 z7 C5 s$ s
glPushMatrix();</P>
6 ~3 f8 H6 i( u) q  @* q<>  glBegin(GL_TRIANGLES);0 w1 S- i8 N  W  Z
  glVertex2f(25.0f,0.0f);  n0 K& m: R3 B: d+ c9 U% t
  glVertex2f(0.0f,25.0f);& c  ^; T& \" }; u5 a/ L0 Q
  glVertex2f(50.0f,25.0f);! M0 Y- t  V6 b/ x- r: ^
    glEnd();</P># a$ c5 }# p; R5 {
<>
, h: s0 \& q9 X( Y9 n+ c  F& A" ]glPopMatrix();( ^& e& {& L0 z
}</P>
0 u  y  v* F/ o- H9 C<>//在这里进行渲染
3 Z) ?3 q, \: Z  H* Q% [void SceneShow()
( ]  u2 y! w3 f+ t- M; h{) h; ~* ^8 u* |) ^
//清除缓冲区及深度缓冲区3 _" u1 S. j5 n. M
glClear(GL_COLOR_BUFFER_BIT );8 C7 E! ]0 ]8 A! J0 c
//重置所有的矩阵0 v, U- L  Q7 M0 [5 R8 l
glLoadIdentity();" D5 V, R# Q3 B4 n& f
//以下绘制开始: q, i0 i" }: ~# w* p
Draw();</P># Q& P4 V! j0 F8 \* O2 s& l
<>//交换缓冲区,显示
8 c+ G" `: h7 H7 s  G' xSwapBuffers(hDC);
+ Y3 |7 O/ P0 s4 `, ]5 R* c! u9 g& A}</P>9 X0 |" N9 s4 M+ P& g
<>//初始化OpenGL
. }# O) [: r, b6 f6 ], x: Jvoid InitOpenGL(HWND hWnd)3 K- A7 q; K) l# a
{
' k) ]. k* B, l' b0 ^. ^. }6 A6 {PIXELFORMATDESCRIPTOR pfd;( p; ]8 W2 V0 U7 f6 n
int iFormat;</P>1 v$ p4 _+ g7 }+ A. F# d0 D2 d
<>//从窗口句柄取得设备句柄
. _6 x! z8 v# V( Q5 VhDC=GetDC(hWnd);</P>
9 P4 s8 K3 ]+ ]5 j2 X<>//以下设置像素格式3 `6 B. F1 @8 O4 T0 L
ZeroMemory(&amp;pfd,sizeof(pfd));
+ c( c4 N  m1 X' x' N. o$ Upfd.nSize  = sizeof(pfd);8 H# k/ G3 Q! p
pfd.nVersion = 1;0 N( i6 s7 b" l# h7 E/ z
pfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;6 _7 p( E: ?# h, y* |
pfd.iPixelType = PFD_TYPE_RGBA;
& r- \& r0 o# W4 I. s( m! y/ E$ Xpfd.cColorBits = 16;
4 X9 _& m1 G; ?9 i" \3 `pfd.cDepthBits = 16;
  V  H5 }; F, a7 h" C* s2 z. w$ {4 ?pfd.iLayerType = PFD_MAIN_PLANE;</P>& @+ L: |2 T( i8 V
<>//设置像素格式
5 J0 P. q& T$ o' k5 Q: R$ e5 n& giFormat=ChoosePixelFormat(hDC,&amp;pfd);6 X+ J" ~8 G  G: T1 n! r: f/ {
SetPixelFormat(hDC,iFormat,&amp;pfd);# ^6 |) J# E% P' B. A
//创建渲染场景! w7 H. z$ |3 o9 y  I  T; D
hRC=wglCreateContext(hDC);( n# C  a' r# i+ R
//设置为当前渲染场景( U& y" T7 U/ C& L
wglMakeCurrent(hDC,hRC);</P>
' B6 }+ C* z& Y& N+ r0 m, p( H3 i<>glShadeModel(GL_SMOOTH);    //允许平滑着色
1 N4 D6 \+ L% EglClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>
2 u0 ~2 h, ^- D! Y5 E; W' U<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的" e0 ]+ y. w& S+ q9 V7 r# N
RECT rect;
8 ]) G5 r1 [8 E. B7 tint sw,sh;</P>
: H* N7 N$ ]) r# G% \5 d% `7 o! ^<>GetClientRect(hWnd,&amp;rect);
+ N( W" F0 `9 ~; Vsw=rect.right-rect.left;2 \6 H% j# s) ^
sh=rect.bottom-rect.top;</P>, f1 ?/ b9 o0 `/ o! K
<>if(sw &gt; 0 &amp;&amp; sh &gt;0 )# |" o0 _# p  @
{, Y3 y% W4 H0 X" ?
  SceneResizeViewport(sw,sh);
6 O- r6 ?' z, f}& C6 q% _7 p3 B5 t! l# a1 b) |

8 l. c+ H- M' ]6 t}</P>
% l$ F7 N! |0 c$ D; i<>//释放OpenGL和窗体对象& r" j0 {( D0 F! e) H- p; v
void ReleaseOpenGL(HWND hWnd)
! t7 f" f# ~6 F2 _{
0 l' S/ v4 L) C5 s; vwglMakeCurrent(NULL,NULL);
# \9 I% t8 g6 S6 PwglDeleteContext(hRC);
6 k$ O7 ?) D0 a3 G* G% i. nReleaseDC(hWnd,hDC);* p" P/ ]0 t& v
}</P>
  P! v! l" W- ~3 N  m- K<>//更改分辩率
8 T& R9 E, O) C5 pbool ChangeResolution(int w,int h,int bitdepth,int fre)
% e* _% T4 a) }' N# W{
8 U/ T& U6 ?$ _DEVMODE devMode;
9 X  K: r2 c  ~. u4 X- ^int modeSwitch;/ T0 o0 R/ }6 y* t# O* E+ d8 O
int closeMode=0;</P>
4 l; b* D6 w1 S5 U<>//枚举
) z$ j" ?6 v. g# T: r' LEnumDisplaySettings(NULL,closeMode,&amp;devMode);</P>
; u  d* l' W& s& G/ B# Q<>//设置为当前所请求的
- y% H  z& x, U% y' h, ZdevMode.dmBitsPerPel=bitdepth;4 g8 b6 ^& ?7 H- v. c$ n
devMode.dmPelsHeight=h;
& h# L! Y3 q. udevMode.dmPelsWidth =w;! o# R0 r4 C, v4 S
devMode.dmDisplayFrequency=fre;</P>
) R, t* |: y( G2 t' d<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>: v7 x5 n' B  V  h: D& H$ ~, [3 @8 ]
<>//更改9 `. y* U  `) j& d. A
modeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>; a5 S/ N9 A6 [1 A! @
<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL)/ p! j5 S$ x( j: Z; G- I+ J! \- ?5 i8 ^
{
/ B% ^9 L7 a' m, ^* X  Y$ F, x) d5 _6 Z  return true;8 k/ ^, ]' O+ P6 a; u; S) C2 [
}7 c% n+ n; }4 X: ~. E
else
* h2 ?, H: C4 G5 u( z# |$ f{0 j# |+ _, T# D/ v4 ]
  return false;4 {0 O9 o! K5 c9 }
}
7 A# t7 I6 V  c}</P>
7 B# Q2 U6 M6 j: ?1 m+ F<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam), \8 O( Z/ j, e' c& H* @+ k
{
- t2 h+ x" D5 R6 j7 j, c; A0 `RECT rect;
' J/ G8 `/ n" O. R2 Tint sw,sh;</P>
- ]9 D0 D( @+ Y0 ~) G# A<>switch(message)
; P9 t$ {) C: I9 h4 @1 O6 X( N{9 Q6 }1 W# v) p
case WM_SIZE:
4 E+ K' a4 x/ c4 V9 S- T  GetClientRect(hWnd,&amp;rect);
( [/ y& s5 d) }& r  W8 @, j  sw=rect.right-rect.left;4 l8 E1 v6 X* {  q4 ]& Y
  sh=rect.bottom-rect.top;</P>' A4 c! o9 ?, J1 ]
<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 )- o# Y7 M, G: f8 G
  {( p5 q+ l! @# E: R
   SceneResizeViewport(sw,sh);6 X1 Q, [: S$ y4 b) u. D5 u8 c
  }* ^' V7 i3 d& S1 v' n7 C4 N
  return 0;</P>
, C* `9 ~. q2 p<P>case WM_CLOSE:8 K7 M( S: B2 V: \
  PostQuitMessage(0);
) v! N2 v: ?5 s  return 0;
: V5 G9 ^' R2 p& \# K; `case WM_KEYDOWN:+ k2 s4 N9 \3 {- h* F1 B
  switch(wParam)4 A! x$ D4 U/ z, `/ r4 n" ~* r/ b
  {. N, F: T5 q* j* w2 _9 m
  case VK_ESCAPE:: ~$ i# J/ h3 {8 `; n. @
   PostMessage(hWnd,WM_CLOSE,0,0);9 x% |+ B+ ]4 }$ o; e
   break;9 }& D. L: |7 m
  }& a3 t" R' `% q( P
  return 0;
9 B9 L- V5 h: V$ v& ~}</P>% Z5 ?  w- T) {/ H* n  O+ n2 z% m
<P>return DefWindowProc(hWnd,message,wParam,lParam);; F! u! z0 {/ n5 Z9 }7 c# v' k7 Z
}</P>
8 a4 _1 k3 Z  z5 n+ N<P>//创建一个窗口供OpenGL使用.
% N2 j* i. V+ _2 n* q//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏- r. u+ E. T& N' @: `+ u. E3 o
HWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)) k, M. t2 L' B3 D8 e/ ^
{9 Y* c# t9 p3 S/ p0 _  b5 q9 D
HWND hWnd;
7 Q5 C" y- Q# b5 d$ ^. O) w8 P) wWNDCLASS wc;</P>
6 \2 Z) t" A9 [<P>wc.style   = CS_OWNDC;0 [  Z& L/ d# J: W( V
wc.lpfnWndProc  = WndProc;
9 k6 J% {1 J2 \wc.cbClsExtra  = 0;4 y$ v7 J3 F- Q% o8 B
wc.cbWndExtra  = 0;* `6 E$ U  f0 V. P% |  d
wc.hInstance  = hInst;* n- L2 N4 ]- D+ S  \1 p; V" C
wc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);
) X  R# c* y6 H* R- gwc.hCursor   = LoadCursor(NULL,IDC_ARROW);, P5 |5 Y( G. h+ t+ Y0 |
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);+ y* O9 P+ W& }9 [6 `0 m
wc.lpszMenuName  = NULL;
  ?8 m* F! M4 f2 @" U4 T  q# i2 Vwc.lpszClassName = "OpenGL框架程序";
/ a7 t1 x7 N; k8 i. }: W
+ q. P) t5 ]8 F- ?) B//注册窗口类
4 S; W# X+ m( D. [# q1 g. QRegisterClass(&amp;wc);</P>
2 j$ V, ^8 P4 ]" q2 i<P>//全屏模式开- _3 Z7 L; v5 F. \) U
if(fullscreen); n. o* Q0 y% C  t0 j
{* V; y( m, V6 ?- w$ g. ^: u1 Q5 k
  //创建窗口
1 V: `. [$ n! n; c0 y2 j; a  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,9 w: d7 l9 W5 t
   0,0,sw,sh,NULL,NULL,hInst,NULL);
' G9 q3 }8 e, W( k  i}
  g4 P, i) ]% w  _2 ?2 Q4 V3 belse
. V# M$ x: x' ]; ^{* E/ W2 O8 P% u4 S. Y  P% B% x
  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标
8 u2 R+ }9 ?" m7 u. \/ _7 }! R  int t,l;5 R# Y! o2 A  ?2 b3 S/ b
  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;; S, d  M- Z* c0 F7 t, `7 g4 v
  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>
: ^* ?! f2 H/ C3 a  m; J* v<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,1 V5 Q! R3 ~" X6 K$ _
   l,t,sw,sh,NULL,NULL,hInst,NULL);
( o3 c: V2 H# F- x1 \3 Q2 Q}</P>
& |+ v0 u9 l. X: h: y2 {/ K<P>//显示窗口
0 e$ r$ Y4 r% K8 ]- B, qShowWindow(hWnd,SW_SHOW);7 P, ~% M# s) n+ ~
//更新9 Q& k4 V  C4 J. o. C! U: w
UpdateWindow(hWnd);</P>
; N) {( k# Y0 X: s0 ?6 F<P>if(fullscreen)
# g) a- Y2 w4 W- M( }{
% ^) @$ y) N; A7 {; a) Y  //更改分辩率* q; @) d' t+ Q/ {- n  c2 ^! d* n) S- ]
  ChangeResolution(sw,sh,bit,60);
+ H! F7 P( q* A5 c& X* d5 _  //隐藏鼠标
6 ]& ?. z8 \6 t( [  ShowCursor(false);
* K& p1 M2 h' m2 z0 \) P}</P># i7 u8 \# X/ u( _" `6 [
<P>//返回窗口句柄
7 {) I0 |2 j9 E( qreturn hWnd;1 y& k; l  ]5 Q* S* {6 t0 K
}</P>* J' F! c  _/ k  w# T( Y& X
<P>//入口函数2 A& r% B6 O& H9 Y$ o$ c
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)6 P6 }* A5 p6 }! L4 l, _) C
{
0 D/ s  h* ~1 R9 T$ L" OMSG msg;0 [4 G# i0 a% B
HWND hWnd;0 t- c& r1 G% p! @' ?: z
bool fullscreen=false;</P>
( n( w" p# Z; e  i4 Y) _' b<P>//创建窗口- `1 Q: z; d2 s7 s4 O
hWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>
5 a: m- V  x4 f; y% x. ^<P>//初始化OpenGL设置& S% ]+ F! v8 N( y. L( y" w
InitOpenGL(hWnd);</P>
. x+ z2 E3 u2 `. q<P>//进入循环
6 e/ E( L; O4 K3 L9 K  xwhile(1)( s& u; s& y) A9 t5 C
{
+ n+ u$ ~7 I; L2 ]4 c+ r4 A' k) l  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))( w! c# N  j/ Z: z; {. ]2 B9 l* J& q
  {: J8 M2 O6 {4 L; l! z0 p
   if(msg.message==WM_QUIT)& n6 d( \4 H1 A% S" d
   {. y) k* @- Q) T( d0 m& Z
    break;
1 [5 T! N  h  I2 t  [   }6 ?" ?% y. l0 A
   else
% d/ G: X. T. B- |: Y   {, D+ L; H0 |" g" ~5 t
    TranslateMessage(&amp;msg);
8 ?: l6 x% i1 H8 M: h0 W    DispatchMessage(&amp;msg);
6 _5 u5 [0 F+ X' d& A5 z: _! p   }. v& y# L5 f. d; f
  }& J. j) b- C. s$ Q$ O
  else& B5 f" B/ o. m% F5 p1 |
  {# e( W0 H! R$ T1 i; e5 b8 d3 v
    SceneShow();
8 T0 J: l7 p! R( O# S8 _5 ]: R. O  }/ W, b% i# P# X' E& L' s* g* W
}</P>
# T& c  O9 ^" O# Z$ Z/ ^<P>ReleaseOpenGL(hWnd);% G8 I* K& d; T8 g
DestroyWindow(hWnd);</P>
$ o. O! Z% E1 a: M& O9 C7 H# I<P>return 0;
! L. B7 g+ P  I& N9 C' u}
" N0 I! Q9 u% K* c- ]. l0 g9 n6 S" B; p
8 ^9 ]0 F3 i! H3 Y: o
</P>2 f: c+ T/ T4 v

4 p+ L; |1 c( e5 S7 r9 C
[此贴子已经被作者于2004-11-19 16:15:39编辑过]

给出我目前所使用的OpenGL测试框架代码(2D).rar

2.48 KB, 下载次数: 0, 下载积分: 体力 -2 点

给出我目前所使用的OpenGL测试框架代码(2D)

给出我目前所使用的OpenGL测试框架代码(2D).rar

2.58 KB, 下载次数: 1, 下载积分: 体力 -2 点

给出我目前所使用的OpenGL测试框架代码(2D)






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5