QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-11-19 11:10 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.
1 x& Y' y4 b0 Z  F& U: Z8 c
: G" g. j) k8 A0 ?% W这是文件下载地址.
1 u* @/ ^& d$ [4 S. \5 N/ }7 ?</P># M2 n% G& {0 W! \+ Q$ Y  g2 z
<>
# X, ]# [0 B& k: |4 a#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,
( Z! B2 \' B7 A+ P+ A. O#include &lt;gl/gl.h&gt;1 e) E8 X5 c' s1 m# Q
#include &lt;math.h&gt;</P>
! i9 w! c8 Y3 A- M! `<>#pragma comment(lib,"OpenGL32.lib")</P>
; [4 L% c8 k. g# @: P; a& P<>HGLRC hRC;
! _; e* t# N/ x4 E2 {9 YHDC   hDC;</P>6 A3 `6 {& H3 L2 x, Z  x# q- i
<>//回调函数4 t* N8 a# F' A+ F, e( @
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>
2 ^& T+ p5 C& D) }/ T<>//设置视见区大小
" [8 [/ o: F- X0 S) f7 [void SceneResizeViewport(GLsizei w,GLsizei h)
0 j% c9 d4 W* K; e{
4 C% h: N3 v% P! zif(h==0)$ i* T& |# Q+ X
  h=1;
) s+ n7 N  {* S, b  ~" N, _//设置视见区4 t$ _7 |+ m3 j9 k: H  @. i
glViewport(0,0,w,h);</P>6 X9 ?* ^* P; [, q% ?! G
<>//重置投影矩阵
7 P, u9 N1 B( ~glMatrixMode(GL_PROJECTION);4 [' c: I1 u' w. j
glLoadIdentity();</P>( S7 Q" O8 j# Q" Y; ?" H8 h
<>//设置修剪范围
, k  D/ h0 b7 _" b. O: D6 e9 nglOrtho(0,w,h,0,0,1);
& Y+ X3 i# Q: g' H5 v9 S' Z% p" `//重置模形矩阵
, H- y  x# ]* F0 @3 J7 O8 z. `glMatrixMode(GL_MODELVIEW);. l8 ?% u1 G/ T* y& S4 Z1 a% O
glLoadIdentity();
, ?. K! U: v6 W! F) K}</P>
/ U6 ]4 D2 W* G( {& R$ L% W<>//把绘制信息全放到一个函数里进行. v& n* k  u5 m/ M# p" k
//#define GL_PI 3.1415f( ^8 V1 g2 t/ z& r
void Draw()
$ ]/ [% I. H9 b: @) ^5 }  [{  @# o1 v! e1 z+ \) C
glPushMatrix();</P>
# g! d7 c/ A, O+ P$ O<>  glBegin(GL_TRIANGLES);
* N# t+ F" }% A  glVertex2f(25.0f,0.0f);
! l1 G/ K5 [- _2 e0 h6 |; e1 M  glVertex2f(0.0f,25.0f);* t# j7 `7 h3 g
  glVertex2f(50.0f,25.0f);
0 Y3 U% y! f4 t/ o* d' {) h$ `& K    glEnd();</P>& @3 O% w4 c1 W6 u' w$ c# k% S/ ~
<>
1 }9 P+ Q4 R) }5 J9 }( \2 bglPopMatrix();- S3 q+ l, e2 ?( G
}</P>
: d( v. D8 E! J1 N. F% y6 ]$ [<>//在这里进行渲染
) D1 @$ y+ z! Y* O3 cvoid SceneShow()
2 y! k" `7 Q( n3 s; L, G+ P{
- M( D: O. `- Z; K6 |2 y, d/ _: `//清除缓冲区及深度缓冲区
" ]! r0 i1 _. {+ R- H# PglClear(GL_COLOR_BUFFER_BIT );; ~% p4 F. j3 Q/ C3 f" t1 {
//重置所有的矩阵
7 K5 R3 J& v+ |" k6 UglLoadIdentity();, F/ z& H& w. o& i. D  `7 g
//以下绘制开始
4 n) ]- s, ~( J3 ?' G! JDraw();</P>" v( n, y' i4 W% o% x: x# C
<>//交换缓冲区,显示' o% E+ I6 [- ]; B" X8 W
SwapBuffers(hDC);
; d3 W5 ?: E8 l* f$ G}</P>$ t. [; g; k3 @* N  n2 w
<>//初始化OpenGL
7 P5 c- U  t7 X" wvoid InitOpenGL(HWND hWnd)# r8 L8 d' P" H' u
{
4 e1 u  e$ ~# c( \0 SPIXELFORMATDESCRIPTOR pfd;
  k$ t# p' L$ pint iFormat;</P>
9 e4 u. `: E( R% B; X! y3 v8 u<>//从窗口句柄取得设备句柄9 X! g# b% D( i0 ^# H8 l0 @* X
hDC=GetDC(hWnd);</P>1 O0 R* \( K( I& H# C
<>//以下设置像素格式3 \9 e3 A6 D1 Z2 j
ZeroMemory(&amp;pfd,sizeof(pfd));
- _- r# e( D3 H# S+ G# s1 ?! Qpfd.nSize  = sizeof(pfd);& H; k" ?# P. G
pfd.nVersion = 1;
4 [! }! O2 X+ y  h7 zpfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
" @; C# i) ^& c/ D7 Q7 zpfd.iPixelType = PFD_TYPE_RGBA;7 i+ s6 |% b  E$ Z
pfd.cColorBits = 16;: S, S5 y# ~6 [) z/ A$ C
pfd.cDepthBits = 16;' S! F" }& v8 m" S, c
pfd.iLayerType = PFD_MAIN_PLANE;</P>
' y$ ^# \! C- P- ^<>//设置像素格式
6 o- \1 n2 `. J9 p" P; TiFormat=ChoosePixelFormat(hDC,&amp;pfd);6 j6 `! H8 m  Z* S* n; e( m6 s" u
SetPixelFormat(hDC,iFormat,&amp;pfd);
5 H, A) I; B% f3 N//创建渲染场景
# E* k  E+ c0 J& q; ^hRC=wglCreateContext(hDC);
% R: k* w; v" |$ b7 V6 t//设置为当前渲染场景5 U# _( ^2 [8 ?  z& _
wglMakeCurrent(hDC,hRC);</P>
+ z4 W% w# _3 S$ Z: o' m<>glShadeModel(GL_SMOOTH);    //允许平滑着色
9 N* z7 C! {7 B+ [glClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>
; P9 x" e6 t, u+ H( Z- U<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的6 L! j4 a7 o1 c! u5 c3 k2 }/ M
RECT rect;( |/ b0 Q2 }  Q/ m& ~! G1 K4 `
int sw,sh;</P>' U( H/ a/ z2 t: s+ Y
<>GetClientRect(hWnd,&amp;rect);
$ x! X9 Q8 p- ]+ g/ Q' Tsw=rect.right-rect.left;. g/ h/ q8 m% S$ X& V
sh=rect.bottom-rect.top;</P>
' k- I# }7 X8 w! [<>if(sw &gt; 0 &amp;&amp; sh &gt;0 )' u) O/ t: F0 K  ^
{
+ Q$ x; D! `2 ?+ e1 L  SceneResizeViewport(sw,sh);
+ ~6 A" U  B0 L' z! _9 g: i8 A}( T  ]: {# I, H1 M: ~

/ `1 L* {9 x# P6 H! j' [}</P>- p- u  Z; E3 \1 D
<>//释放OpenGL和窗体对象+ s/ ^* S' j2 A
void ReleaseOpenGL(HWND hWnd)/ L0 m/ ^' z0 _9 s, n0 F
{$ d, B# m7 k3 Z$ A
wglMakeCurrent(NULL,NULL);
9 W! D- K# ]" n3 b# b( iwglDeleteContext(hRC);
. H$ u- M; Q! X! DReleaseDC(hWnd,hDC);- |' t/ `0 [* {! F9 c. X$ x' w
}</P>" k0 N3 O# E8 R) a# h
<>//更改分辩率5 P# p# i4 B: S, j
bool ChangeResolution(int w,int h,int bitdepth,int fre)0 W) L. b" O$ _5 s+ N! _
{9 N- h0 u) {* k
DEVMODE devMode;
9 ?& T5 e- R0 a* f; t0 S+ ]int modeSwitch;2 {3 l  Z* f- H1 n
int closeMode=0;</P>
3 U' {% f- J2 Z# g) w: u$ m<>//枚举9 R) Y2 t7 h3 E" s
EnumDisplaySettings(NULL,closeMode,&amp;devMode);</P>6 T% S- i" p6 B* K( w/ o3 ~
<>//设置为当前所请求的2 Y; d( f0 M% h" N" x& ?( v
devMode.dmBitsPerPel=bitdepth;. G- D  V( D  Y+ L! ^9 c) v
devMode.dmPelsHeight=h;
! n- G( r: M% S% ]+ wdevMode.dmPelsWidth =w;- i0 h2 j* H8 E; F  h- n
devMode.dmDisplayFrequency=fre;</P>; A- V. t8 o6 O
<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>- L4 _; Z/ u, |5 w5 j# o
<>//更改$ }& Z" R. ]; y+ @% b" l( D
modeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>' I9 L7 q( \) [' q' h( k! `
<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL)
) k) u* N* O2 [2 b  m3 B+ n7 P; k{
! D9 u$ @% p4 W: [8 p  return true;; G9 E, t: T8 M
}# x! B8 `9 A; ?7 x3 A6 {1 e) Q9 U" i
else
& P6 u- x5 d3 K) i{
) R( E, p7 r% g  return false;" S6 m* A2 c- s3 o; S$ x* u5 X: M
}
8 }, v; C1 d5 p; o" q}</P>
2 ]8 {" u% l% ]( _5 P% u  i1 V& b6 S<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)# W" |' y3 D" N8 X0 F3 _
{
; x- R9 R( P8 S* q5 \' r2 |RECT rect;
$ H7 N, E: [9 f. {" M5 s0 h' zint sw,sh;</P>/ D7 \  @* q/ L* C  _- Y  x7 E
<>switch(message)% f  @4 j# [2 u" i6 `
{
7 ^9 x  M- @4 j: Dcase WM_SIZE:
2 \- T* n5 x" y  GetClientRect(hWnd,&amp;rect);
1 d" w( q9 r6 x: f  sw=rect.right-rect.left;
% e9 }1 d0 E6 m4 @+ z  sh=rect.bottom-rect.top;</P>1 R, Q7 D; f9 \7 P+ f+ z
<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 )- @7 m% E, w: g2 `$ v: r; R) r
  {0 ^( ]; p! l0 }/ s) r& a2 I8 i$ G
   SceneResizeViewport(sw,sh);1 Q1 ]" _5 v6 g7 |  G
  }
( y5 f/ g0 S9 S: `/ Z" l8 q  return 0;</P>
$ d7 s/ e0 @% x  l$ H  l<P>case WM_CLOSE:- V' q* J1 s! I6 D/ e
  PostQuitMessage(0);
7 p7 S' Y* t2 b' o( F  return 0;5 r5 Z0 }4 A& {- a( i0 q
case WM_KEYDOWN:5 E$ B! {3 C$ r* t6 j6 f
  switch(wParam)" H, z5 D  ~% _
  {; q0 \! U, x+ p& s0 o6 D' P
  case VK_ESCAPE:& b! L7 H5 |) F# M, e
   PostMessage(hWnd,WM_CLOSE,0,0);
; ?2 O$ `, d5 U) a' E* t" ?* h" X   break;- |  ?9 e* T, d: s8 ^/ m% H
  }* Z- C) D+ M2 J; ~' Q, R
  return 0;9 L, X! W3 V- q7 P" w( ]/ m5 h
}</P>' h# b. Q# O8 W3 S: I
<P>return DefWindowProc(hWnd,message,wParam,lParam);% c% H/ }8 J% J& z0 V
}</P># c  G% M( Y/ l3 B" j2 R. s4 C
<P>//创建一个窗口供OpenGL使用./ D0 R& H1 \# Y
//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏
6 N  L7 Z6 M+ BHWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)$ e# l( n# [6 X4 {# A' `, J4 m+ R
{
) A- t( G9 b# }$ V  e) ?! yHWND hWnd;
" m& |3 @, Z- M4 \  m0 ]1 SWNDCLASS wc;</P>
' @  W' L# ^1 q' N<P>wc.style   = CS_OWNDC;1 L  B# g0 |& J4 c1 ?, v& g
wc.lpfnWndProc  = WndProc;. M, j/ |2 U  E% o, s
wc.cbClsExtra  = 0;0 D0 D0 n& p" j7 m4 }
wc.cbWndExtra  = 0;$ P2 X0 V) G! F! u7 j
wc.hInstance  = hInst;# R4 P* I, ^  p" \  y
wc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);1 T6 ^6 I+ G! D7 x( [, S
wc.hCursor   = LoadCursor(NULL,IDC_ARROW);0 ]( E& L( j* H( Y
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
# E( S  J) ^5 o: j3 |wc.lpszMenuName  = NULL;
- B4 B; {6 C; S% B+ o1 b% uwc.lpszClassName = "OpenGL框架程序";
3 u0 r1 A: P, I2 a8 |; _6 B8 }4 ~
  b3 U* Y/ I- L4 ~  F9 m//注册窗口类
4 ~; j; g$ j' X% V. }' q$ [2 cRegisterClass(&amp;wc);</P>* W$ H& f" M) u( v
<P>//全屏模式开
% K# I! h) b7 z& |2 J* A. {2 Qif(fullscreen)
, H! f3 S- v" a, d{1 C/ k1 e0 s! x
  //创建窗口
( Z0 U$ N2 M2 n2 y/ @8 `  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,. n5 S/ H8 e7 _- X
   0,0,sw,sh,NULL,NULL,hInst,NULL);9 t$ r4 W; g4 [/ s% a
}
* _4 v  R6 @0 q. r" i- L4 @# X% R2 relse
% Q5 S7 g  w4 }/ ^{! w7 Q4 s* u" _4 j' ^( b8 U% U/ m* W1 B
  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标6 o9 x+ i0 p7 f! c1 ~, G, T
  int t,l;
0 }! q) \' n  G( y  x- O4 K  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;
( J/ {) @" @+ O& i5 B- M  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>
" J! f; c- [' M% H- s3 T<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,
% Q1 X! w6 O! F* V4 k   l,t,sw,sh,NULL,NULL,hInst,NULL);3 ?% i- @, j; [
}</P>: _! j& _8 F  t4 u
<P>//显示窗口
5 i# p$ b5 l; {, c  y# yShowWindow(hWnd,SW_SHOW);4 m! D- t% _1 d5 T- I" _# F# U1 ], l+ q
//更新% X$ T9 {& G+ |4 ]: I) o0 y) ~0 m
UpdateWindow(hWnd);</P>
& T$ j8 Q9 a. E" d4 P. T# s<P>if(fullscreen)
+ s% j' p4 ^4 V: w, k( C( M{
6 q" i& g9 d2 n0 x* z9 `  //更改分辩率
" I2 L# u& c! W( f  u3 Y3 h) T  ChangeResolution(sw,sh,bit,60);
0 c3 |* Q8 ]( }# L  //隐藏鼠标
/ R0 A6 v- y4 j- K$ P; A  ShowCursor(false);2 d3 n" K! T3 X' M4 }
}</P>2 Y* s: @8 I( \/ ^
<P>//返回窗口句柄, Q' e- V* v. r& z
return hWnd;6 N4 Z3 J$ u. @: H
}</P>9 k( ?# ?6 t+ D6 F/ h
<P>//入口函数; y+ C3 B. P- A9 ], E
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)' ?9 |/ K& `6 ]
{
2 K  [% q7 V" q+ TMSG msg;5 F+ w& J) D* [% b" g# {& K9 ?& E
HWND hWnd;4 t) F% E1 n% V& B  I- R
bool fullscreen=false;</P>
8 ^. o# O# y1 n<P>//创建窗口
' `, A5 [: \! E9 F2 N3 _$ T  BhWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>8 J- {8 K. W) ^) m; m) Z
<P>//初始化OpenGL设置$ u% A, L1 F+ E- d! o
InitOpenGL(hWnd);</P>
' K2 Q, L- `% Y$ i<P>//进入循环
+ R& \$ O& P' R5 ^& Iwhile(1): t6 M( F/ ]4 B$ o  T8 m
{
& O6 Z# f% Y* a' G) y8 c# G  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))
: }6 |* J. r% s9 [  {
8 u1 L1 F7 M8 i9 J' j! M   if(msg.message==WM_QUIT)4 E" Z9 `5 \8 }* v
   {
/ T/ m# x: y3 n# a$ U9 g    break;
! C( Y4 e' W' O* {  f9 B   }" D) \/ q- ~* e3 a9 v
   else
4 [9 d$ V( j2 i$ Q  ]   {" P* s) {/ O$ E- G4 q7 @
    TranslateMessage(&amp;msg);
) v: y3 A5 `& A5 Y% I* \    DispatchMessage(&amp;msg);, ^6 c- u7 Q7 X( A# ^! o8 C- Z
   }
- i6 z& a: G$ w/ I& {  J  }
5 u9 R+ s/ v( R2 i4 q5 ?' a7 [  else
; Y9 K* t. U* {1 Z1 ]! [1 [  {1 N9 e) x2 X& \
    SceneShow();( a! y- A* H- Q2 R; B: E
  }
, K4 M5 h8 @& L  l1 N}</P>
7 t5 W& d' f+ U2 d<P>ReleaseOpenGL(hWnd);
1 D' B; B# t! @5 e: A$ ^DestroyWindow(hWnd);</P>
1 Y  n7 I; u- w# y  A4 r: f* b<P>return 0;
% O, A  N: ]+ a& V1 w}
8 K; s# ~: n) n( E' p
% \/ y; M* n/ J
. Y  q: i; l0 t! S" i</P>' j! w, X+ I/ A/ T  N) H
+ {. s" E  x* A+ X, i' {( 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-6-12 21:46 , Processed in 0.381815 second(s), 55 queries .

回顶部