QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-11-19 11:10 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.7 R6 e6 x6 L5 W+ {
' {6 A- J; X- [) V
这是文件下载地址.
0 c4 P% r) ^& K! `1 ^' M</P>
0 O4 c2 o6 W+ k) u& {/ o<># D# r- Q0 o+ S% k, x
#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,7 x* Y* _; c- @: V% E+ \0 n( Q- |
#include &lt;gl/gl.h&gt;
" k: ?; F7 {+ K2 s2 t7 x* c#include &lt;math.h&gt;</P>% Q* I0 ~* ~2 [: r
<>#pragma comment(lib,"OpenGL32.lib")</P># \) t6 W) Q6 ^/ W/ _. B) x
<>HGLRC hRC;) e1 m7 Q2 i1 a' a
HDC   hDC;</P>
- T6 t! O3 N; e; G6 d<>//回调函数2 f" ]0 y6 Z+ F8 e
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>3 P2 m" K7 J8 n$ c! d7 f8 \
<>//设置视见区大小% s3 W* E) _2 X3 R  q
void SceneResizeViewport(GLsizei w,GLsizei h)
6 o2 a  t) |6 ^% g+ s7 I! Y( ^{" ]) f6 r6 ~& S( E0 l
if(h==0)
: E- g5 f9 x* Q/ U  }$ b  h=1;
" T* f# A& u' F! E+ C$ @( Q//设置视见区% u( ~& v: q$ z; W1 A
glViewport(0,0,w,h);</P>% H4 f" Y* u+ Z; C3 V: A1 q
<>//重置投影矩阵
5 A% m, Y) T" d! {+ h" D: wglMatrixMode(GL_PROJECTION);
7 L& D# ]! f# K: i, {glLoadIdentity();</P>
3 H/ F7 D! D. y) P0 Z4 U& o<>//设置修剪范围5 R* `: R' Z. E8 w- \! t5 r5 k
glOrtho(0,w,h,0,0,1);$ m. }8 l& ?* x- G
//重置模形矩阵+ N/ Q9 [8 j+ f, e2 T
glMatrixMode(GL_MODELVIEW);. r  f. Q; C  Z& ]$ d7 Z
glLoadIdentity();6 Z8 L. o- ~$ Y4 O! Y: l
}</P>
( t$ b: D+ d& @  q' ?, l' {/ b  C<>//把绘制信息全放到一个函数里进行, K" ]8 R" N( q9 t8 ?- \8 Q
//#define GL_PI 3.1415f8 U3 q' L8 d* I
void Draw()( D  [8 z5 _: K! @1 I1 r" K( D8 m
{
# H6 [; |) t2 z7 }9 L( g$ TglPushMatrix();</P>, A& z! d8 L: Z
<>  glBegin(GL_TRIANGLES);, k( H/ a1 z" e8 a* K
  glVertex2f(25.0f,0.0f);1 P9 s' C0 W. h2 X
  glVertex2f(0.0f,25.0f);
. z& B9 t& r* a% S) o0 Y  glVertex2f(50.0f,25.0f);
8 K9 o; T7 h) q( c    glEnd();</P>
& O4 Y+ u+ P. T4 L5 v; o/ i<>/ @) g8 y7 f$ ?1 l7 w- F( |
glPopMatrix();# O" Q' @( Z3 X4 b4 F
}</P>- i. ]- h  E$ _9 ~2 m' g3 d% Q0 |
<>//在这里进行渲染$ u" n- \4 N7 b$ ^
void SceneShow()# I+ O$ u; }. W
{' ^. b) X( P- G$ L) w$ z, w
//清除缓冲区及深度缓冲区& E& s& E* h( i% C9 {/ v+ R
glClear(GL_COLOR_BUFFER_BIT );
1 w7 W; i2 f; W0 {, P+ O//重置所有的矩阵
$ N( k& s' P# X# T, h8 ?& ]9 Y3 NglLoadIdentity();9 e" m6 |' ]$ H
//以下绘制开始& S- @$ R) [9 ^& P9 |
Draw();</P>
; z7 l9 }0 h+ W: D) r) f/ v, k. K<>//交换缓冲区,显示! p# x9 W- F1 O  \+ }7 }
SwapBuffers(hDC);8 W  j( p8 `* K9 @$ D+ S# b
}</P>
1 w) o6 \6 g! {( P( Z<>//初始化OpenGL
% y* w4 D) D* m/ H, s6 A# [void InitOpenGL(HWND hWnd)
% R1 H" A1 R4 ^/ M; J# @{* k- M5 u: Z" y- O' y7 A
PIXELFORMATDESCRIPTOR pfd;
6 g# D2 a# [: X" B" F9 Zint iFormat;</P>* H6 c$ Y; v$ w# v+ B) H* L1 d: H
<>//从窗口句柄取得设备句柄3 v$ d* F+ S+ h5 `
hDC=GetDC(hWnd);</P>8 j) H0 ]7 l, O* W, V* o/ T
<>//以下设置像素格式' z7 O6 {0 E+ d6 R
ZeroMemory(&amp;pfd,sizeof(pfd));$ L. S) `8 K; E8 o
pfd.nSize  = sizeof(pfd);) }- a+ N/ Y0 ]9 Q- ^9 z- f8 ^
pfd.nVersion = 1;
/ a4 s! ?- v8 }7 t6 qpfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
; t5 A- K4 A7 M3 p7 ^* Dpfd.iPixelType = PFD_TYPE_RGBA;* F, z% t; s0 i( L7 W
pfd.cColorBits = 16;; T/ t  P& u0 V: N
pfd.cDepthBits = 16;
0 q& m2 o3 Y4 W( |3 epfd.iLayerType = PFD_MAIN_PLANE;</P>3 a: V  R; [5 j: {; y- T# e/ J
<>//设置像素格式
6 n7 [8 G7 x! N% k; U& fiFormat=ChoosePixelFormat(hDC,&amp;pfd);
, v# ]  l5 I8 f, ]( F. |SetPixelFormat(hDC,iFormat,&amp;pfd);8 \6 V& h2 ]( ?! Z! L$ u
//创建渲染场景
8 `) d. ]1 ^% U/ k' LhRC=wglCreateContext(hDC);
- g( I/ H6 ]8 w( ]# E7 e" c0 Q//设置为当前渲染场景
7 e3 H8 j6 V  f' L1 j+ {, A0 C4 KwglMakeCurrent(hDC,hRC);</P>
; {8 T2 ]9 j* @! T- b<>glShadeModel(GL_SMOOTH);    //允许平滑着色" p; |) Z1 z5 u1 H/ f! R+ {
glClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>" R# w: A% b* X9 K
<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的4 G+ b# [+ ?% w3 O
RECT rect;
. V: X! L+ R) c5 m+ _1 _: Xint sw,sh;</P>9 Y1 Y" H& H9 J" s. T; I
<>GetClientRect(hWnd,&amp;rect);
' \4 Y& g' P/ o7 [+ m5 e) Dsw=rect.right-rect.left;6 F: T: I; g0 q
sh=rect.bottom-rect.top;</P>1 D6 Z( p( v/ n. j7 s
<>if(sw &gt; 0 &amp;&amp; sh &gt;0 )8 K0 c& i! K! w3 Q7 D) Q! ~
{
, c! f& J: i( g: Z! c6 R) b  SceneResizeViewport(sw,sh);1 {; B/ X7 @+ ~' _" K
}
- X/ j/ q4 ]- v! S
1 @+ B2 @. p: V' ?7 x- c}</P>
9 b! D: P$ i7 x+ b6 r2 f: ?& x# x<>//释放OpenGL和窗体对象" c' t  A# z+ v+ F5 E
void ReleaseOpenGL(HWND hWnd); Z( b7 ^# v, k+ k3 o6 _  ^$ L
{) W) k. ]! O. z/ E* |
wglMakeCurrent(NULL,NULL);5 i) Q) F1 D6 Z6 K5 S
wglDeleteContext(hRC);
* Z5 z4 ?5 p/ Y( v4 QReleaseDC(hWnd,hDC);
6 D2 B  i4 y( T' F  b7 X, j. v9 a/ T: g}</P>& b/ `1 @3 S; \' C, k
<>//更改分辩率
5 b- r  ^- n$ ~8 lbool ChangeResolution(int w,int h,int bitdepth,int fre)
" c1 U. s' G9 l/ i. q' o, |{
& k9 q* d0 Q) K3 g% KDEVMODE devMode;9 N; l" Z, {  x# |7 v
int modeSwitch;
8 a: M' S* L3 ~/ O! O$ bint closeMode=0;</P>9 I4 ~3 e" @" k; l8 L& {, ?- X
<>//枚举6 F9 G' `. ?; i3 l- a* M
EnumDisplaySettings(NULL,closeMode,&amp;devMode);</P>
4 H+ U: i* b9 j9 w" Y7 d" o<>//设置为当前所请求的
  Y! N* J" n  D0 _1 c2 \9 r1 Y  ~* CdevMode.dmBitsPerPel=bitdepth;
, @  D8 s+ Q$ e2 m" JdevMode.dmPelsHeight=h;
7 ?8 |6 M0 @' H+ f/ }6 PdevMode.dmPelsWidth =w;6 R7 \" v2 f/ |2 Y
devMode.dmDisplayFrequency=fre;</P>7 w7 C0 I0 h% {# |6 A5 P
<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>% W( N' B  {- T$ O
<>//更改; I6 ?# D" k7 e" d
modeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>
! _5 o* J/ W* b$ A) @<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL)
7 @1 R" n2 H$ L( J& J* n0 I# \9 D{
* {# M2 p7 s: A; E  return true;
! k; {! L; N" Z0 w; S4 ^8 J: M1 c}
) Q/ L. l9 n- J. Jelse
% s, C8 Q2 a! d* m% Y4 c# @' h2 q5 b# K{
( ^9 X: v6 ?- v& Q! V  return false;
$ }4 V. ]! V" r}
5 w& [, |9 d- J% W}</P>% J/ S. R: I0 a7 Q" K3 M" u% N
<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
) `8 m. k: D6 H) \# h{! B6 O8 X6 n, r9 m# G+ H9 C+ Z6 W+ k
RECT rect;
* n8 S3 `3 l8 [9 F: tint sw,sh;</P>
0 ^( o1 t3 W4 m4 ~" }) M<>switch(message)
  w( x) i2 K$ o  d$ E{$ j% D$ |7 j/ n" U) y1 e
case WM_SIZE:
/ ?+ h# T3 i! V0 h9 W  GetClientRect(hWnd,&amp;rect);
' p# A* q! J' b' H6 u- y2 y1 c& I  sw=rect.right-rect.left;
$ V  e- Q! m' i& }0 t% E  sh=rect.bottom-rect.top;</P>/ E+ K5 M& v9 i0 D2 U% e$ l
<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 )& i& B# N* l/ U+ v* C+ s
  {! p: `5 N7 l( A* A
   SceneResizeViewport(sw,sh);, Y1 r1 ]1 K. k; J( k9 h
  }
0 {9 A7 W( J5 Y, u( J9 U$ \  return 0;</P>! |. p* S5 r* K$ E
<P>case WM_CLOSE:
8 j9 D* p: Q) h  PostQuitMessage(0);
6 M: [" Z/ @2 U- \  return 0;
$ u: O" ~+ ?2 X8 Jcase WM_KEYDOWN:
' R9 j/ C' d  J% _. M$ H  switch(wParam)
+ J  j$ z6 L. e& b  {
( U1 i/ z1 j1 T+ Z# S' u  case VK_ESCAPE:. _( [  e# U" s* N5 x! d0 `
   PostMessage(hWnd,WM_CLOSE,0,0);
$ j3 ?, P9 U1 l2 ?* _   break;) v% N4 |' C, G* R: x
  }
9 G8 f- w3 M7 ?, k; I  return 0;$ c+ ~6 ~4 |* f3 ?% A& w# J
}</P>
2 m# z. z; }$ d<P>return DefWindowProc(hWnd,message,wParam,lParam);: n* `9 l3 C: c- z& X, @
}</P>
) x! l7 o2 m5 n) D- p. K<P>//创建一个窗口供OpenGL使用.
; I' Y7 ~$ o' ]/ y, n/ L5 w//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏# y2 u" [1 @: y
HWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)8 k( a! c0 m, o& y. Q
{
3 S5 i9 K- N/ l: r7 z( I6 aHWND hWnd;8 r: g* A1 M- m; _% ~
WNDCLASS wc;</P>
! }6 T- i7 W- i! D6 R  t  o<P>wc.style   = CS_OWNDC;
- u2 l1 s3 p% N: g& q7 j3 dwc.lpfnWndProc  = WndProc;3 F) {7 }$ R1 r# Z; Q2 t
wc.cbClsExtra  = 0;: M- l& ~  b3 u" B5 p4 i) z' `
wc.cbWndExtra  = 0;1 e8 u; `0 A) O" S
wc.hInstance  = hInst;4 w" [/ Z/ F/ _
wc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);4 m- |( T+ K( t% v' q, J
wc.hCursor   = LoadCursor(NULL,IDC_ARROW);
: L  h" ?2 F7 Y" lwc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
0 e: N8 @3 Q. }# ]wc.lpszMenuName  = NULL;# P1 R( l  R- P% a# j0 s1 B3 h
wc.lpszClassName = "OpenGL框架程序";$ S( Q9 h! V# C  w( L% g" x4 F7 u
% }0 H( K8 p: {8 t+ o5 q
//注册窗口类
1 D, S( m3 `. W2 @5 p3 ]RegisterClass(&amp;wc);</P>
6 {: U+ f( ~% m9 r% W3 x+ s<P>//全屏模式开
* s' b9 y- J' X9 b* v3 l; Rif(fullscreen)
: w# h3 ]' T( q+ b' w4 z3 O2 {  v{1 C6 J" D2 s7 s+ I
  //创建窗口
: l; i; T$ y! c* c1 ]6 x3 P  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,
" K. {4 }% A$ A7 S! u9 T3 ]   0,0,sw,sh,NULL,NULL,hInst,NULL);. {8 W/ c# O7 K( N" }3 r. G
}
- K4 ~+ t) u) Belse
) m% N+ P4 v7 ]! t8 e4 Y{
, K! Y2 D* N+ D/ g/ G* F9 e4 [5 T  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标
, @) G- d( X1 t! I# }$ w  int t,l;: Z8 Q0 W# {/ w
  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;
& F8 p3 X" o4 y! r# q) C  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>* p) ?8 W/ ~" B8 T: d: h
<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,4 Y5 n8 ^) h& F# m, e
   l,t,sw,sh,NULL,NULL,hInst,NULL);
