QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-11-19 11:10 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.
5 M- X+ A, w  [! \
2 j/ x7 W" O# g- A# d  l这是文件下载地址.. s6 L# \0 Y  i5 f
</P>
; q( c* Y- k. Z2 k$ H. a<>
. n, @: Q0 U( n#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,: G* D- t. J0 D# P/ F
#include &lt;gl/gl.h&gt;# G1 D) @/ ~7 |- w
#include &lt;math.h&gt;</P>7 t. O2 i0 K# c3 I% z0 g( K* o$ Q( p
<>#pragma comment(lib,"OpenGL32.lib")</P>
$ W* v1 Z8 }  e6 ^. `& D2 z<>HGLRC hRC;, k# _* x$ k* Y
HDC   hDC;</P>
5 w* w) E- y& X9 n<>//回调函数+ S( ?$ n0 J$ r$ h
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>
& k( x0 D* O8 J- k' M/ s6 l<>//设置视见区大小
4 p* N! H( l# ]  svoid SceneResizeViewport(GLsizei w,GLsizei h)
4 T- D- A) C6 E" a{
+ s7 r7 e: ~. Lif(h==0): c% R( ^8 u7 \& i2 T/ l3 M! h
  h=1;
6 M' O% P4 f. O//设置视见区7 Q& I& \* K3 P- @2 @7 U1 F. b
glViewport(0,0,w,h);</P>
9 P, [* g$ b$ v<>//重置投影矩阵
2 l; f# c9 Y  h6 M+ I/ H- FglMatrixMode(GL_PROJECTION);
$ u# J5 L% R" k9 ~2 w6 c. LglLoadIdentity();</P>& Y" ~# F1 g2 ^
<>//设置修剪范围
* }# G! d4 Q: Q, t% N! @) d3 ]glOrtho(0,w,h,0,0,1);
* D1 H' E: E# h3 ~& G//重置模形矩阵
4 W* P  H6 f9 X) A! I2 g- s" O. M. mglMatrixMode(GL_MODELVIEW);: D1 X8 Q  M% W* \/ R; p& B
glLoadIdentity();
! }7 D* K) x9 S}</P>5 T: W$ b. C$ g/ Y! W
<>//把绘制信息全放到一个函数里进行% `; @: m9 D5 N, \3 l' U
//#define GL_PI 3.1415f- H4 I7 O2 x8 s3 Z% b
void Draw()+ t& M: F: Q+ e8 ?; B
{, ?8 i; H$ l2 r, k1 D# P% v& W/ Q1 s
glPushMatrix();</P>0 `! Y- L; t: }" p- k$ w9 n
<>  glBegin(GL_TRIANGLES);( I# ~! e8 X; V# l+ l, h: ~
  glVertex2f(25.0f,0.0f);
6 I7 q% a) a8 f  glVertex2f(0.0f,25.0f);) h' a- Z5 p: W0 U
  glVertex2f(50.0f,25.0f);" n" m: Q, Y) G! C8 U" \) m
    glEnd();</P>
( g4 {! f5 y, ]/ K* t" F2 \<>% i& J9 A* p+ E1 T
glPopMatrix();
4 X1 t; ^* x% k; D( a8 d}</P>* y8 M2 b/ Z5 ]
<>//在这里进行渲染4 `# ^8 W7 g) x: }' Y, ^& i
void SceneShow()5 r/ {' B3 f+ _6 E, ]
{
5 m' h+ E4 d# X: s3 _//清除缓冲区及深度缓冲区
4 T, L! V8 X* g! {& r+ S. SglClear(GL_COLOR_BUFFER_BIT );/ H4 K, @5 V) ?, m* @. Z. s  ?$ ]
//重置所有的矩阵
9 V4 u8 V8 K3 m9 ZglLoadIdentity();
5 [/ \/ l6 ~# p6 t. F. U  ~; `# {//以下绘制开始$ p1 i% \( r/ q: M1 s2 @/ I
Draw();</P>
5 `' u! J4 N; A; S8 w<>//交换缓冲区,显示! r4 _+ L7 l. x& E( m# O  A: G) E7 ~
SwapBuffers(hDC);
2 ^" t/ b( l  k4 |2 i9 W/ M7 a}</P>0 A( W& V  T; ^" W" H( R+ j
<>//初始化OpenGL
) [/ A1 e; ]  F  |1 Kvoid InitOpenGL(HWND hWnd)
* d0 i; c  L; v7 C: G! U; a( I{; C' |/ S: A+ u1 _
PIXELFORMATDESCRIPTOR pfd;
2 q, u+ C: [" c- Pint iFormat;</P># j/ w) Y4 L: l/ n# x- p  q
<>//从窗口句柄取得设备句柄
: j/ u  i* k: J. C. qhDC=GetDC(hWnd);</P>. [7 D/ C! Q) g4 ?; T; ^$ i
<>//以下设置像素格式! K& A+ C! s: M& T5 x0 i: x
ZeroMemory(&amp;pfd,sizeof(pfd));
$ [6 f, ]* p+ q' q: W, Epfd.nSize  = sizeof(pfd);  V( o) B# n5 i) N6 Z% q- u
pfd.nVersion = 1;2 W4 S0 V* l: x* O
pfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;$ s/ x1 Z: `" J6 t+ k% A- _3 ]
pfd.iPixelType = PFD_TYPE_RGBA;( O% Q+ ]! W4 P$ _4 C4 s0 U5 a  e
pfd.cColorBits = 16;
3 I* E0 s) {  A5 o8 Y8 Wpfd.cDepthBits = 16;- }# K7 [6 I6 h/ z: Z
pfd.iLayerType = PFD_MAIN_PLANE;</P>* G. o3 k. t) n1 u% a1 l
<>//设置像素格式! @0 o4 X1 b4 X1 Z
iFormat=ChoosePixelFormat(hDC,&amp;pfd);
$ c8 q" w, M' i$ ZSetPixelFormat(hDC,iFormat,&amp;pfd);
* K, [- X% W9 ]4 h0 K//创建渲染场景
) ?, D- s% m& Y, f4 f8 }1 ^hRC=wglCreateContext(hDC);
1 d8 S* s/ T6 N  R/ w! M% \$ a' Y4 Z//设置为当前渲染场景
. {7 J0 s$ \7 E5 }. wwglMakeCurrent(hDC,hRC);</P>, P- N3 f9 o9 I2 ?
<>glShadeModel(GL_SMOOTH);    //允许平滑着色8 w: u6 }1 W  }3 V
glClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>7 ]7 P! q0 P* R3 I
<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的
- M- v  K6 {6 S7 L- xRECT rect;8 q' u6 g  o# _( g5 I: K* \5 s9 W
int sw,sh;</P>
, ]2 e) L$ T* d6 s9 ?/ l6 L3 b; i4 h<>GetClientRect(hWnd,&amp;rect);' o# j+ U& T2 @& ^
sw=rect.right-rect.left;
& N* V! Y. t3 E/ f& I$ a8 Bsh=rect.bottom-rect.top;</P>* C& e* m, Y: k+ O
<>if(sw &gt; 0 &amp;&amp; sh &gt;0 )
1 }7 S" f! |7 h# e. Y9 }3 g2 ~1 ]+ J{
; R6 d( B/ ]* b  SceneResizeViewport(sw,sh);
$ o  I; M/ E. |/ K4 ]+ h) o}
, n# H3 D% I. @& B# v4 k9 A4 N$ [% [& {: j$ C2 s+ Y2 s6 ]
}</P>
4 ^; a1 V9 S. A4 J3 `' H4 h6 q6 Q<>//释放OpenGL和窗体对象
% b2 p& b/ \9 C3 N+ U) svoid ReleaseOpenGL(HWND hWnd), q! y: v% f! k0 a; o/ T0 ]
{* n; g1 |" V& Q
wglMakeCurrent(NULL,NULL);
% N" M: h; A& P. ]+ X! m6 o# j/ PwglDeleteContext(hRC);
5 ^% s8 ~' l$ C8 r+ oReleaseDC(hWnd,hDC);
7 q8 o& {1 l' G4 K) p% h- C% h# s}</P>/ Z6 c6 X8 S: O9 a! ~
<>//更改分辩率5 B/ y1 x' R) [! ^* T
bool ChangeResolution(int w,int h,int bitdepth,int fre)8 u8 j+ h" e8 q: Z7 i: [, f
{
1 l) N9 O( _7 H; U# @DEVMODE devMode;: N% q+ F5 J, w5 I! H$ N) o
int modeSwitch;  ^1 Z5 |: X. P2 b8 l
int closeMode=0;</P>  O/ O+ N& W% D5 }5 `# o! _
<>//枚举
6 T4 k. N+ O5 q4 l  oEnumDisplaySettings(NULL,closeMode,&amp;devMode);</P>
. b% O! `4 y( E# `9 T<>//设置为当前所请求的
. V4 p2 |4 p* R* XdevMode.dmBitsPerPel=bitdepth;
, R- q2 Z3 M, {3 xdevMode.dmPelsHeight=h;
- J+ ?+ b7 B) _" F) pdevMode.dmPelsWidth =w;; t8 D2 T8 F1 M5 S+ `
devMode.dmDisplayFrequency=fre;</P>
6 v, ~% v% Z% b; M<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>
" v: d. r: o' j6 ~5 ]4 D& Z& ^* r<>//更改
9 J! K) B1 [; V: a& E2 {% amodeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>9 W! g* b( C& N, P
<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL); W; O! |3 o3 g/ k3 W3 H2 M, z
{
( l5 e9 q2 h/ |  return true;; j/ G. A. U" t
}
1 O- E% w8 S; E, Belse
, a! h; I; J7 c{
. C/ V) r% X) U. d  return false;, U1 k6 a# W( F3 k3 `6 {, J; X
}/ J  |1 x% I) Y7 q  \
}</P>5 U8 ~! D- x8 A6 V
<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)( X1 E% Q5 K: O, f  E, m
{8 P, @1 h0 g% ^7 G) A" H; x
RECT rect;  {& S1 Y# b3 U. h+ M( G$ y& r% t! x$ I
int sw,sh;</P>
( g2 X& N  U' S' ?1 l+ ?3 B4 ~' u<>switch(message)0 }) X# v( R0 M' @
{' }3 h  f5 v4 ?5 v
case WM_SIZE:% ?4 g; ^& w2 Z% z
  GetClientRect(hWnd,&amp;rect);% q, `0 G3 o: N3 z/ r
  sw=rect.right-rect.left;1 S( X+ d0 R8 R  p" B
  sh=rect.bottom-rect.top;</P>
9 O' V# z+ ^) R# n<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 )- V# Z2 r. c, ], n9 W# U
  {6 {3 `( V0 J! k- f
   SceneResizeViewport(sw,sh);
0 o  w9 i' K# N6 P7 \0 V. e  }# ?7 a5 ^5 [$ k6 K6 s0 m
  return 0;</P>7 G8 x6 D; E5 Q  J3 y$ G$ P
<P>case WM_CLOSE:4 y+ n  w: `1 u: f
  PostQuitMessage(0);/ p; S- A1 ]8 F' K0 w# s
  return 0;
0 ]7 X* I2 P, H6 |0 Kcase WM_KEYDOWN:5 M  s# F" r. r. Z
  switch(wParam): Z3 A. ^# S4 u: V
  {
7 o: y  L; J) O$ D: h  case VK_ESCAPE:
+ g; z% [  z( Q7 a. \3 P   PostMessage(hWnd,WM_CLOSE,0,0);" Z+ f, ]$ \7 O# c1 M
   break;" P! ]0 E. W) b" H4 G% P3 T
  }* G$ h* R! l& N. n
  return 0;0 G5 l: X) D) F& @) s/ a, b5 r
}</P>% w- L5 t7 o# H8 ^
<P>return DefWindowProc(hWnd,message,wParam,lParam);" v4 o/ T% I' S" x
}</P>3 }( U$ N  J- W" \& k8 Q6 @
<P>//创建一个窗口供OpenGL使用.
( }" V" A, g5 F$ d: m//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏
; p, h: U7 B5 E" N# T9 e$ J: f" PHWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)7 u7 M& Z" T7 _3 N3 L) p
{! ^4 C; ]+ ~0 L0 A6 \( A& N
HWND hWnd;
* L7 z! s; ?6 n0 tWNDCLASS wc;</P>
; r) }# y# V5 }<P>wc.style   = CS_OWNDC;! b, x2 q7 e3 ?/ a' Z
wc.lpfnWndProc  = WndProc;3 R# f  j; b! N# k: \8 H. ]
wc.cbClsExtra  = 0;$ ~2 }- E% F+ g+ U9 G) \0 I
wc.cbWndExtra  = 0;
( R- |1 W& }7 k% {* dwc.hInstance  = hInst;
: ]( Q! [& N1 [# e# q4 @. a3 d: Xwc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);
2 i1 Y$ z1 a9 @# D; _& d4 jwc.hCursor   = LoadCursor(NULL,IDC_ARROW);9 D7 r( `  z- B+ F
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
1 J& \, e; X, _0 ^$ `0 F& V9 V) |wc.lpszMenuName  = NULL;0 L6 l+ e  b9 d5 W* Q
wc.lpszClassName = "OpenGL框架程序";
  E0 X1 }1 f3 B" T2 d  x8 G* q4 g8 _2 ~; W
//注册窗口类
" z6 V0 f7 ]( Z# [0 _& PRegisterClass(&amp;wc);</P>
9 A2 B8 G, z2 ?1 J1 y) x0 L<P>//全屏模式开
. K; B* V% q, N. j  [if(fullscreen)
8 p9 y" Z. ^- T( j{' l# G0 d" g* J0 h4 m  D! Q3 ?
  //创建窗口
8 `2 g9 S# O2 o& u, O' M  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,. H$ s2 p- r% c2 f0 a) k
   0,0,sw,sh,NULL,NULL,hInst,NULL);4 X" L1 p3 [! X% U2 ^5 [+ }2 l
}
7 o4 G9 [; \) ?/ j4 Y  j% Relse" J9 R# F# w4 O  o/ L* ~, {
{: k. {' a! g7 q* n3 S; R
  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标- q% r# [- d  v" `& P
  int t,l;
  K4 @2 l+ p( k( R  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;; M. @/ H  a& a" X( Q; x; N6 p3 F
  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>* a% [+ G( ]  _) o  E5 E
<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,7 `. j! u1 `; L- X7 D
   l,t,sw,sh,NULL,NULL,hInst,NULL);
. J9 l/ ?. J6 z; E3 E}</P>' }1 ^; ]4 G; P% ~8 a( d; l0 B& o/ b
<P>//显示窗口
6 J9 k# o: H6 v5 o* I  }* h* EShowWindow(hWnd,SW_SHOW);
# D8 k9 s- b: x7 }1 \) I//更新/ U! m* {5 `0 t; d/ L- e# v0 B
UpdateWindow(hWnd);</P>
% Q$ |" {2 n  m. ^$ A3 {<P>if(fullscreen)
2 ]" I6 c% T8 n* h# g5 \: c{
/ P1 Q" `4 L$ Y4 b% w  //更改分辩率5 E# d5 \" \* \, _7 t% M
  ChangeResolution(sw,sh,bit,60);' T; V0 p9 d: B% J
  //隐藏鼠标
8 D3 A- l5 \$ P) O  ShowCursor(false);% }$ g! A2 s) I  T
}</P>
% v  A' P0 L2 s- }8 s<P>//返回窗口句柄
: p6 r% \5 v. |+ p+ r6 F1 }2 ~return hWnd;
, N% l, _* k8 ?% h1 Y" ]  Q3 X}</P>
- U* w3 b7 ^( U. l5 `4 l/ }/ @<P>//入口函数
- n' e8 y  C3 ?. G. ?5 ?: A0 Oint WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)4 y# b1 R# x! ^: `8 R: K
{! e8 ~# X, c3 k* R% \% }  W. ^
MSG msg;& }6 A* {) ^# o0 S: [2 x1 a2 S
HWND hWnd;
7 O+ G6 x& K: `2 u3 U* Ibool fullscreen=false;</P>
* f( I' k$ m. g( G  q% h5 Y9 \<P>//创建窗口
! Y5 ], C: m3 A2 |hWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>
  R9 L' c8 O$ D1 {; @% W: Q<P>//初始化OpenGL设置
$ f' m& ]* n9 b# `4 O0 d" sInitOpenGL(hWnd);</P>
: W( l; o  z/ y' M) ]<P>//进入循环7 B, ]" E9 H: |. M2 L
while(1)
  C1 ~1 Q; J1 m/ X# P8 S{
) y/ d1 L+ h6 r# l' \7 i2 _  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))+ N& u9 [8 y. h
  {
  ]/ `# N/ \8 G) g  S: F   if(msg.message==WM_QUIT)% _6 f8 m; `8 h5 ~
   {4 a0 d7 _0 j- A
    break;# A6 A+ I" m" I  h; c
   }
" t6 D7 @* V; P1 {; k# P6 ~   else  m9 k# a5 S# W
   {& {- x! ]2 |4 w' `9 F1 }
    TranslateMessage(&amp;msg);9 f1 y6 E0 `6 L
    DispatchMessage(&amp;msg);
" M0 W* z0 G( r- [   }' A, W) J0 K; z* d
  }# b2 F9 v0 _6 M7 G, T+ I; e% a
  else
7 e% Q& D% n" V2 j9 R- a  {; z2 S1 l4 J3 H) r
    SceneShow();
, M6 Z6 U& J! X- K6 E% C! v& }7 b' ]  }$ ~# \8 A0 Q! g) z
}</P>, {8 W. U0 _- a9 {! k
<P>ReleaseOpenGL(hWnd);
( o8 w- X8 }. ODestroyWindow(hWnd);</P>
3 t8 x% P% Q4 {" R<P>return 0;
" l4 l/ _7 u9 W% H}
* {' z( R$ {% @/ ~% n5 T0 {
! {- _3 o) p" b# Q2 n, [% p5 u
</P>
0 R6 H$ m" F! ]% e3 o  g& R3 ^: T( w: N9 V
[此贴子已经被作者于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-10-25 10:57 , Processed in 0.858728 second(s), 54 queries .

回顶部