QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-11-19 11:10 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.
  b, u! j, z8 S. |
8 g* @% p4 k$ |& n这是文件下载地址.
. g0 D4 b% ^8 r; \* ~</P>6 U5 w5 _2 G8 [' x3 o. y
<>
3 |- o8 c9 @  p2 L) {#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,$ T' @1 W0 p( x% c
#include &lt;gl/gl.h&gt;$ P7 A9 f( Q( G- h4 b# {! o2 U
#include &lt;math.h&gt;</P>/ p6 k, l/ r; |+ j' @1 T1 Y) n# a
<>#pragma comment(lib,"OpenGL32.lib")</P>
0 X0 l, l- C1 C1 v<>HGLRC hRC;) @" K5 b/ z/ r9 o; {/ k
HDC   hDC;</P>! a+ a% H% g- V$ B9 A, y
<>//回调函数
* ^$ u/ W5 E# e  s0 {/ a; r) O* s$ NLRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>8 X8 ~1 x5 v/ [- W% ~# r
<>//设置视见区大小8 y, Z0 s3 f/ d* t! ^1 A
void SceneResizeViewport(GLsizei w,GLsizei h)+ m9 A% U2 P/ y7 O/ s
{5 q* ?1 V  n/ X& a0 }
if(h==0)
( l  v0 X' L6 V' R0 Q) m  h=1;
4 ^/ x) ^. q& F) F5 X$ ?- F8 Z//设置视见区" M; f+ H& y6 c7 K' I: f; [
glViewport(0,0,w,h);</P>
6 h3 ~" s2 F% D$ j' X<>//重置投影矩阵  p: L( u5 k6 d, |) N9 q( Q- q
glMatrixMode(GL_PROJECTION);
' i' [4 e9 l. a8 \6 t6 wglLoadIdentity();</P>3 h6 I- D# Y" S! H/ h
<>//设置修剪范围
" @7 F/ T' L6 Y( X) X0 O2 o: w- bglOrtho(0,w,h,0,0,1);  C0 C0 t$ W, p( |
//重置模形矩阵  z5 R$ I9 m% `
glMatrixMode(GL_MODELVIEW);- @) v1 t4 H/ _+ o
glLoadIdentity();
1 P0 B6 B" h9 C0 v) m8 k}</P>
* \# W& Y6 c/ f<>//把绘制信息全放到一个函数里进行
: s9 l5 F( S' g0 `0 h( }, d! C: }9 W//#define GL_PI 3.1415f) \+ m) j* k7 W8 a  d
void Draw()7 W$ q) ?$ B/ Y
{
% t! A2 u6 \, DglPushMatrix();</P>
! ^. L4 U$ m4 }& E<>  glBegin(GL_TRIANGLES);5 _* y* i2 J" r4 N; @( g! y
  glVertex2f(25.0f,0.0f);
