QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-11-19 11:10 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.$ O+ c) ^" x& u- g
: {4 o' Y' _+ m& T2 u6 e5 U1 e: c
这是文件下载地址.
, H% I/ \* |3 q4 \+ Z2 F4 c</P>& s- `3 l; o1 J. n7 k
<>
) n$ w& L# b( l+ P7 x#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,/ z: u7 t/ p2 t0 \
#include &lt;gl/gl.h&gt;
4 q) R3 {. ^" l# \; u#include &lt;math.h&gt;</P>
0 G! G" ?# U6 v3 k8 e  {<>#pragma comment(lib,"OpenGL32.lib")</P>
6 l) ^- O3 J  ]* T8 U<>HGLRC hRC;
  F' W( E, G  C7 O3 S' nHDC   hDC;</P>" V+ `  q! [2 L- n
<>//回调函数
& L# ?' ]. p2 P. \- sLRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>
1 z7 G; V( F4 k6 j<>//设置视见区大小
9 `! P9 n8 u9 V" Z9 Cvoid SceneResizeViewport(GLsizei w,GLsizei h)# o6 H: ]3 }0 E* D1 J
{
% w# A; }+ f. X+ G0 bif(h==0)" P% k* Q2 i5 }& ~) J5 c2 E% B& v
  h=1;, Q  G% h# \' G
//设置视见区
, M8 i; s9 ]) T9 M$ ~* xglViewport(0,0,w,h);</P>; @6 I6 H3 v, m- i+ Z; J
<>//重置投影矩阵5 e# D) ~0 q& l7 q. S
glMatrixMode(GL_PROJECTION);
% X# O) e/ t) Y- }' p  r3 t& H& UglLoadIdentity();</P>9 M* O' d2 d3 x
<>//设置修剪范围9 b& i7 m4 p2 p7 [$ \
glOrtho(0,w,h,0,0,1);- n6 `& W6 G+ h: `
//重置模形矩阵
7 G) d" P8 n! r4 e, \; fglMatrixMode(GL_MODELVIEW);
+ X) O4 v# G9 `" U  h( o9 XglLoadIdentity();1 X; s3 H; j+ u6 d3 |: f$ O+ p
}</P>
, \4 [  m. U8 I5 R<>//把绘制信息全放到一个函数里进行
8 \; ^) O- ?$ X4 m$ `! D: F//#define GL_PI 3.1415f
" z- E0 O6 V% r4 P; D* [! L% F' K% Kvoid Draw()
* f/ Y) E+ g4 L! A+ i2 h+ E{' _2 W) G* ~4 Y
glPushMatrix();</P>. T6 n$ O  J. X
<>  glBegin(GL_TRIANGLES);
9 j. u$ Z1 A0 N$ M2 d7 N  glVertex2f(25.0f,0.0f);1 F0 o- C3 \# c- A7 C/ t3 e" f5 p
  glVertex2f(0.0f,25.0f);
6 _9 z  Y1 A& g( q8 S  glVertex2f(50.0f,25.0f);
( }% _  [8 v" o; w, C$ |1 O2 I    glEnd();</P>  G9 P; [7 `' A! F9 U& p' ^9 [
<># ?' C9 ~+ j+ x  u1 y% h
glPopMatrix();
3 n4 |$ V. b; f9 ?% Y% e}</P>5 e7 a4 J' F( L# P' l9 P0 ^3 c
<>//在这里进行渲染, J2 L% w3 L2 l9 H) U0 J9 ~7 D
void SceneShow()
. s. [# _, U" x! ~{& }9 {: M) g! A* }: K4 o
//清除缓冲区及深度缓冲区! g. Y4 d# |4 _! E, J
glClear(GL_COLOR_BUFFER_BIT );
( l4 m0 h4 Y1 G3 V( I//重置所有的矩阵
1 @) o0 U  ?+ ?$ E$ ?3 QglLoadIdentity();
% ], p1 z1 Z1 `9 r9 L! y' u5 {2 Z//以下绘制开始1 T/ c! U, b! f5 g( |- u& T$ ?
Draw();</P>
* |; _$ J* u* \) k<>//交换缓冲区,显示, y5 l3 Q$ I. Q3 Q5 R
SwapBuffers(hDC);
) c% ^* f, I( _8 e2 u; V}</P>
. L  a/ f( R/ D; l<>//初始化OpenGL
& C. w8 B. D2 }0 P! |void InitOpenGL(HWND hWnd)
- I; @+ n. T9 z8 V) |5 f7 Y{' ]0 H8 F  c6 P  Y
PIXELFORMATDESCRIPTOR pfd;
, K) `, |  g' a/ \2 R4 fint iFormat;</P>
" u+ f3 w: o# c; ^* L* E<>//从窗口句柄取得设备句柄, Y1 P' A* Z% k! a
hDC=GetDC(hWnd);</P>) C% W4 d+ a/ p6 O. K" \4 M" B
<>//以下设置像素格式1 o3 @" l/ g$ M/ S. y% D
ZeroMemory(&amp;pfd,sizeof(pfd));* c4 e* W0 D6 I4 u" U+ F
pfd.nSize  = sizeof(pfd);! k4 |1 [& h# w' ?; G5 m
pfd.nVersion = 1;' L' a8 a, s0 {* K. Q; d" f
pfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
' w+ Q5 Y, d4 d# V( e$ z, o+ Q5 |% X5 opfd.iPixelType = PFD_TYPE_RGBA;# j% o3 n+ D  v- \, z
pfd.cColorBits = 16;0 i2 J3 L3 t- o
pfd.cDepthBits = 16;9 s/ Z2 D% U" p
pfd.iLayerType = PFD_MAIN_PLANE;</P>& T0 |" V; a  a( q" W8 [4 i8 j
<>//设置像素格式
1 O( l" K8 x1 E9 o: ?iFormat=ChoosePixelFormat(hDC,&amp;pfd);& C9 x7 E. |; W4 {7 z! E
SetPixelFormat(hDC,iFormat,&amp;pfd);
4 D4 p0 d7 O8 @3 ?, [//创建渲染场景
7 A9 l3 U4 w: k  i# B- @% LhRC=wglCreateContext(hDC);# Q; L0 D/ B, o9 m6 E
//设置为当前渲染场景
  V5 m: o0 ^4 s& U7 D; _wglMakeCurrent(hDC,hRC);</P>
% A3 C- d2 Q) h% x  J9 x$ g# u<>glShadeModel(GL_SMOOTH);    //允许平滑着色
& v) b/ ~- F2 C5 B. ]  OglClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>, b& x2 [+ K3 D5 L, l
<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的2 F, c# ~3 P$ K/ Y2 t8 I# _, v6 z
RECT rect;
$ D6 ?5 J' H2 {int sw,sh;</P>! u. }% x5 {4 J) f
<>GetClientRect(hWnd,&amp;rect);; \$ S) D: L3 q: j4 n
sw=rect.right-rect.left;4 h  y) \2 k7 ^) M8 v
sh=rect.bottom-rect.top;</P>! [' @' m+ O% J; E& W0 }# r8 `
<>if(sw &gt; 0 &amp;&amp; sh &gt;0 )5 C0 z( i7 w# l1 {
{
6 O$ o( _9 Q( k  SceneResizeViewport(sw,sh);7 M& W: I4 G- @& S( Z& i
}
# a9 [; K1 N. f7 e+ H5 \# z- M+ \
}</P>
( r' [$ |- E8 v4 N8 W<>//释放OpenGL和窗体对象
& i: g+ g+ T( X" ~void ReleaseOpenGL(HWND hWnd)- _. q* e/ D4 X  X1 V( ^
{- z1 a4 h8 k0 F: v4 F4 M# I
wglMakeCurrent(NULL,NULL);: ~, _; ^7 w' ^4 @
wglDeleteContext(hRC);5 [- N6 U) P2 F$ D' q) _$ O. Y
ReleaseDC(hWnd,hDC);1 E+ m  P, P3 d  E. g7 a
}</P>
5 \8 R7 l: c. M( t! r: f) K, P5 r" C; B<>//更改分辩率
1 \9 ~7 e9 }9 c% m% fbool ChangeResolution(int w,int h,int bitdepth,int fre)
+ h; ]+ V: F3 Y{  h# u7 t* B$ K! b' I2 I* V
DEVMODE devMode;4 a  M' i$ x6 g$ z- i, c
int modeSwitch;
. V) {) S) s- y2 `1 c$ U( W7 Cint closeMode=0;</P>
% t. ~2 I9 O" e% n0 a7 [<>//枚举
/ ?7 T: ]& q( g7 w) J3 d4 IEnumDisplaySettings(NULL,closeMode,&amp;devMode);</P># T! g% ^8 r6 p0 F7 a' g  b; p
<>//设置为当前所请求的2 _  a- m7 V! M- v- t* [% p* \
devMode.dmBitsPerPel=bitdepth;
2 X' t1 s  F  v, a2 X! [& XdevMode.dmPelsHeight=h;) _0 ~9 G6 ^: ?" g! \( f  b
devMode.dmPelsWidth =w;
. m: \( i. e7 _, P2 u* z' I$ \devMode.dmDisplayFrequency=fre;</P>( X  E1 Z* Y& X2 m8 x
<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>
1 C! i% V9 k* x# ]) O% V! G<>//更改
" x9 U2 ?% V0 X# V9 a' o: GmodeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>; m5 n; \0 X* ]( O: E0 S4 p/ h, V
<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL); p9 t1 s! W/ X1 }+ U4 y
{
. i8 @' ~+ ^6 K  J3 @1 X2 F  return true;
2 H4 v' n! r* g! N1 s}$ r+ P. h' C$ u/ I& Y  r
else
7 d, X, X  m4 b1 P{) B" V6 ?6 S2 K  J, b  ], H9 n
  return false;
2 y2 g' Z$ z4 c}# U+ x1 [8 h! G  {" U0 F7 r9 n
}</P>
5 d5 F; l) V$ X1 q<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
5 R6 P& k( d2 X  o, L( ?{
8 j2 ^' L9 k/ k( J- x; ?; JRECT rect;
+ C. Z! s) t! l7 `int sw,sh;</P>
+ p& y- E0 ^/ a, j<>switch(message). q+ q2 y. M& g- u) f2 }
{
" y: n8 O8 ?; @: |4 a8 O2 b4 acase WM_SIZE:
& @. M! d( F! \  GetClientRect(hWnd,&amp;rect);8 S  ?; ?% k6 g
  sw=rect.right-rect.left;
# T1 w; M2 C6 O' m  sh=rect.bottom-rect.top;</P>+ H+ |) o, R" b) G" k$ @. @
<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 )
9 z; }; W& [8 V. t, W7 p2 q  {
% F/ Y7 T& K$ d7 W' l   SceneResizeViewport(sw,sh);
( O  _. K0 |, e. M5 @! M  }
( y5 R, Q1 D  W/ `8 ?  return 0;</P>$ [( d) Z" F  @, w  f
<P>case WM_CLOSE:/ q) y0 s/ M- D& f5 S6 _
  PostQuitMessage(0);
8 ^: F4 T# I9 l) C3 Z9 A# O4 i  S$ u  return 0;) B# n! B5 I9 r; Z9 M8 E
case WM_KEYDOWN:
! l. G; M! j4 s# z' T5 S  switch(wParam)
. t1 @% _! ~: a3 R' u  {+ a  O2 _/ c; z
  case VK_ESCAPE:
. ^$ e+ L8 n* l   PostMessage(hWnd,WM_CLOSE,0,0);
" J, e- W5 j. a! f1 z5 p   break;) q" A) y3 E: t
  }! \1 b5 c% U8 o1 y. `
  return 0;; y  t; l6 F  ^
}</P>
, q; d$ I& f- C$ q/ m$ j* \<P>return DefWindowProc(hWnd,message,wParam,lParam);
5 I8 q6 y" |# Y) Y- L7 h}</P>
$ Z  e3 ~+ p) L<P>//创建一个窗口供OpenGL使用.
6 e" b8 E$ C7 c: D3 f//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏
# N- R: y7 o2 K9 l$ X' G0 K8 QHWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)
2 ^& M# G% K' ?$ e7 }{  M1 G3 K: v4 r' m: r. Q
HWND hWnd;
9 c! W% w8 \. q" nWNDCLASS wc;</P>/ v* d6 I( p3 t4 T
<P>wc.style   = CS_OWNDC;/ K) b1 D" P$ A# C) Z, Y
wc.lpfnWndProc  = WndProc;, `# c. ^4 e2 ^- x% ^4 `1 B
wc.cbClsExtra  = 0;
3 D% N; |) i' \) Q  v8 ywc.cbWndExtra  = 0;; c/ M( B" G9 c7 c& r& e4 i
wc.hInstance  = hInst;
9 m) n* i) `/ }7 S" M# O! N: Xwc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);
7 I2 v6 k, N0 A% S+ cwc.hCursor   = LoadCursor(NULL,IDC_ARROW);
  f  x  C1 x& Q: i# u9 |wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);0 l6 r5 R. {( p1 Q  J5 w
wc.lpszMenuName  = NULL;
. B" f: G5 C4 n3 x) Z  `; {wc.lpszClassName = "OpenGL框架程序";
: K/ U* O* d/ o- K
% w+ X  S) }$ H//注册窗口类6 A4 C; Q+ h0 r! _+ o
RegisterClass(&amp;wc);</P>
7 F" n" c5 o+ G& H! K5 N<P>//全屏模式开
# g' {2 W+ G1 g! cif(fullscreen)8 B. S+ r# k( V! X. B5 t) W7 b
{( }( W7 ?7 M4 m/ A
  //创建窗口
( k7 D) i8 W/ B5 K1 ]( `  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,* O% H& z$ L5 l. T
   0,0,sw,sh,NULL,NULL,hInst,NULL);4 M0 P2 p' a; d2 K* V: z0 {
}# }. X+ c+ {1 ?, v
else
. i4 o2 U7 p5 r- U1 Q{
8 N3 O  j* T- a. H* V0 ~, \1 p  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标! G3 a5 {- ~0 o/ ?* \% q7 E, `/ ~
  int t,l;) K/ H: _/ w8 o" V. m8 p! |% z" Q% P
  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;+ v( `" m) y6 r- a  c  Z
  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>
/ p+ w- T: T( s9 j<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,! T) N7 f) _  U" [1 v$ g- ^; N
   l,t,sw,sh,NULL,NULL,hInst,NULL);
: M6 T$ H- I) F}</P>, H! s) C4 m* m) u
<P>//显示窗口
% a; I$ j+ }2 f& W# f# iShowWindow(hWnd,SW_SHOW);
+ T, V% W  A4 q' R5 O% J+ Q7 q//更新
8 o, `( _$ C- m& x, yUpdateWindow(hWnd);</P>4 D, S; ?- s6 s+ C
<P>if(fullscreen)7 C5 N$ s$ [8 T  S/ O
{
/ V+ C; q: ~( N/ G. ]' d, p8 q  //更改分辩率# |. m* \7 A: S
  ChangeResolution(sw,sh,bit,60);
+ f) [. k" O( S; d  //隐藏鼠标; u2 H% y0 e0 t# I- r
  ShowCursor(false);
% d9 l1 q( W# ]& ?$ E+ t& [}</P>
, H. Z+ k$ K2 j. ^0 L<P>//返回窗口句柄
& R2 @6 B9 e# Ereturn hWnd;
4 t4 P8 F" F9 j}</P>
/ X5 s/ t/ ~# ]$ v/ N7 d; c/ O+ b1 K<P>//入口函数
5 j+ t+ Z* n% H* N: F" x' n: Eint WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
: h0 G7 h! T4 Y: s% J{
0 I3 r$ R7 `# s! O4 H& M! MMSG msg;" S2 g/ n5 W+ s, J" E& }. G7 E
HWND hWnd;
+ V& M; L; y; U% D( i$ \6 Gbool fullscreen=false;</P>( D2 S) v1 f: B: q4 }0 B0 J
<P>//创建窗口6 m' |. W  n' B1 r, L* _4 J, E% L
hWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>! p9 @5 Z8 b( K) M4 Y  k) V
<P>//初始化OpenGL设置- H7 P: D8 L! H6 U6 g/ `
InitOpenGL(hWnd);</P>
7 a' `- P- J5 t" I9 r1 U<P>//进入循环
/ q! F" H& I, m- k( q  x) b2 U6 wwhile(1)" i( a. N. T$ X( O
{+ ]3 g( M, P- p/ p; N# C
  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))/ w+ C" X) {3 a
  {
7 k; T4 `; @& i$ S: T& }1 J" j, x$ ]   if(msg.message==WM_QUIT)$ u9 }/ X. _' V/ N2 p2 M
   {& N. u- q) d$ {5 o3 H2 b
    break;
7 {* E+ T/ U6 Q7 {) d   }
# X. K1 T* V  h+ z2 `/ ~; I   else
2 u5 }  ]6 s' n9 t   {
2 a  f- Q2 L% s9 h  ^    TranslateMessage(&amp;msg);
, F& @0 m) k5 {+ ~1 T; v    DispatchMessage(&amp;msg);- f$ u! G  Z) D
   }
; {4 ~6 n% c' K  X9 H) l: @  }& `8 T& ~2 m- a. @
  else
  i( \$ d5 A# W0 p+ ?" R! j  {
: `/ M- C8 Q5 p    SceneShow();1 ?- c: B2 Y: B( I- K' \9 @
  }
0 j# }" i. D: u+ Q7 Q7 a- ~}</P>6 d8 w8 f: S$ f, D3 g
<P>ReleaseOpenGL(hWnd);
0 D! Q0 {; N% X% rDestroyWindow(hWnd);</P>$ ^$ b) }! i0 m" o1 }! N
<P>return 0;% G$ b+ }8 G/ G/ w" `1 {5 V$ \8 g
}9 G* D- j. D, t2 R) ]. E
8 J, ^. z9 z" d1 O

' b: h* O" |" J  |, q& x# I# l! `</P>/ {4 r8 A& |( x

0 l& t! Z+ u7 ?$ M& Q7 y/ @) W, Y
[此贴子已经被作者于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-4-20 13:27 , Processed in 0.520357 second(s), 54 queries .

回顶部