QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-11-19 11:10 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.5 j8 ^) l- P, B
6 u+ q9 f7 G, i$ A  ]! W1 O: E
这是文件下载地址.' D# s9 L, h/ x. J3 C6 K, s8 N' t
</P>4 Q! T, Y" ^9 L* j& y! u
<>; N" k9 H* f& B
#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,
4 C5 T. s6 M3 \1 p. ^$ c- O, E#include &lt;gl/gl.h&gt;% k& [, K6 r8 T4 [2 y6 l/ w; h+ ~
#include &lt;math.h&gt;</P>
% z: b# |* f3 z; f) t  l. H0 `! P- w: H<>#pragma comment(lib,"OpenGL32.lib")</P>
: `) ?5 Z2 Q' x: o) _<>HGLRC hRC;8 D; P9 ^( ^. k( q) U8 C0 ?' j
HDC   hDC;</P>" {/ M3 v9 E8 y6 |8 b
<>//回调函数
2 X, t* U2 y9 uLRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>0 a' i7 E, o9 X
<>//设置视见区大小
& p. V0 \7 x2 H2 Qvoid SceneResizeViewport(GLsizei w,GLsizei h)
. ~& s; I0 b  h% [2 K# n' e{
+ R8 u! B5 \4 Fif(h==0)' C. ]% q0 S4 u9 T* e
  h=1;  Q2 t  t! J  v* f% @1 f
//设置视见区
/ x  K; x2 e9 C$ G) |9 MglViewport(0,0,w,h);</P>) P4 A1 a1 h. U' b
<>//重置投影矩阵( W! u! L, n/ ~. Z0 P  z
glMatrixMode(GL_PROJECTION);
- o. T1 j/ ?4 ]3 [7 Y* V. Q' SglLoadIdentity();</P>& t, O+ ?& V7 ]- L
<>//设置修剪范围& p5 M4 ], [- |: N+ P
glOrtho(0,w,h,0,0,1);) E" }& R7 R- J! o  h6 ~
//重置模形矩阵9 R) z; |. x1 F2 o1 T
glMatrixMode(GL_MODELVIEW);/ x2 l% \; I0 @1 w. {6 }# P" v! i
glLoadIdentity();. g& W2 F' x0 q( I' V+ J
}</P>% Y4 i; U* J- @: a/ t  R
<>//把绘制信息全放到一个函数里进行
) L) O( ~" m# p( `; u//#define GL_PI 3.1415f
7 r; ?& x- |& u( a0 cvoid Draw()! `: r$ ]$ U' a2 Q8 X& d/ l9 @
{* e* A" k( F! d6 L
glPushMatrix();</P>! y; a5 A5 p; @
<>  glBegin(GL_TRIANGLES);8 @, o( v3 F; t4 ^0 ~( u0 S- D
  glVertex2f(25.0f,0.0f);# S, A7 \/ z5 T; f+ o. q
  glVertex2f(0.0f,25.0f);0 ~9 J; T1 A7 G# J" [
  glVertex2f(50.0f,25.0f);
, X. g9 h5 M0 L' V* q    glEnd();</P>0 {! o! K8 a3 q
<>
: `( S+ }! P% T) _+ GglPopMatrix();% t! E4 v) g2 R/ L/ b5 D% Z7 J$ Z: O4 `
}</P>
' k; `$ Z. |+ D0 j0 z  B<>//在这里进行渲染
9 x3 @; e' E# A: l+ y& Gvoid SceneShow()9 U9 b% ^, X2 d, J- q  u0 Y& Y
{
' O5 d, S8 C6 I  U; ^//清除缓冲区及深度缓冲区
& t( Q- S  A" DglClear(GL_COLOR_BUFFER_BIT );2 H3 T# r% A6 O
//重置所有的矩阵- v  i! k- c6 X& o$ p9 m7 `
glLoadIdentity();
* u. I9 d1 m6 H5 O" s1 D//以下绘制开始! @" \8 n, P. V  B  O# I$ l4 D
Draw();</P>
. [- i2 L  e/ P# c* F) H<>//交换缓冲区,显示
" ]2 R* _( M6 f  `  _! xSwapBuffers(hDC);/ }1 w0 `/ U1 M5 _& a% @
}</P>  R7 }2 i4 d4 a" _: X; L
<>//初始化OpenGL' g9 w/ M: t( {" s
void InitOpenGL(HWND hWnd)$ P2 K/ B* x+ B/ U0 g, P
{& D/ L6 K) r8 |/ P! q+ R
PIXELFORMATDESCRIPTOR pfd;
! B# I% ?& _7 f+ {8 f- hint iFormat;</P>4 d, V2 j. Q9 S- g- r9 n
<>//从窗口句柄取得设备句柄3 }) ~, A. O  z; m6 }
hDC=GetDC(hWnd);</P>5 ]) M2 C; O1 ~9 q1 G5 i
<>//以下设置像素格式- ^7 z% L. ]& y$ t6 L7 [4 A- j- O
ZeroMemory(&amp;pfd,sizeof(pfd));" ]$ K& n: T1 E+ o& A$ Z& i
pfd.nSize  = sizeof(pfd);+ Q9 P7 R3 e- r. {9 e: h; E
pfd.nVersion = 1;2 ?) \& F' K( u
pfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;* z8 Y2 p& D6 d# K0 }! |0 \3 H
pfd.iPixelType = PFD_TYPE_RGBA;- Y5 o' R' C- I# Z, h
pfd.cColorBits = 16;' c$ p& Y+ c! |" T" V% L$ I
pfd.cDepthBits = 16;
: w+ J% A' ?4 F6 @pfd.iLayerType = PFD_MAIN_PLANE;</P># J1 F* Z( M5 }6 k3 Q8 `
<>//设置像素格式
/ g0 D" m6 p& M* {9 UiFormat=ChoosePixelFormat(hDC,&amp;pfd);. t  {1 ]% j# q( q/ U
SetPixelFormat(hDC,iFormat,&amp;pfd);- H% }8 D1 ~3 S0 C1 x" E, M  s
//创建渲染场景" R1 H; u( a; {2 {& J$ V' o. _
hRC=wglCreateContext(hDC);& ?! y4 `/ L1 f# y) z3 f
//设置为当前渲染场景
# y) j! H( `, JwglMakeCurrent(hDC,hRC);</P>7 ~* O; q* d. f& m5 v
<>glShadeModel(GL_SMOOTH);    //允许平滑着色
& V- u" |/ ~0 w) @! j% AglClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>
/ \* m1 g2 w% L* ^/ g<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的
& R7 j3 m  L6 zRECT rect;
4 u8 G5 W% t! G* H/ ~0 W+ xint sw,sh;</P>. t2 H* U3 h7 d) X$ N) P9 m
<>GetClientRect(hWnd,&amp;rect);
9 N* X& B5 W% T* a% D, m: p8 Csw=rect.right-rect.left;
9 ]: \# P2 S9 M+ J8 G8 p; I* Psh=rect.bottom-rect.top;</P>
3 f7 t3 V3 b$ u- H9 ]! d: u/ e& s4 {<>if(sw &gt; 0 &amp;&amp; sh &gt;0 )" @3 h# y4 k& X+ ]' X
{( i5 o# m$ `) y
  SceneResizeViewport(sw,sh);# |7 ]! a; D  u( a( \4 s) N
}
, @' d# ^8 ~5 a3 M0 X# ]9 g* H* p$ l
}</P>& t8 i! a! q, w* J, S
<>//释放OpenGL和窗体对象
8 U3 N9 }  H/ T1 r/ ~void ReleaseOpenGL(HWND hWnd)
0 Y0 s5 z% {" q+ n0 H{
/ m% g3 X3 z/ W! c4 D: AwglMakeCurrent(NULL,NULL);
3 l: }5 O6 n( Q. O% hwglDeleteContext(hRC);4 g4 R) M' b* \' |/ |
ReleaseDC(hWnd,hDC);! ~& E! q6 X2 A5 e7 R
}</P>/ C) w2 H3 d3 ?7 ?
<>//更改分辩率5 Q* d: D6 T+ k3 Z  L0 M# a
bool ChangeResolution(int w,int h,int bitdepth,int fre)
4 h, H$ X) l7 P  [0 d/ r{0 w# |& B1 N/ w, b! _2 R% h: [
DEVMODE devMode;
1 m: v% a% P3 g& P3 x6 F; i  Yint modeSwitch;! }4 J" J& {1 I* {+ m
int closeMode=0;</P>
" J9 C* c/ w  w8 }& v9 n" ]' e<>//枚举$ Z0 ]9 I) t& _' Y  N0 v
EnumDisplaySettings(NULL,closeMode,&amp;devMode);</P>1 [7 r7 b3 h% T6 x4 O& B" T
<>//设置为当前所请求的" ]" P# Z0 X3 x' Y, O3 O
devMode.dmBitsPerPel=bitdepth;
+ L4 V/ Q- y* [, adevMode.dmPelsHeight=h;, I$ C, I- t' D, X2 A0 J- r
devMode.dmPelsWidth =w;
' Z& c5 r, ]! u* VdevMode.dmDisplayFrequency=fre;</P>
" [, e3 a) y. {; O2 s<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>1 b; q2 B3 ~: P0 k2 K: h  J
<>//更改
) c2 y6 _5 B1 h9 C1 y: B, RmodeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>
' u2 n& O" X) E: M<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL)4 R1 n8 v3 ~+ b, v( [) p
{
9 c! s" g( |/ Y  return true;5 B9 b( p  P; y9 O+ h7 Y' b0 O' n
}
( g. W/ V2 v9 C" N" Q: I0 g/ Welse
% |/ i- G& i' x* ]* d  h{/ F, b# ~2 `# t# W) r! P
  return false;
8 N3 y7 d5 r3 N/ r0 R1 N4 c. \}% O1 Y7 N# ^5 A# D2 H9 l
}</P>
& E7 i9 y1 y- V<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)+ i( w: y6 ]* M5 t7 z, M$ m# R
{
, Z" N6 q7 f/ i' xRECT rect;- Y) F7 ]& |8 t$ m# ~0 D8 [
int sw,sh;</P>9 I( u7 g# e9 j) D
<>switch(message)
+ a* j" a, D! \* a; V5 c{/ Z* n2 p  L. C4 \' H* b5 X6 W
case WM_SIZE:* A. X  A7 F, q/ y2 b
  GetClientRect(hWnd,&amp;rect);
! r! L3 |8 `* L0 |; z$ P  sw=rect.right-rect.left;. |8 g4 X5 z" J# l. X3 I" M; x4 I( t
  sh=rect.bottom-rect.top;</P>: v; Y9 W6 x4 i  J
<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 )
1 \7 @* d& f' ~) n& R& I  |  {
9 Z# y$ A+ o9 W0 B4 K  ]) M- f: N   SceneResizeViewport(sw,sh);
: y( f/ J0 m+ l* m0 X1 B1 ^/ l/ T  }, x. `& U. A$ A7 l" q$ g! L3 t
  return 0;</P>
  ^% H4 X5 D/ Z1 d, _! {5 ]4 [<P>case WM_CLOSE:
7 Y% a, f0 L# h  PostQuitMessage(0);
0 n# _3 w  P$ X# J) E1 ?/ P  return 0;8 ~1 v% D! y- a+ r, |/ Y/ A
case WM_KEYDOWN:
$ T  b2 Y( l2 D% n1 h; v- \  switch(wParam)
, O" N, `/ y% ?  {
& @4 K  ~" D; M& H9 ]9 [( c6 \7 @" `  case VK_ESCAPE:
+ `" H/ |$ N9 [- s! e   PostMessage(hWnd,WM_CLOSE,0,0);
# ~! s9 r; u' z3 p: C2 L  e) `) @   break;
2 r* G: A6 n! ?. n! @. a7 e  }1 f+ w/ q2 T  c" w
  return 0;6 N. v2 L/ l" Y
}</P>% o9 {* d3 k7 {$ P: x2 R
<P>return DefWindowProc(hWnd,message,wParam,lParam);
- C8 q" o# g7 ~* t}</P>
2 l% f, Q; j0 l4 q: w6 s<P>//创建一个窗口供OpenGL使用.
8 \) o0 P/ C- q//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏7 b2 i: M  K) d. z( v, X
HWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)) V) R# |+ l" P8 O" M" Y" i9 @; R
{
7 k7 j# U% o* O3 h! i; w  JHWND hWnd;; T; L& ~6 K; a  h
WNDCLASS wc;</P>3 d$ `; @+ F7 t1 u
<P>wc.style   = CS_OWNDC;6 }, ^5 i% j; g) @$ g: \! y+ v* u/ C
wc.lpfnWndProc  = WndProc;5 U6 O/ I- s  [: ^, q
wc.cbClsExtra  = 0;/ Y( }" t5 ~' h2 S5 C. {
wc.cbWndExtra  = 0;8 G2 r# [! u6 B) d8 x/ d, b0 C- a
wc.hInstance  = hInst;
, M$ A$ U5 K' F/ G% K( \wc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);
  B0 N! A7 J2 p- H" Z! v5 iwc.hCursor   = LoadCursor(NULL,IDC_ARROW);1 u3 s" L% q2 e! c9 w2 L! {: v9 T% C
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);7 _* t$ i1 k# t  ]' N; b
wc.lpszMenuName  = NULL;
- q$ @$ T) I( r3 T: a" lwc.lpszClassName = "OpenGL框架程序";8 M! f! j& ~1 L/ ^& i& X: w
- V- n% S& m, p. n9 |$ {1 _
//注册窗口类
6 Z/ v3 h$ e3 B0 WRegisterClass(&amp;wc);</P>
6 e/ _9 |% D; C  s8 v<P>//全屏模式开
: N5 k2 s" |. q) P/ s  ^2 wif(fullscreen)6 Y" R0 c0 t- r  a) M$ ]3 a% {
{
7 V9 [% _6 \7 w+ ]* k: G, O  //创建窗口
: I2 J# e8 a4 n: Y& n# Y2 o  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,2 f2 J8 `) u4 S) A. `0 E1 k
   0,0,sw,sh,NULL,NULL,hInst,NULL);
+ C- M% ~$ ~2 @# Q( V. D8 ~7 u}0 C, n; P( u1 s3 j5 K$ x8 v, h
else5 K4 o1 O* @# I' U  Q3 O3 B1 T5 t
{& S3 ?4 j/ y1 E/ f3 u
  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标5 B* [: w2 k$ J2 G# M8 j
  int t,l;
7 e8 e5 u* y# V, U0 @; ~  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;
6 {8 \1 I6 }- Q6 D, v; _  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>- L$ S$ T, A3 ^. j: T
<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,! l4 P4 a: w7 {1 K4 U* J0 [
   l,t,sw,sh,NULL,NULL,hInst,NULL);
: }. R0 \1 q8 x}</P>1 V* m" U9 p2 v: T# ?6 ~
<P>//显示窗口' M8 P0 r9 `$ i5 J- u) l3 P
ShowWindow(hWnd,SW_SHOW);
4 q! f4 `, y+ p3 Q  h( Z8 X# q: t7 d8 W//更新7 H+ ?8 Q0 C* X
UpdateWindow(hWnd);</P>
0 q/ J3 S. h0 o  ~<P>if(fullscreen): W' b" d. @; N3 @* S
{1 r( w- ~1 A) O! W
  //更改分辩率9 ]6 r+ a' X* {. ~; @* @
  ChangeResolution(sw,sh,bit,60);
8 D+ I7 \9 q1 p0 Z  //隐藏鼠标
% W' t. T" c9 b. M; J0 X3 d% ]+ x  ShowCursor(false);
  K7 u/ d+ w1 V}</P>
& N8 R( O" T! d; N1 F& L) N<P>//返回窗口句柄
) w9 v/ D& a: G2 preturn hWnd;" q7 w% c7 B! D( c
}</P>
- K. A. B. Z, Q<P>//入口函数- U& z6 J" c) N/ k! J7 k! c  |9 j
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
2 t1 Q( P* q0 k* c9 M  l8 j" r; R2 p{! T! j( g6 z" @" e  f+ h+ z
MSG msg;/ I8 H9 S! b8 m5 I
HWND hWnd;
) t6 q1 I- B. e; `; e. Ebool fullscreen=false;</P>' E  C/ P9 x) m1 ?* Y. B2 Y( c
<P>//创建窗口; q* }: o. y" G8 r  r
hWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>  @+ }) M- `2 v- W! D( h. T4 i
<P>//初始化OpenGL设置) Z! n; X2 W" ?2 O# y
InitOpenGL(hWnd);</P>3 Z# L9 s# F  @! ]2 _
<P>//进入循环) Z+ S9 R" L7 I( b; L
while(1)
& z+ f9 [, X+ E" o+ `! S; S{
9 V9 N2 E5 M) i  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))" C; Q, a3 {4 c9 v; |8 h4 M
  {
9 W# m* M: ?" o& x   if(msg.message==WM_QUIT)
8 `! r$ ~# h4 T: o0 q   {2 E# y  h7 \" y  q
    break;
& Y! H$ I$ {8 a   }, D6 e: c" _2 q+ C/ T7 @4 s
   else8 w4 l3 l1 P* Y4 Z4 w; s- z7 ?7 }
   {6 ~- E0 g2 L8 a% f$ `0 N% O
    TranslateMessage(&amp;msg);
/ z5 H6 ?  a, A: T- R    DispatchMessage(&amp;msg);9 |' ]8 O- y8 w9 C
   }0 X6 t1 s. u2 i# m
  }
0 a) z) ^: ?) u, d  else' R/ a- o; ]) \5 e  S
  {
2 ~  N- n+ s$ \5 V    SceneShow();% \9 J# ~" m3 B6 L
  }
. y+ d+ B0 z% o- y, C( `! F/ }2 D}</P>, f$ {; J0 M8 e- `; z* G
<P>ReleaseOpenGL(hWnd);
7 Y  K; r1 @) Y8 ^6 L  ^2 _- A# j- qDestroyWindow(hWnd);</P>
; B3 @+ O5 y9 _$ @<P>return 0;
0 m7 }7 H( O$ t9 {1 v# ^$ t  u}
. ]2 c6 N# k* Y3 \* V
% w% {1 k! F' L+ D$ {$ Q
3 J* ~8 L# N5 ?( o6 |+ A</P>
4 [' k7 B( i- m3 {0 B5 K# B1 w3 z& n0 N) u# ?
[此贴子已经被作者于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 10:03 , Processed in 0.420776 second(s), 55 queries .

回顶部