+ ^& ~  C  S" S5 e- {  glVertex2f(0.0f,25.0f);$ {: q# Q# v" `1 h6 ?
  glVertex2f(50.0f,25.0f);( M: a7 r5 U* x6 I
    glEnd();</P>/ c6 \$ _, o0 N  \' F
<>
, t; f- F+ J6 N$ V9 ?glPopMatrix();
9 Y+ {0 o% X) Z7 A( ^}</P>. K# _; }3 x* L4 ~2 |
<>//在这里进行渲染4 O) w6 V& \. Z( B$ }4 E, R
void SceneShow()3 A; x1 J% ]  ~+ R$ r
{, n0 o; m% R9 S+ k
//清除缓冲区及深度缓冲区
7 s! H: z8 j7 ~2 u& n  J% YglClear(GL_COLOR_BUFFER_BIT );! k* K$ P6 X  G
//重置所有的矩阵, B* j' u' j5 h
glLoadIdentity();7 L! T- N6 V! s: D9 ~, P
//以下绘制开始
/ ]. }  X: L) ADraw();</P>
0 q3 w, A$ A3 U9 i0 d( O<>//交换缓冲区,显示
. y4 `: M, H. S9 oSwapBuffers(hDC);
$ Y" v1 S4 |7 r/ S: m}</P>: y. M# s5 r% I* v
<>//初始化OpenGL
1 e+ r) T  S& @3 A1 V3 n* M# bvoid InitOpenGL(HWND hWnd)
0 a$ g) |' W6 E3 [$ M% m{
) m5 v+ m& d2 Q0 wPIXELFORMATDESCRIPTOR pfd;+ R. H  |' O% z9 |, P( C( l- c
int iFormat;</P># l$ B3 Q, v% b7 f* g
<>//从窗口句柄取得设备句柄
+ H+ l9 v; m3 S3 s0 f. n$ GhDC=GetDC(hWnd);</P>
5 t0 f5 S5 A* g4 F<>//以下设置像素格式% D. s+ Q1 C- c# n; }
ZeroMemory(&amp;pfd,sizeof(pfd));3 F" p( u: ^8 p8 r* m
pfd.nSize  = sizeof(pfd);
( r# Y% Z+ M# S! h9 d* |, P9 Mpfd.nVersion = 1;
/ Z  M8 y! \+ [7 T( [3 B4 Opfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
$ L7 [4 H: e* Rpfd.iPixelType = PFD_TYPE_RGBA;0 L0 ]! p! u9 O
pfd.cColorBits = 16;
3 f: p) q, ^! I* l! I/ Cpfd.cDepthBits = 16;- O: c" V' _9 I  j4 v9 {! T7 E
pfd.iLayerType = PFD_MAIN_PLANE;</P>. A9 d( f: y9 Z3 W
<>//设置像素格式
9 d! \4 Z5 Q; {$ EiFormat=ChoosePixelFormat(hDC,&amp;pfd);$ c% ?) o+ e: s$ c
SetPixelFormat(hDC,iFormat,&amp;pfd);' R9 J) W. P+ G
//创建渲染场景* q. y; f; l( y0 ~7 {
hRC=wglCreateContext(hDC);+ s( ^! _/ g$ s! o& Z8 M) ~0 C
//设置为当前渲染场景8 `# E# Z- n2 _$ ?8 m+ p
wglMakeCurrent(hDC,hRC);</P>
3 [, H  j4 L% o, z# }1 _0 F; a<>glShadeModel(GL_SMOOTH);    //允许平滑着色5 c) {; i& _& w8 c3 _
glClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>5 i7 s3 t3 ?5 T6 V
<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的
' z: @: y0 i4 ^! BRECT rect;
) v$ S! Y4 I7 _! xint sw,sh;</P>
% [& d) ?9 l. W7 S0 Q<>GetClientRect(hWnd,&amp;rect);4 @4 |8 n* F$ M/ \& D- l4 ^
sw=rect.right-rect.left;
% R) D% |0 G8 h& Z2 d  C9 z9 ush=rect.bottom-rect.top;</P>
8 U1 @0 Q$ ?2 u3 U$ f9 q* `<>if(sw &gt; 0 &amp;&amp; sh &gt;0 ): C  ~: ^4 a: |5 O1 @
{
! q6 ?! @* C3 s; E$ }8 O) C% {  SceneResizeViewport(sw,sh);' w) m  _( u* P! ]& V1 i$ ^8 f  L$ X; U
}
; @! S' P  T1 H$ _# I' @5 }5 v( L+ N6 c
}</P>
: T. y  M8 }2 T' Y! @4 I<>//释放OpenGL和窗体对象
. t  X' |6 v4 H/ _, Z: c2 ^void ReleaseOpenGL(HWND hWnd)+ A* f& o/ X) n2 l* ?* J7 @
{
9 t; H4 L( ?2 G9 E- ]# awglMakeCurrent(NULL,NULL);* @+ E% Z! f. ?1 n0 u- {4 e
wglDeleteContext(hRC);
0 v1 T& g& n" }4 n! EReleaseDC(hWnd,hDC);( L6 F2 x. o5 M' ^1 ]2 y# J( X. k
}</P>& _; e- V8 D: S. |
<>//更改分辩率
& l; v0 s5 k% P% c* R0 I6 ^bool ChangeResolution(int w,int h,int bitdepth,int fre)
. w5 u( G9 d$ a{- G% b6 M. b- x2 k- ~; W/ D' i9 y
DEVMODE devMode;$ C: a2 m: J7 s2 u4 P
int modeSwitch;1 A$ ]3 u* _1 }% Y( B
int closeMode=0;</P>$ b7 ~) s: P! k
<>//枚举
. N7 a# S5 o1 o. D* XEnumDisplaySettings(NULL,closeMode,&amp;devMode);</P>
- l& u+ i! g2 q- I: E<>//设置为当前所请求的
4 V, X# j  U' \4 m3 l# j* W- G  E, Z& OdevMode.dmBitsPerPel=bitdepth;! y, k" _! M. y* D; Y8 s
devMode.dmPelsHeight=h;
" N) }/ K7 a6 B# d* u4 ddevMode.dmPelsWidth =w;
0 ^/ p5 v& f. y/ K$ Y$ [  [4 X6 ^% adevMode.dmDisplayFrequency=fre;</P>+ N9 A& N# W* V' e0 c7 Q0 R
<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>
4 v  E3 I, H' g7 |<>//更改
6 A1 N9 A6 E1 L: _* ]modeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>+ @7 I2 `/ G' S" L" k! a# L. @4 Z
<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL)% A" }; y# v, Q4 x9 N$ n6 S
{
9 x% F) F! _+ `; |9 y$ o% q  return true;. J+ N" J0 O: |' `* U( H. H
}
: ^: `6 [7 U' |1 y( h' ?else
  M8 y4 L6 o( R: Z! }9 a{
+ `2 U; r# l7 F  return false;( M, b7 G. B! a) Q3 b8 M
}
8 @% a, |" j2 y" Q2 y# C}</P>
, v5 ^$ r# {2 h<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)( V* R  o2 `$ J0 j7 F
{
& @4 u5 n# ~( B  u" l6 RRECT rect;- h; q( t9 F4 w! a' v
int sw,sh;</P>8 r$ A5 l+ N4 [! P7 O, v" @" [
<>switch(message)5 |( h: r3 L, H
{* [% f0 o) S4 r
case WM_SIZE:& w6 ^: w4 ^9 p- A% p2 |
  GetClientRect(hWnd,&amp;rect);6 S# g/ I; H+ j
  sw=rect.right-rect.left;' O- n( w$ Z& M" X. |% N2 [$ R
  sh=rect.bottom-rect.top;</P>
7 K( w( u, u# s/ {4 e<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 )7 X& B' p7 h  u$ D% T7 \- i
  {/ j# Y2 x. M+ ]# z  T5 N# Y7 K+ e! }
   SceneResizeViewport(sw,sh);
2 y! M- `2 p4 }9 }8 j  }6 B/ h$ S7 D; t1 s# [' T
  return 0;</P>& c; h# r1 K& n3 C5 v; i: A
<P>case WM_CLOSE:/ [- P' I/ X9 v/ w1 }7 t  c
  PostQuitMessage(0);
- L  r/ c( n1 G7 q8 i8 A  return 0;/ x9 _. U$ F# Q9 k/ l- d
case WM_KEYDOWN:4 j, q6 C7 ]: C4 @3 |
  switch(wParam)2 x' w$ ^9 ~7 j# s( V
  {
* c1 Z+ z3 V& A- ?% X# {  case VK_ESCAPE:  }9 `6 S- ?8 i# {
   PostMessage(hWnd,WM_CLOSE,0,0);
3 H7 ]3 o& [8 C$ x2 ^2 H   break;
" Y2 |, t2 X: c1 S: c6 ~" W  }, p! i5 y! J- X
  return 0;. b/ o0 y- W, w# A3 y7 c
}</P>
; F2 y, J: V1 v7 L) ^<P>return DefWindowProc(hWnd,message,wParam,lParam);- F# j4 ^8 F' x# d
}</P>
8 n+ N4 n" ?3 h<P>//创建一个窗口供OpenGL使用.6 m4 c# ?: B. ]
//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏6 ^0 Y2 E6 M3 F: ^
HWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)
$ F+ K& @% ]$ a- |5 D$ T) O: Q{
9 w# f- R# P0 t0 t  F* OHWND hWnd;
& _# e/ d' r0 WWNDCLASS wc;</P>
7 z4 C3 O: Q$ _& I# j( [<P>wc.style   = CS_OWNDC;; ?' F! b4 Q" x( p1 ~% @
wc.lpfnWndProc  = WndProc;, N; Z' i- K  L9 g! B
wc.cbClsExtra  = 0;4 b+ C% Q) _' M
wc.cbWndExtra  = 0;
& L/ E2 \" f! A% o9 F7 D) U8 v7 xwc.hInstance  = hInst;/ g4 i  A) S5 J3 `. q( ~) |
wc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);
, g, i) c4 r' q: hwc.hCursor   = LoadCursor(NULL,IDC_ARROW);
: `- N; S0 `+ q3 d/ `) C# Hwc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);. q" O) `, w; M" K) D/ I1 G+ q
wc.lpszMenuName  = NULL;( W6 H0 v* P  N& y' K5 ]" ]
wc.lpszClassName = "OpenGL框架程序";
! {; M8 T0 M0 S1 Y, ?) [7 z4 x/ V& _
//注册窗口类2 n! @) O; L7 u+ R
RegisterClass(&amp;wc);</P>
! i0 z' P* l6 j, v<P>//全屏模式开; g; Y6 {, d' Q- m% e2 m  Q% O
if(fullscreen)$ E" d4 _: b! P/ B. H" J+ s
{
' S8 j, W+ j3 e* ^4 w/ m, k  //创建窗口: n+ k  J5 y' u# J+ B  t
  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,
, x$ w/ q* g! u5 O- M( a& x   0,0,sw,sh,NULL,NULL,hInst,NULL);
5 Z# @$ F% s& S: x& a( x}
9 N4 x' b3 d. d5 Xelse
/ o/ w& ^3 K1 p/ C& r{3 S$ W7 z8 G3 v  \
  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标
' s$ E9 j3 N4 Z  int t,l;8 W. _) r" ^# R% J, O+ A# ~- M
  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;
1 _5 q2 F: G  W4 X  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>  u. j& y8 c8 W# }
<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,
5 ~5 J+ ]! z7 \2 \4 K3 R   l,t,sw,sh,NULL,NULL,hInst,NULL);
! T% T& B7 V* \4 R. y! d% L( `}</P>
7 B" J6 [% ^$ D2 W9 q% g3 m# c3 ]<P>//显示窗口
+ y; H+ c! b8 {1 i. |ShowWindow(hWnd,SW_SHOW);
) M& t' g; [' |. {$ I//更新
! d0 ?& _! k+ Z* z# vUpdateWindow(hWnd);</P>
$ C9 R( v+ Y/ V+ i+ X  S<P>if(fullscreen)3 |5 Z" H4 ^5 C! e$ g+ I, |
{) y0 g  G# S: e4 Z5 K  t
  //更改分辩率! q, e+ G! e  ]* o% Z; T4 y* R
  ChangeResolution(sw,sh,bit,60);
2 Q! b7 n, b6 |4 C6 N: m, j  //隐藏鼠标
4 l9 O% @* F/ {7 I0 @1 M  ShowCursor(false);
, ^: p" V; O: _}</P>  |7 H5 r; s" J
<P>//返回窗口句柄
1 A9 D0 [/ u, A7 _5 v. m$ x7 y, areturn hWnd;5 l$ c7 d5 v. q  v" v! `6 b7 I
}</P>" F7 o  ~9 i" J4 ?
<P>//入口函数1 ]; n4 B% K0 d0 i# g
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)7 ^6 [! w9 w7 i  v( v- |
{
, V! o8 `% ^( u0 q! WMSG msg;
, t6 ^' F0 a; K) P* ^- uHWND hWnd;
. y! U. h% a8 V6 xbool fullscreen=false;</P>
: A& B. o- S. E/ M<P>//创建窗口
1 Y  W% w4 x# jhWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>
7 A3 ^4 D) y+ O) R7 z& b<P>//初始化OpenGL设置
/ ^. l( O* Q- K+ PInitOpenGL(hWnd);</P>( l- m$ [% z+ \7 y( k( ?/ Z' \
<P>//进入循环
" l8 T3 l% Y: G' j* q4 Zwhile(1)
) z8 v6 m5 b. ^; z4 {! P{
5 [) i3 s3 h( U  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))
: K) W% O, D) L  T7 Z  {
8 Q3 Q; C6 y8 H1 i7 H/ D   if(msg.message==WM_QUIT)% \5 l! v9 e, i+ d1 n
   {
. U) J) I% m) x" i% J    break;4 v& b% `2 d) E% B
   }: h( w1 R1 {8 y$ v7 @/ Y
   else
8 e1 g/ E' M8 Y* B9 R  n; z1 o0 _   {, T# l# h: C  A1 d
    TranslateMessage(&amp;msg);
- q6 q+ a7 M! q; Y    DispatchMessage(&amp;msg);, M, ?3 |/ }, e
   }
7 h; H6 L, x  N2 X8 Q8 q) c9 O  }
5 t3 h$ o- b- I! N+ z5 [6 ?  else
% x% a* {& u9 e+ x# z' z4 j  {$ N) n, N; \2 c, h. r4 |
    SceneShow();8 @  k1 m  P" G4 X$ ]; F
  }
# ^4 |5 H. S. K}</P>
5 h4 L; r! @! ^. ]% v$ ^<P>ReleaseOpenGL(hWnd);
+ v  |( c# h$ d4 p; hDestroyWindow(hWnd);</P>4 u+ s' s) S  }# F+ ~5 f
<P>return 0;
' l8 ?: j8 W) g4 H* u/ B3 T- m}5 s7 F, X5 ~1 s) s0 K
7 a0 Y- K% v6 ^
5 h2 B! F( e$ q3 S; z4 }! E, @
</P>
' r; F# n# R4 l3 v, i$ _2 Q* y9 w4 z5 ?8 J, C
[此贴子已经被作者于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 09:55 , Processed in 0.457842 second(s), 55 queries .

回顶部