QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3100|回复: 0
打印 上一主题 下一主题

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

[复制链接]
字体大小: 正常 放大
xShandow        

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-11-19 11:10 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.
% H9 [3 B5 {0 @, }; g7 {& H( f. }$ U' F! G1 H) s3 |" }
这是文件下载地址.
1 X# r* e4 O0 ?- ^6 e</P>
  I" T9 s3 X6 H$ t<>
& ~& }3 D: Z) k. p# R/ M- v#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,
7 E1 H/ Y, p% `$ c  n# e! M+ J$ ]6 D#include &lt;gl/gl.h&gt;
, Z/ l# h: ]+ U% a#include &lt;math.h&gt;</P># p) z2 e/ `7 F! M0 Y. A0 K
<>#pragma comment(lib,"OpenGL32.lib")</P>
2 ~) `6 X. k* Y0 E' `<>HGLRC hRC;. r/ E: D3 o4 Y+ O
HDC   hDC;</P>0 H# Z* [( I5 }8 X' u" F0 C
<>//回调函数
0 {. g1 o5 R* m  X: TLRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>) [3 M# j! b# C" e
<>//设置视见区大小
6 Z0 c9 V/ S7 M+ Q. t: Mvoid SceneResizeViewport(GLsizei w,GLsizei h)
5 a8 y2 ~4 y6 i. J3 t5 M" P{8 b4 A6 X8 R1 @- ]" |* {
if(h==0)3 _+ q$ m. @4 Y% F
  h=1;% E4 J) E0 q! ]9 `0 ?1 b
//设置视见区
% c, u& a* j3 l: x* O% DglViewport(0,0,w,h);</P>5 @7 a6 V( T9 I+ {
<>//重置投影矩阵/ Q) `4 y7 O! ~3 g+ v/ q4 ]
glMatrixMode(GL_PROJECTION);4 I0 F* G  m2 _* `
glLoadIdentity();</P>
1 B0 d* z9 n8 h" I: Z" Z; X<>//设置修剪范围
: V& ?# W$ N: T$ g& dglOrtho(0,w,h,0,0,1);
$ ]" i3 `( C" h" M//重置模形矩阵
7 y+ G5 ^$ X5 {0 wglMatrixMode(GL_MODELVIEW);
) }9 f5 M8 ]" q4 b) l8 T3 {, }glLoadIdentity();4 e* s, X9 ^. J. f+ x! n9 a0 h
}</P>) T$ f/ U. J6 U; f, N; I5 b: ?* X
<>//把绘制信息全放到一个函数里进行' a. ], g/ z2 o  V* [
//#define GL_PI 3.1415f
) K' ^! H' _  W* |void Draw()
# b9 b7 c, c  c' N{
5 l. A6 O, `( c' j* XglPushMatrix();</P>
- k/ Q# z6 P9 v<>  glBegin(GL_TRIANGLES);( y( o3 i, X7 W# i
  glVertex2f(25.0f,0.0f);" ^; B3 ~  V+ o
  glVertex2f(0.0f,25.0f);
% h& @1 c! i5 O3 y' U' O  glVertex2f(50.0f,25.0f);- [- K3 q  a3 x' v
    glEnd();</P>
7 |; e' a0 S: W% F. H( y, e<>; k- b) m# Z0 k) n5 ]$ I. b
glPopMatrix();
2 L. _! R: h( e}</P>8 l! z" P4 o3 V9 {
<>//在这里进行渲染
. E& i! }+ g! s8 l3 Q+ uvoid SceneShow()2 E" p: h( F* R. w- p( c
{
. u: a% W0 I% B& X$ M# J) L//清除缓冲区及深度缓冲区: J' r* _7 m% z8 z* {
glClear(GL_COLOR_BUFFER_BIT );
# y2 `. h+ _" h6 l' e8 i/ K$ q//重置所有的矩阵
7 g+ \4 p, ^7 J# ^glLoadIdentity();& o- g4 o! d. O/ Q
//以下绘制开始+ x0 l* D8 S9 S5 a
Draw();</P>
! x, [( ^& f( K) J& h<>//交换缓冲区,显示9 T. G. k( u* [9 o
SwapBuffers(hDC);
, T. [& p; a% x6 R5 M0 ]8 l}</P>' o& ?4 O8 r2 @1 C
<>//初始化OpenGL) i, G- N6 ]# W3 n+ ?
void InitOpenGL(HWND hWnd)
' g: @) q! \. b5 N0 G{6 x- {% }9 F: n8 F7 T- m* S
PIXELFORMATDESCRIPTOR pfd;
0 p/ F" K9 o+ x+ F# p. {( |" Oint iFormat;</P>
+ M0 ]( k9 D) j- T& q- m; }<>//从窗口句柄取得设备句柄& |  |. ^5 j# L8 R7 h' w
hDC=GetDC(hWnd);</P>
" f/ t+ M. t' T/ E: T7 y: y<>//以下设置像素格式
8 [) ]% v9 A8 d3 c8 I1 c  }ZeroMemory(&amp;pfd,sizeof(pfd));
! H1 q6 }: J  l8 ~4 C1 b- jpfd.nSize  = sizeof(pfd);
1 `/ I; l  P, [/ U* Fpfd.nVersion = 1;/ E; O2 G* i1 V& G
pfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;; T. g) T  K) ^5 {; {; {# G! E; T8 Q
pfd.iPixelType = PFD_TYPE_RGBA;
2 z# y4 q! [# V# zpfd.cColorBits = 16;
; L9 |% o* q" r. v* n& u8 i" g* l( y5 Opfd.cDepthBits = 16;
- N$ S# J# w7 rpfd.iLayerType = PFD_MAIN_PLANE;</P>
9 w) C$ `$ V" {2 X<>//设置像素格式( E) p+ w2 ?1 e' x: `& |; W' A
iFormat=ChoosePixelFormat(hDC,&amp;pfd);
1 N7 H- s1 \* ~! _) r8 K+ K: i+ w5 tSetPixelFormat(hDC,iFormat,&amp;pfd);
4 _7 L& w3 G/ T2 @//创建渲染场景, M- o$ a% b/ i, b* {3 H
hRC=wglCreateContext(hDC);9 `) x3 m  `9 C& p( e  w+ X
//设置为当前渲染场景
$ s( Z- z+ o1 s# x9 x" Y9 @8 X; z* nwglMakeCurrent(hDC,hRC);</P>
# Q3 W$ e3 |5 N, T/ b+ H6 K<>glShadeModel(GL_SMOOTH);    //允许平滑着色
5 M7 [5 ^0 T1 _1 _$ z5 Y2 pglClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>
* H9 k9 l5 [4 i5 x7 w! o<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的
" Y4 g! B+ m" f/ j" JRECT rect;/ ]& u0 p- x+ m0 x; a1 A* e
int sw,sh;</P>
/ N  ]- x  E) @* Q* b<>GetClientRect(hWnd,&amp;rect);
+ C' G5 [  ~' x9 H, @8 }sw=rect.right-rect.left;1 a: i5 Y, k$ y( G# d* e3 F- @
sh=rect.bottom-rect.top;</P>: V' }2 o) k1 c0 F
<>if(sw &gt; 0 &amp;&amp; sh &gt;0 )
7 F5 J- q( W( C, f& d{
3 k. J3 P* Q% [$ g1 s- g# w- }  SceneResizeViewport(sw,sh);5 \5 _7 u. B! d: {% {
}4 R6 o; q( @2 {/ D
( U0 d& q) k8 O2 _; P& }4 L% I
}</P>0 _" S+ H7 x! |. V1 i
<>//释放OpenGL和窗体对象4 j& H$ c7 v# r3 ^
void ReleaseOpenGL(HWND hWnd)
: u- D- g, `! s" g, p{. X9 q7 o% c8 T4 P& b% q
wglMakeCurrent(NULL,NULL);7 k0 Q: y4 s9 j: L6 i
wglDeleteContext(hRC);
+ z1 N  Z) S1 G+ zReleaseDC(hWnd,hDC);. }$ [4 w1 _: L5 j: J! ^
}</P>
) z" \$ \$ j3 B8 f% v<>//更改分辩率
, \- [: j- E; J# hbool ChangeResolution(int w,int h,int bitdepth,int fre)8 f$ A& P7 g- c' j
{
# H# @) E4 h' TDEVMODE devMode;
  a" M0 ^- Z$ kint modeSwitch;
* _- d, g9 k3 e0 W7 kint closeMode=0;</P>- f: M4 i/ O) M# s- U$ L
<>//枚举8 }& T. u- H* ]4 B# O" x& o
EnumDisplaySettings(NULL,closeMode,&amp;devMode);</P>; l7 g& E% ?- B! f1 s, O
<>//设置为当前所请求的
5 k" n& F% a6 Y$ PdevMode.dmBitsPerPel=bitdepth;
1 M0 H$ [6 i* M. D/ y  Z! S1 OdevMode.dmPelsHeight=h;
1 }; ^: k1 L5 N3 D. [5 V( QdevMode.dmPelsWidth =w;* Q9 y/ x) {+ ^) s, B, B
devMode.dmDisplayFrequency=fre;</P>
* c' ], C( E' B+ c4 b<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>1 K& M7 u0 F9 k. F' T
<>//更改$ k: w1 e8 c- u, G( ^; u4 I
modeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>8 I0 O/ [7 v0 i8 R3 h+ ]% h
<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL)& p4 V3 W0 L8 `& N+ Y$ z
{1 I# h) P( R$ w% h- ~/ F3 j
  return true;
. C. J* G0 G7 g, k  i$ ~) [' I}* V* A" O+ J( A* Y9 U$ O& J, n
else
6 V% W- K, [7 ~. [{
: y; c$ m8 Z, O9 S" h* i  return false;
' p& |: D9 q, c; Y% F. P$ A}
2 Y) O+ A+ ]: R5 A7 u# H  C4 Y& n}</P>2 \8 [" y5 W3 e# o3 y( @$ m
<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)8 t+ ~* i8 M/ j& _2 U
{
, [  q$ z# ~5 A7 O0 E. E  o0 v4 bRECT rect;) o8 O, b3 f+ l
int sw,sh;</P>
& M4 B4 f' ?7 W7 c4 E+ s<>switch(message)
* z/ H9 Q8 B  K7 E6 Y% h{
: _' x/ d" q& t7 T- J# E2 ^+ j8 dcase WM_SIZE:
1 ]7 P0 E; Q% J  GetClientRect(hWnd,&amp;rect);
% e2 f$ Y8 g9 G& M  sw=rect.right-rect.left;
3 E9 G+ `/ z  g, o; F  sh=rect.bottom-rect.top;</P>" {& E. y* v; ~: n9 P! }( I
<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 ): h5 y9 V6 i4 l; f
  {
: b7 Y0 ]+ b5 M) w3 r# W+ G   SceneResizeViewport(sw,sh);- A! q+ j$ Y  j9 y! h) W% u- \
  }
7 s7 u- r8 J. t& L0 _0 S  return 0;</P>, L5 D/ U) f) A6 R# x( E
<P>case WM_CLOSE:
! U2 B8 E( L8 x9 Z/ ~7 y; l  PostQuitMessage(0);+ u$ `' d7 Y8 s0 B% C: d- v" ?
  return 0;! a0 f* l3 h( a7 Z- H3 m
case WM_KEYDOWN:
9 s' T$ F; r$ S6 Z% I) }* D  switch(wParam)) ~  ?1 T) s/ m- p4 l. }
  {
7 Z  }( K1 q$ b  case VK_ESCAPE:
) b! z( f8 P" t2 b2 `% J% Y- _! t' r  J   PostMessage(hWnd,WM_CLOSE,0,0);
" A& _' V8 S% y   break;
2 {  J$ ]' K, u! s# c  }
2 A0 o2 l6 l. n7 i  return 0;5 m- z9 O3 C9 H0 e
}</P>
. p7 D1 a8 p+ B, l+ S<P>return DefWindowProc(hWnd,message,wParam,lParam);
% d. S1 ^' |! G2 T- P# ?$ \}</P>
2 y1 m" s$ m. M" A<P>//创建一个窗口供OpenGL使用.- `  ]) s" v, f1 B7 K6 ?
//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏9 i, M: \" s, u7 Y
HWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)
  o9 I# V! l( S& G1 \{
, G" b/ d+ O# ~1 yHWND hWnd;
$ R0 K, q0 G7 z3 w& o+ NWNDCLASS wc;</P>
' W% B: `2 L$ E<P>wc.style   = CS_OWNDC;% i  P  a, n( t! H' `( R1 @& R! v+ d
wc.lpfnWndProc  = WndProc;/ C6 T1 @1 y, g0 P9 F1 \) R
wc.cbClsExtra  = 0;+ g6 X. R4 q3 \- P0 K
wc.cbWndExtra  = 0;
" s& N9 }, U& w1 P: H( c( i9 ?wc.hInstance  = hInst;1 Q# F6 F$ N1 g- D# s) ~# T& x' H
wc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);- o, A6 s- {$ D- u; W) L
wc.hCursor   = LoadCursor(NULL,IDC_ARROW);
# p3 t+ R. w$ I9 W$ w7 bwc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
% `" N/ B: @9 gwc.lpszMenuName  = NULL;
, D4 e. l$ e+ i. K. }7 ?/ e- Owc.lpszClassName = "OpenGL框架程序";
  ^) q9 B7 w3 f* I. v1 F8 b  D: u. t
: _5 O* V5 M* T& |- S//注册窗口类1 T3 p0 ^% Q  `/ Y1 n
RegisterClass(&amp;wc);</P>
( D2 Y6 I, {. A' V9 Q<P>//全屏模式开# c! T  g. u' s# C
if(fullscreen)1 W: J& [& ^0 _" G! l! j% ]
{
1 r9 f9 z- ^' C$ w( Z  //创建窗口
% ]5 L9 a6 H: i6 y8 Z$ ]  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,
7 b' E7 ~8 Q$ O% m9 |) M   0,0,sw,sh,NULL,NULL,hInst,NULL);
& v' e+ F% }5 p. `% G}
" r. P+ i" l6 h% @* _) Nelse2 o+ ]3 m% G2 h( o( M1 K
{0 H6 X" H( z9 f6 `- b4 p- C" A; l% Q
  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标
8 g3 m! F2 s3 ]  int t,l;
; Z/ X8 T7 r, w1 k  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;" r: H/ C& Q/ v6 p, S
  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>7 \- J: C0 O" a" f$ W
<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,
& [4 d2 F, \- f6 j1 Z* j8 F   l,t,sw,sh,NULL,NULL,hInst,NULL);+ {2 G) M- |3 J  f- E9 x4 ]" O
}</P>1 X  ~. D. g$ r/ x
<P>//显示窗口/ k1 b* m7 k. }
ShowWindow(hWnd,SW_SHOW);! |5 E& e0 u1 w( {
//更新
9 |  S# f) |  j0 q7 d* m% IUpdateWindow(hWnd);</P>
% E+ O; m% K2 B4 @' y0 T8 {; O<P>if(fullscreen). w( H$ D3 I6 V! C- I. x
{
. K7 P# h9 B, j$ s0 F. }& [" K  //更改分辩率
/ b  Q- t" [" @7 Q# a! S  ChangeResolution(sw,sh,bit,60);  i6 D: K2 e' i4 R% u
  //隐藏鼠标* |# J7 A- q/ a$ ]
  ShowCursor(false);
4 ]/ U( c1 m1 X; }. S# ^}</P>
# t+ d" ]$ M6 N& C/ A<P>//返回窗口句柄
9 L9 C; X* {, C$ S4 a4 breturn hWnd;
1 m/ H1 X0 j  }}</P>. Y% g1 U- Z8 U7 q
<P>//入口函数
) l+ x$ s2 h, s6 yint WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)9 j; T( L, h' _5 M1 u- y0 }$ S7 S
{) l, o' S8 Q. w8 z. e
MSG msg;
6 S6 w' }3 _% P. l" eHWND hWnd;
7 l" t# }# [* Q  T- [4 ibool fullscreen=false;</P>
) }) W- ^% k/ H  s( ?<P>//创建窗口
. H5 @( [6 B4 r: Y4 X2 LhWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>
0 |  n8 _; H4 U$ K" {5 Q<P>//初始化OpenGL设置
$ _5 v" [. h% G; @InitOpenGL(hWnd);</P>. m# V4 t* W. m% Z% u& A
<P>//进入循环
( W0 O5 K0 c* `while(1)" l* k3 r% f. p4 j
{7 h$ l' x0 |" x
  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))
& m) D* `* I5 m3 c  {! \0 s; V% s! N7 d
   if(msg.message==WM_QUIT): a0 i! q$ N  o2 j: v0 S4 z
   {
$ ~/ |, A8 R9 Q* f% j/ a) l; J    break;
9 T& N- i  h& K/ e   }2 B' {4 ]: l. J- g% h3 E
   else
( D! c9 g" J. v6 o9 Y# |8 H7 c   {
( B1 {( w( ?2 ^# i    TranslateMessage(&amp;msg);& p( G3 y, a9 P9 H7 @* c
    DispatchMessage(&amp;msg);. R! V5 b9 Y' G: _' \/ P. f2 o
   }! V. ?. `* o! S& P3 R
  }- }: d7 F: K0 N- B4 \/ C% n
  else
  ^* Q1 U- W+ b1 @9 N  {0 u5 h5 [' K' d1 d( O
    SceneShow();
2 X! u4 \, c% C) U6 W$ D8 I9 q  }
- f! K  C: `0 A}</P>! A1 a7 Q! R8 ~6 k' O7 f& {
<P>ReleaseOpenGL(hWnd);9 O: M% f* ~9 X1 B
DestroyWindow(hWnd);</P>
/ N( k9 ]) O% t" d- Z. F2 N<P>return 0;
" n  J5 W( U" Z1 G% g/ V  X& R! \}) y2 K2 t  i7 @3 e+ V" ^; |
! f8 h: ~( C* o$ a' a

% M; ^- p9 K! d4 O: d7 _- l! Q</P>' ~: \/ V2 c/ Y! n- p. Q
( \1 C2 ~& O( H: G6 J
[此贴子已经被作者于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)

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-13 00:40 , Processed in 0.484369 second(s), 55 queries .

回顶部