数学建模社区-数学中国

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

作者: xShandow    时间: 2004-11-19 11:10
标题: 给出我目前所使用的OpenGL测试框架代码(2D)
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.5 T3 v4 _  G0 y, F  a% ]& n; ]
9 F3 n2 N$ _  ~' L! S' a% B
这是文件下载地址.
& z" F2 J1 @2 x% z) W0 ]* z! W[attach]756[/attach]</P>, i7 y( D3 r: `$ m$ h
<>
5 S  o& v1 c' ^, y5 h! b& m, _#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,& N/ ]  e5 Y( {; u0 K2 M8 a: \; S
#include &lt;gl/gl.h&gt;  ^6 Q, k' b1 ^! a# c
#include &lt;math.h&gt;</P>
4 ]+ c( x7 x+ R' b7 N<>#pragma comment(lib,"OpenGL32.lib")</P>1 ^3 H$ B5 k# W1 M: u
<>HGLRC hRC;# d+ X3 q7 ?( p8 n
HDC   hDC;</P>, s8 K. Q+ [5 O4 P, L8 G
<>//回调函数7 T" u) ]+ W4 }- ?7 [
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>" I; D0 n9 c" I( ?' [
<>//设置视见区大小
% C4 h1 O" V. ]7 Z$ b1 E5 k( nvoid SceneResizeViewport(GLsizei w,GLsizei h)9 _+ f0 N' U8 I9 x
{( \6 I* w, \7 v2 ?- `
if(h==0)7 F5 r9 |, @) E8 ?
  h=1;& s( Q% q5 T' B- T9 F( E  R+ h
//设置视见区
% Q4 p% n# e+ x% Y' j" F1 U2 ?glViewport(0,0,w,h);</P>
( o' v% g2 @9 o" G& \<>//重置投影矩阵
0 d( Q) J! f1 a/ t9 @glMatrixMode(GL_PROJECTION);
- M5 c7 ?. |% t2 _: n3 ?glLoadIdentity();</P>8 A( a9 N( @# x! N
<>//设置修剪范围
+ Y8 X( }: L0 ~. ~9 g( O8 HglOrtho(0,w,h,0,0,1);
' O0 q' O4 I) A  G, s( Y. w//重置模形矩阵' s' ]& \) u1 f
glMatrixMode(GL_MODELVIEW);  h! F9 H0 Y4 K1 E, n- I
glLoadIdentity();8 a$ v9 H9 w" e* w
}</P>
! O* N9 [1 U$ m5 S% |4 c$ R# q( d<>//把绘制信息全放到一个函数里进行0 y1 c6 g4 J& B' Q5 S: u4 F
//#define GL_PI 3.1415f) n- c* T$ ^8 |
void Draw()
! C0 p6 [6 `$ ^2 G{
& x* Y- C2 V* e6 m4 I( WglPushMatrix();</P>1 R. R7 B* J9 N' C3 {, _/ L
<>  glBegin(GL_TRIANGLES);4 s8 L7 q# L6 e/ i, W# N5 i
  glVertex2f(25.0f,0.0f);# A0 i6 M9 e' e. L5 U/ E# j
  glVertex2f(0.0f,25.0f);# Z! m" H4 v( r9 x% @  }, x
  glVertex2f(50.0f,25.0f);* J3 @- Y# Q2 z3 l! B6 a2 w; F
    glEnd();</P>0 F" }/ q% g; G, ]; Y
<>
) S4 F0 V: V9 B+ VglPopMatrix();$ b- ?# I( k" m3 R6 s( L
}</P>. T& q; j( s$ ~: |' M
<>//在这里进行渲染
. c" B0 ]3 V6 S; V) xvoid SceneShow()
8 \. Z, ^5 @0 C. c& ?{
5 Q; m5 r2 M$ u% x; G* _: f, `//清除缓冲区及深度缓冲区7 Z3 s3 n# V. m5 E5 u9 \' {8 R
glClear(GL_COLOR_BUFFER_BIT );8 K3 Q( w1 f- Z- G. C
//重置所有的矩阵
/ P+ u- ?4 S$ `3 M, C5 i5 k" P4 lglLoadIdentity();
4 v- e: D+ p5 H5 C8 q/ v$ o//以下绘制开始- [7 g  V0 V1 w$ g
Draw();</P>
' p: u% F% [. `$ j<>//交换缓冲区,显示
( [: ]3 O' [# O1 fSwapBuffers(hDC);- f+ M2 `" Y2 o
}</P>
- i9 z: b$ Z7 ]! v; I! s/ p<>//初始化OpenGL' N$ L( k  D8 ~
void InitOpenGL(HWND hWnd)" h) V/ ]- h5 c
{5 t5 l$ e) ]3 M- o, T6 ]6 J
PIXELFORMATDESCRIPTOR pfd;
6 x8 B/ @9 z3 x9 O" Kint iFormat;</P>
6 T  ]0 [+ {; e' ?2 y5 Y2 B& K0 n<>//从窗口句柄取得设备句柄" q5 S+ F. |) k; Z! t5 _# }
hDC=GetDC(hWnd);</P>
2 b: y( ^' v: ^0 O" D" G<>//以下设置像素格式
- L( P- W5 @. g- Y- C3 oZeroMemory(&amp;pfd,sizeof(pfd));
6 C) W  b6 u# ~8 b5 x4 jpfd.nSize  = sizeof(pfd);
% E/ ~. m4 n  Z( N* o( A1 L* I' kpfd.nVersion = 1;
( O% j5 q" j1 f8 `* E9 V' npfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;( P/ {. r9 \$ J" Q$ H$ J
pfd.iPixelType = PFD_TYPE_RGBA;9 n. x6 k/ W* E$ n( Z* }
pfd.cColorBits = 16;& P- ^4 u) T! _) z; ~( C  Z+ w
pfd.cDepthBits = 16;+ B$ `! h9 S* D+ I0 \6 c8 D( S. F
pfd.iLayerType = PFD_MAIN_PLANE;</P>
3 N5 b. d3 j0 ~<>//设置像素格式  O4 @- D8 a' b) s/ C  y
iFormat=ChoosePixelFormat(hDC,&amp;pfd);
7 [* ^& p- S# c+ Y' \8 k0 [6 R( XSetPixelFormat(hDC,iFormat,&amp;pfd);. K% T. [$ T7 R; w9 e$ ]% b/ b
//创建渲染场景/ m1 N9 D7 T, D" A
hRC=wglCreateContext(hDC);9 h5 A, v& a! E7 a) Z1 Y  B/ c5 f
//设置为当前渲染场景9 s; `: P# Q7 h$ x
wglMakeCurrent(hDC,hRC);</P># G1 A# B# O# {) m! Y
<>glShadeModel(GL_SMOOTH);    //允许平滑着色
/ P' ], y% M, Y% R. A: FglClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>
! H9 M/ w7 g+ u/ {/ ^<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的
3 w8 @; W) j: _" _: SRECT rect;
' p0 r) [" d8 cint sw,sh;</P># h, a, o# r& h
<>GetClientRect(hWnd,&amp;rect);; I( u+ a  R9 d* W$ ]0 S, j
sw=rect.right-rect.left;
' L: S. H* f2 Ssh=rect.bottom-rect.top;</P>. x, S1 W/ x- i; s4 g7 r
<>if(sw &gt; 0 &amp;&amp; sh &gt;0 )  T! m. Q! G4 D0 @) A7 s
{+ I) b% }, |0 U7 }8 F3 Q
  SceneResizeViewport(sw,sh);
- _% _) l  W/ u! a+ g& ~4 E}
3 J' h8 \: p7 C/ E( p# W) P  y! s! c  f' M+ z
}</P>
0 E! u# d- I0 k* I" n; T0 J<>//释放OpenGL和窗体对象6 U3 [( `1 q) W
void ReleaseOpenGL(HWND hWnd)
- J, `% l& s; e' `9 j{/ b( Q1 r+ e+ t4 k1 `; i4 s, X, @' W
wglMakeCurrent(NULL,NULL);
2 p, r6 x% Q( i4 L6 k2 [wglDeleteContext(hRC);7 e8 v# G5 U4 W. I9 X# B
ReleaseDC(hWnd,hDC);8 {! U4 p* K8 j6 C% A) B  M
}</P>( A, y7 M2 K' r
<>//更改分辩率
( V. ^# Y, B6 d, Sbool ChangeResolution(int w,int h,int bitdepth,int fre)
6 \0 i0 R' L& n{
: F# n/ P& W' s0 o0 R6 i! ZDEVMODE devMode;
" D/ ?+ c9 @1 y/ d) e0 gint modeSwitch;- {, z$ v/ H: {' w
int closeMode=0;</P>. ~$ Q2 i! t3 a# @& t4 T
<>//枚举! x0 Y! S+ |8 e# O) ?" x  ~* ~
EnumDisplaySettings(NULL,closeMode,&amp;devMode);</P>) Z# e3 u2 t! Y
<>//设置为当前所请求的) N9 z$ k5 Z6 u$ Q9 r/ _
devMode.dmBitsPerPel=bitdepth;
4 J1 r) j# O0 g0 e0 edevMode.dmPelsHeight=h;
; f$ e& `' R) V1 L+ H2 W9 QdevMode.dmPelsWidth =w;
7 N: R# ~: g) k9 n8 b3 y# WdevMode.dmDisplayFrequency=fre;</P>
; n. L# X/ ]  [& n$ ~8 Y/ M<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>/ K; p3 o, l" H6 t6 ?  y0 I
<>//更改
, }* j" p3 @+ u" U* ?5 p" ^modeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>; }! z* h' @4 a" I  `
<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL)
' K  X: c, Y6 ]4 D7 K; J2 z, u; J{! r* e& F2 b7 a1 c
  return true;* b, c5 `9 E! x' w( o( T, w2 o
}3 Q, I% q4 n4 u8 R# C$ t; @; E
else' X; A3 z' O3 B/ b4 U, V7 A/ L
{; H' j" u, ?; Z) W2 o/ h$ _: D
  return false;! y/ d( V) V. l+ _9 {" U& k
}4 Q6 r! z* N2 E# q! r, I; `. H9 S
}</P>
+ K, p) t2 P; p, _( u% l<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)2 e" }+ a* h" d& ~. Q4 k) q
{
" D0 q. D2 q8 T8 URECT rect;% W" x+ L+ G7 I: t9 n
int sw,sh;</P>( v( r7 ]3 @! B4 [8 I& `/ x, o6 ]
<>switch(message)
& N: \; r# z. u7 a{
( @( @+ O) M1 t, a7 Qcase WM_SIZE:
* P" A; _3 K' @) c; V  GetClientRect(hWnd,&amp;rect);( ~+ c5 F3 o, s2 y1 k' U& l
  sw=rect.right-rect.left;
  l$ ]9 Y: ^' g. ]8 S2 X  sh=rect.bottom-rect.top;</P>
; @: F" r+ q, a3 k% D  Y<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 )1 Z, ^0 k3 C, U# ?6 ?- [
  {
8 \/ j! y+ R* @# S6 r9 ?9 i. g/ {   SceneResizeViewport(sw,sh);* e' @$ G* q$ {5 U2 W- J$ }
  }! H+ I4 e4 e6 z  e
  return 0;</P>, n- Y9 {: C, o2 r5 Z: A0 x( G/ e
<P>case WM_CLOSE:
! q. a$ w" u7 W3 ]: ^% l  PostQuitMessage(0);
8 x& x% T) ]1 D  return 0;
/ s. B0 t& r4 D0 icase WM_KEYDOWN:
& T2 t$ e8 C2 l! s- b  switch(wParam)
5 {( }  ^4 W( [) S! M* `  {
3 k+ C; H2 t2 P' A8 n  case VK_ESCAPE:
+ y  B/ C2 B4 ]* |0 \: e   PostMessage(hWnd,WM_CLOSE,0,0);8 o3 \! J. U. P: y& L9 x, n/ ^
   break;
* S3 r( G% `+ ?" W2 |* i2 Y8 e  }
& N* l' j* [3 x  c% z  M! I  Y  return 0;
$ q4 g2 [* i5 W7 F& f; i" ~}</P>5 y' E- r  z9 n( v
<P>return DefWindowProc(hWnd,message,wParam,lParam);0 F9 ?1 [2 J9 C# ~% o/ }
}</P>
* }: o# m8 @" `* B<P>//创建一个窗口供OpenGL使用.% R# H1 a2 n; K6 b6 s3 S
//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏
7 O  F# {: \$ A3 T% M2 LHWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)
, g5 R( J  m2 I$ Y+ m{2 C' E' N/ v0 p. I# [
HWND hWnd;7 Q8 h  N* E* z9 o
WNDCLASS wc;</P>0 Y0 B- b2 j9 v9 X# B  t
<P>wc.style   = CS_OWNDC;0 b6 d+ `! c; \9 ^$ ~6 E; e
wc.lpfnWndProc  = WndProc;
) L( G# J4 t: y( C  Fwc.cbClsExtra  = 0;
* W9 e6 D1 l6 Wwc.cbWndExtra  = 0;
' |6 u8 e, m  h: F# K' u+ M$ p4 Jwc.hInstance  = hInst;. q. h+ t: j: D. {
wc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);
3 g4 x0 f+ g( M- P" E' k; ]wc.hCursor   = LoadCursor(NULL,IDC_ARROW);
! \* V9 O4 a2 ?wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);) p2 w9 W. A! r3 Q" f; s8 G. q' r2 v$ S
wc.lpszMenuName  = NULL;: r( ?( Z6 l1 F* _
wc.lpszClassName = "OpenGL框架程序";
; E4 v6 \# Y1 g5 J4 m" U6 g- d& Y: y0 Y9 a$ [
//注册窗口类2 A' B( P) `0 }& Y( `4 B0 f( T
RegisterClass(&amp;wc);</P>% S% P: B: d) Y. Y
<P>//全屏模式开
" R" |8 g8 u( Yif(fullscreen)$ v' s; p% T4 v0 g# C% T* K
{
* K( {* D$ W9 o2 g5 ~  //创建窗口
# }8 Z$ |- Y9 g/ k6 d  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,
( ^7 K; O; g$ v' `2 w   0,0,sw,sh,NULL,NULL,hInst,NULL);+ H' O  a- S% Z) N0 i$ D; u
}
$ a: d8 g/ v( l0 O" Selse0 s; ~) P: P+ c. R5 |
{
* W9 L3 I0 K+ V7 H* ?/ {! o% X: Y* N  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标9 x8 ~. `+ f6 [1 W8 C
  int t,l;
( ]& y4 e2 y# v4 @; `) b  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;
( P; S7 K$ y, I  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>! d* {) P" ~1 c  i# \5 O& X
<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,
( D* s# y- M' Q1 p) p1 h( r   l,t,sw,sh,NULL,NULL,hInst,NULL);0 R7 m; V! P# N& E2 \+ I; W
}</P>2 x. I! f$ J: h/ B1 U
<P>//显示窗口3 j! _# u/ F" S  _( h2 D
ShowWindow(hWnd,SW_SHOW);
) H+ R2 i5 v4 e! k- O//更新
* i% i7 G4 P1 K0 R3 KUpdateWindow(hWnd);</P>) a- s: V5 e2 K- N/ \4 e' \
<P>if(fullscreen)" H* I; B% v  A* x- o4 D
{2 `; q* M/ H  h- k* \% d' M; c
  //更改分辩率( E# D+ ]0 s" R
  ChangeResolution(sw,sh,bit,60);. A9 c8 z2 s( C0 p
  //隐藏鼠标
% f; j5 S% R: r& E4 n+ b5 {1 H  ShowCursor(false);
, Z" _6 q" Q$ l& B) ]5 N9 F}</P>; d4 R+ @0 g9 w: K  t' l! B
<P>//返回窗口句柄5 U) ~% B% r! h5 W: B2 V
return hWnd;
& {: s" i. k: J! ^+ l0 f}</P>$ m- f, `& |! L# U% B
<P>//入口函数' L/ b, A% d: }5 b1 h8 Z- C, w
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)& o& ]; @1 e' V, s/ V$ w
{
% \" t- }; J" {2 L* l* FMSG msg;
) J8 d$ o' u# V+ t% f2 DHWND hWnd;
1 P3 f. L# w8 c2 p2 M6 |7 Mbool fullscreen=false;</P>
  }$ g* [3 `" s0 W0 F% G<P>//创建窗口
! j) b% e* i, C' i; i. B/ L% UhWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>* C+ O" T# B. f
<P>//初始化OpenGL设置
5 A( L0 a. `9 f+ M' B  E* v" oInitOpenGL(hWnd);</P>
* {# X" r* R2 j! }2 [: C# R<P>//进入循环. ?+ l5 m- D/ O5 R- E/ F, f
while(1)
  I. y  d# M. G& V6 G& d{
1 }7 ~; B$ k! u% e) L& @  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))
+ G: D2 ]7 G, X3 K( u$ m  {
9 M; y; I' h4 `. T4 J5 Q# {   if(msg.message==WM_QUIT)
4 c( u8 B$ N, o4 s! k" I   {
" k0 m* ]1 @" E: S0 H+ x    break;* K. u! d+ O9 U. ~
   }1 B( A! z" F, ^8 F! `
   else
2 q) K, m" ]5 E0 W   {5 I3 T' A  J% m- @/ H! b
    TranslateMessage(&amp;msg);& s, o4 }) p( D1 O; l/ v4 g
    DispatchMessage(&amp;msg);
! r6 I0 m, n- M) k' Q   }+ L. p  I& F1 [" S' m4 `
  }4 t% P$ s6 v9 d+ N& y
  else
  m+ `- J! p- |; H5 M6 k  {
5 ^6 R* |0 q# l2 E$ m+ N/ @    SceneShow();
/ K5 F" `" w3 U, ^4 H' S  }
7 M; q: F2 `) ~. s/ k1 y/ n2 i0 _}</P>; |/ j4 G# N) i. d
<P>ReleaseOpenGL(hWnd);
% \$ H! i: [. a1 ]8 t  S! ^DestroyWindow(hWnd);</P>
; R- Y' H' T& K<P>return 0;
& L3 I, h- v$ z8 [& x}
% `  ^0 R( H( ]# B2 m5 f: W& q8 o+ T7 t
9 _. V+ d3 F' u/ r* A
</P>
7 J% S+ _% B0 Z8 }" l
0 [4 c, l9 Q) e) r
[此贴子已经被作者于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