2 k( |' g, L3 S; N  c  ]}</P>
5 `* S) [- `5 v# Y% ?" S7 _<P>//显示窗口
. _: P- N+ B/ b  Z" I6 x" k" hShowWindow(hWnd,SW_SHOW);
5 }2 I5 ]* G! m8 g* X//更新
7 s7 n, f# ]; _0 XUpdateWindow(hWnd);</P>
& g/ P- O% N* W" V/ N% E<P>if(fullscreen)
* Q9 X+ _" D2 n: T- Q$ i" ^{
, P6 J/ M, `. p3 D  //更改分辩率# X8 W7 A6 i0 Z: Q
  ChangeResolution(sw,sh,bit,60);3 E, L5 @/ R1 g! H  \
  //隐藏鼠标' W, |  X  E% B# s
  ShowCursor(false);6 W9 j9 c4 ]* j4 `9 H
}</P>; V9 K$ J; M. J8 t5 f
<P>//返回窗口句柄
  B. s& ]- U2 d$ O! K$ Ireturn hWnd;
" W' W( {: K( E; w}</P>
2 h, F6 Y2 ]  G! r<P>//入口函数
( }+ I- Z3 p% Pint WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
; I, w: t! Q, Y: c  }8 D+ N% d{# K( M6 Y- P% y! F9 j9 k
MSG msg;1 }5 s' s4 L. `, i8 h6 s% E' }6 M
HWND hWnd;* ?8 s. E) U5 O$ u0 H; }  G
bool fullscreen=false;</P>
+ V: P5 H8 q4 y8 ~  y<P>//创建窗口; E, u$ g9 {; I. G
hWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>/ S/ ^' A# }, s* C( x
<P>//初始化OpenGL设置
. s! H+ }  m9 n4 u- G( bInitOpenGL(hWnd);</P>
. U) }) E1 \6 f3 g2 [8 j<P>//进入循环* Q9 l. b- z8 V7 T5 _
while(1)* o3 r9 P7 }0 E" J
{
: A2 L- @6 a7 z$ k, y+ w2 Y  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))- n# r: J1 w4 u% P2 U: y
  {
+ _! t8 _  j, g  P! ?& _0 e   if(msg.message==WM_QUIT)
8 z. |: X7 b! P; g  S  z   {
" ?$ V/ v; J" J( o    break;
+ [, n9 p0 g# S4 D   }4 ~2 {! U7 i! O, n/ e
   else  @* K$ q/ f8 Y' f6 \
   {
, O! b2 @8 k2 ?! o! i    TranslateMessage(&amp;msg);
$ X% W" ]! r! F0 O  P0 X8 Y# c    DispatchMessage(&amp;msg);
' _- _) B: U; e0 _   }+ K' [3 h$ w% a2 ]+ ~1 ?" s
  }
& a( E1 `/ Z/ t  else
$ B% A: j3 ^. O7 b' z+ ?  {
$ b5 u' s3 k# r8 u, T# z  L    SceneShow();( d7 x- C) A4 ~  `) \* E
  }
- x4 d; R1 a; n  k}</P>
2 e" ~0 D# Y4 g<P>ReleaseOpenGL(hWnd);
6 x5 Q6 [" j- R! aDestroyWindow(hWnd);</P>
2 |# B5 p9 [7 k) _8 A. A<P>return 0;
  v/ t" K1 t, ~# f  o8 }}
7 n* p) D7 Q" P; B
# f' L1 `; g, p# w& V. g9 u
; k- X$ W* w" E& E$ f- n7 q6 Z8 Y</P>
0 t4 z$ o5 @9 c) W+ w. W/ C9 d2 D
4 E! O% D5 c! G, ^6 Y3 g
[此贴子已经被作者于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-22 06:09 , Processed in 0.655052 second(s), 54 queries .

回顶部