QQ登录

只需要一步,快速开始

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

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

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-11-19 11:10 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>目前只讨论2D,因为3D的基础应该是2D,掌握好了2D,才能更好的掌握3D,以下是我所用的代码.所有的绘制部分,我为了简单起见,全部放在一个叫Draw的函数里进行.
6 J" j( y  k" F
$ T  L& N7 V) I! m% I这是文件下载地址.
, M5 [2 ~" P8 A/ Z( W& q3 [) q, K" |</P>8 P, a0 L! a3 ~! r( a: O
<>
6 ~2 L" ~/ |% y7 a1 ~#include &lt;windows.h&gt; //一定要放在gl/gl.h之前,
4 C. ^! v4 ~# a% i, D6 C' Q. S#include &lt;gl/gl.h&gt;
3 h( i" L# }- |1 A- F#include &lt;math.h&gt;</P>
9 A5 f- ~; O/ D7 d" u/ d) p' Z<>#pragma comment(lib,"OpenGL32.lib")</P>
1 _) s4 S0 Q4 N3 `/ x3 `; N<>HGLRC hRC;. K% v( C# N  i, C; r: ?
HDC   hDC;</P>% ^' `3 e/ F- x! a# ]9 [* O
<>//回调函数3 }' s) q4 c) e3 L
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM ,LPARAM);</P>7 w+ Y4 H( J1 i  s- [0 Q3 a
<>//设置视见区大小
. Y4 `0 ^9 p& _# Z' q" P5 }void SceneResizeViewport(GLsizei w,GLsizei h)
6 i. e, M5 T7 J' n{3 K) L" R; Q7 c9 W
if(h==0)
0 X& F" f0 O/ u: [) W  h=1;
3 {9 {6 I6 R9 B/ P! z' c//设置视见区
, k% g3 }: l3 i7 QglViewport(0,0,w,h);</P>4 V/ h$ R# b% v$ F/ ]& m" H- z
<>//重置投影矩阵3 @# [1 \+ d  u) y- o  r2 B) X: z
glMatrixMode(GL_PROJECTION);
+ M+ n% J1 s7 S) w! vglLoadIdentity();</P>" s0 O6 w" y5 b8 z0 e+ O4 C
<>//设置修剪范围
, i9 {5 G$ O5 r, ~+ T, b4 t" QglOrtho(0,w,h,0,0,1);
) D4 c( {4 v* H; V' P% v8 `, W//重置模形矩阵0 |5 g2 l% f; q" F# C; z
glMatrixMode(GL_MODELVIEW);" Z" k" v+ o; J, u) ^
glLoadIdentity();7 P* u, Q# |. |
}</P>
  L. W, m' b* x4 n* x) {  ?<>//把绘制信息全放到一个函数里进行* ^6 s" a/ \  X5 ?
//#define GL_PI 3.1415f
7 O2 A  A: M  t! qvoid Draw()
; D4 d+ d& {8 V+ r1 S1 |7 t- {{
! L4 L2 I8 L1 J+ ZglPushMatrix();</P>/ D* D* N( [" {( s; l2 A; Q
<>  glBegin(GL_TRIANGLES);" `* P, I* D; G4 o
  glVertex2f(25.0f,0.0f);
  Q* a  W, {# H+ Q2 N  glVertex2f(0.0f,25.0f);6 T0 q1 H; _$ l  Q/ v. T8 A0 i) Q( y3 `
  glVertex2f(50.0f,25.0f);: j" Z. E5 q, L4 |9 m, u! N, P
    glEnd();</P>
5 I1 t5 _" _" ^, ?& p( t<>2 W3 p! g* x; q( g+ P( b
glPopMatrix();
0 B% ^: T  q% p7 ?3 i0 P$ N$ o}</P>7 A) L7 M  V# N9 C+ }, _. e9 D+ p$ u
<>//在这里进行渲染
/ P( n/ t1 E) P$ tvoid SceneShow()/ d& C5 I; h; L6 y) ^) d
{# h* g. H* f3 H+ |
//清除缓冲区及深度缓冲区
" i' i& [! A- uglClear(GL_COLOR_BUFFER_BIT );
% Y7 ^) ~0 p  Q6 _2 h, X) Q' c//重置所有的矩阵8 A2 q9 V, \. ^8 O
glLoadIdentity();
' h$ L+ B/ x, T* A; Z) n//以下绘制开始
2 n. `- y2 v" e6 gDraw();</P>
, w( T1 O5 {/ _4 j/ w8 d# p3 _# \<>//交换缓冲区,显示" ^2 i) q+ W/ h2 n  ^# y# _8 P
SwapBuffers(hDC);9 i* r  V9 Q  k0 I) l! I, ^* ?) l
}</P>
1 L, z, w( J& R; s1 y1 L. n2 _7 C<>//初始化OpenGL8 y8 A: ]) w# A. S( @# A8 I
void InitOpenGL(HWND hWnd)
# X+ x' }% o, {% }: j5 i1 I0 p{7 n; s7 R/ X0 p( W2 S- M
PIXELFORMATDESCRIPTOR pfd;$ _0 N5 I! V2 r2 s
int iFormat;</P>4 Y3 h# q) d/ a- d$ k7 m( q
<>//从窗口句柄取得设备句柄% w* l- j8 G4 Y
hDC=GetDC(hWnd);</P>! O9 v" F! y! s% w) A2 W! j! c
<>//以下设置像素格式) P) |) N4 s" V* L0 M; m; ~
ZeroMemory(&amp;pfd,sizeof(pfd));
6 q/ P; f' p9 {. x# d6 Wpfd.nSize  = sizeof(pfd);
( B/ j+ D, i( M/ a- N* @8 ?pfd.nVersion = 1;, N+ n) _- q! C7 U' ?% ?% d
pfd.dwFlags  = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;2 I- N7 l& T3 a9 D! p
pfd.iPixelType = PFD_TYPE_RGBA;
2 ^0 o  l7 ]7 z6 q9 `  Apfd.cColorBits = 16;
4 }7 u: n( t5 R  A6 R& D$ Bpfd.cDepthBits = 16;8 o: D- l7 }4 D" w6 Z
pfd.iLayerType = PFD_MAIN_PLANE;</P>6 f, x; Y6 Z; u& f7 d8 z: g& j8 S$ j
<>//设置像素格式7 k! P& p, G  Y* _" C5 {, Q
iFormat=ChoosePixelFormat(hDC,&amp;pfd);! r6 ~) R4 R% r+ `& J8 R+ X7 d
SetPixelFormat(hDC,iFormat,&amp;pfd);
! n6 v9 z) a5 A- ^//创建渲染场景- A" C" X! f" R+ K0 \
hRC=wglCreateContext(hDC);
, v& x: s4 s, H//设置为当前渲染场景
+ {/ w7 ?3 @6 G% CwglMakeCurrent(hDC,hRC);</P>$ c4 M: u6 E$ q. S7 d5 B
<>glShadeModel(GL_SMOOTH);    //允许平滑着色
* W$ p8 |/ k& m% \% ]% wglClearColor(0.0f,0.0f,0.0f,1.0f);  //设置清屏颜色</P>
, J4 Z" t9 b/ o* x<>//下面的代码没有确切的意思.是为了程序在运行初始能够显示而设立的$ e/ [& F0 T' E& A7 p
RECT rect;2 y$ x' j9 b3 X0 b' n) v: @
int sw,sh;</P>
4 \' `" t4 ]& t<>GetClientRect(hWnd,&amp;rect);/ J7 n& x; p& J0 r: ^
sw=rect.right-rect.left;
) r' v9 D  T2 tsh=rect.bottom-rect.top;</P>6 z( T5 \+ E0 i7 t
<>if(sw &gt; 0 &amp;&amp; sh &gt;0 )
$ [* I6 C4 C$ V0 |0 e2 L, G{
4 |( G; E- n2 z6 \  SceneResizeViewport(sw,sh);
7 S& c) p" G/ j}
& g- |2 x2 l6 }  T
+ E7 F7 z/ Y1 r" |}</P>& n9 A0 T, Q3 C2 s! ?% S6 Y
<>//释放OpenGL和窗体对象
! |' h0 W' y+ Svoid ReleaseOpenGL(HWND hWnd)2 |9 ~' T8 j+ x* b& e- V% s) r  U
{+ \7 m- V* B" j
wglMakeCurrent(NULL,NULL);
; \( r5 b! V% C5 Z: L+ CwglDeleteContext(hRC);
$ l5 Y! O4 g, P7 n9 k8 L7 uReleaseDC(hWnd,hDC);0 F" {" S$ S" d. r* u3 i4 {
}</P>/ ?' A2 A+ B5 _5 d4 L
<>//更改分辩率
+ Q6 p  d$ r3 T  e  c7 p* r7 l* p6 ubool ChangeResolution(int w,int h,int bitdepth,int fre)5 Y0 O& P3 ]) ^5 V
{
9 b4 H5 P1 ], G+ M8 w( DDEVMODE devMode;
: A& q$ J; _9 T1 X5 y1 Kint modeSwitch;# u' Q1 B) g! i( p( w5 B# N6 Q
int closeMode=0;</P>
4 M7 o' J7 N; c( K<>//枚举$ x) q2 @+ O8 ?+ N! J9 L2 D# t
EnumDisplaySettings(NULL,closeMode,&amp;devMode);</P>
' d& D; V2 J' ]% ?+ i. j2 ?<>//设置为当前所请求的
# h7 f- t4 h. F$ G. ^- z: H( a+ g$ BdevMode.dmBitsPerPel=bitdepth;
& l9 q' j4 a" [4 M" v, [) w/ |; O7 v( MdevMode.dmPelsHeight=h;
" s& M* N; g0 d) y0 U9 O+ ]devMode.dmPelsWidth =w;
7 \5 r: Z0 a8 udevMode.dmDisplayFrequency=fre;</P>
5 e3 U7 T% k9 Q. K! v<>devMode.dmFields=DM_BITSPERPEL | DM_PELSWIDTH |DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;</P>
3 C1 L8 \( V/ N* \<>//更改' @4 P  J$ l, z5 F
modeSwitch=ChangeDisplaySettings(&amp;devMode,CDS_FULLSCREEN);</P>
: c( g- p( U! }: d<>if(modeSwitch==DISP_CHANGE_SUCCESSFUL)
2 G- G' d& O- f  i9 o4 M: N0 I{6 m+ K5 C1 ]* B- A
  return true;
. U9 q. L: t& w' z}
" U! P3 t  z) m. H- M/ l, q. R. }else
  M: n) k4 M7 U/ P{
; P- z* T( S) c; z1 }3 b  return false;
4 s; U4 x$ t( {" s( u}" M, `5 h2 B  r
}</P>4 A# b4 s# l/ ~
<>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)# |8 ^' @# F/ j! x, `! {* f
{
7 z: X5 ~1 |2 KRECT rect;* ]3 I3 ]  h$ w% j% b3 s
int sw,sh;</P>
/ b5 w* L7 S: h0 X! F8 c% [( ]. p<>switch(message)4 ?; h( ?( {; @7 d9 e
{
6 N( w: S: S3 ]; x2 h( f* s' e+ s# rcase WM_SIZE:3 B7 J( h# N3 E- K: Z
  GetClientRect(hWnd,&amp;rect);+ z7 s; y9 ?! l$ W8 H5 e! i
  sw=rect.right-rect.left;
+ f( t0 Z" D6 g- C$ `  sh=rect.bottom-rect.top;</P>! U' P; O; j& f% l* b
<P>  if(sw &gt; 0 &amp;&amp; sh &gt;0 )
- e. D4 D  Y' a8 q3 C  {4 t2 @1 w. i- q1 F/ c& J' D2 J9 m
   SceneResizeViewport(sw,sh);
. e9 z- h: r$ r5 B7 \7 j2 t  }2 G8 [; [! `" ~& S- k5 W; \) C
  return 0;</P>" g, E4 J* ]; @& e, _- q% n
<P>case WM_CLOSE:  g# v% l# g6 {2 K: N
  PostQuitMessage(0);4 s) d1 D+ @' G
  return 0;! T( A2 f' ?% _* ~; Y8 ]1 s
case WM_KEYDOWN:
. x7 r" ^' h5 K0 g! F; p  switch(wParam)
( E# d' l# d& W7 b  {
+ B, z% B/ _! _  case VK_ESCAPE:7 B+ k2 H3 t( K5 [
   PostMessage(hWnd,WM_CLOSE,0,0);
  T0 n" ]6 n1 v4 Q   break;4 N1 c' B( e9 `% C, `8 \6 j5 _
  }
8 @7 \, M* e6 [+ ^  return 0;' N! {( c) J' P
}</P>/ {" v2 E( r. ?' R$ y
<P>return DefWindowProc(hWnd,message,wParam,lParam);/ w2 |7 _5 m* B' z; A; V
}</P>
6 B+ ~( {  P- b6 g' t<P>//创建一个窗口供OpenGL使用.
2 t# Z$ `& I8 n2 a//窗口标题,程序实例句柄,窗口宽,高,颜色位,是否全屏
/ w" Z- r6 }- UHWND CreateOpenGL(char*title,HINSTANCE hInst,int sw,int sh,int bit,bool fullscreen)( \) A) Z$ V6 P, I  E% m( F
{
% V; `" B5 K8 N- U/ a' P$ SHWND hWnd;- V) p' x' y# u- F; [
WNDCLASS wc;</P>
$ k  G, k/ Z: J3 U! ~<P>wc.style   = CS_OWNDC;
) J1 K2 s0 G9 l2 L/ J" [wc.lpfnWndProc  = WndProc;
) Z" B, J6 m1 i  ], D, A2 Fwc.cbClsExtra  = 0;$ n; D! e! t' v
wc.cbWndExtra  = 0;. k" u" j* ]" D) |  u  l
wc.hInstance  = hInst;
: O  K# M2 W2 X0 dwc.hIcon   = LoadIcon(NULL,IDI_APPLICATION);
6 d$ ~  {& c9 y5 x8 R2 n$ uwc.hCursor   = LoadCursor(NULL,IDC_ARROW);
' i! R( E: I6 c6 E0 Owc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);) j3 g) `) i8 z; O8 R3 |
wc.lpszMenuName  = NULL;1 b$ r1 f4 h  }# N% Z0 y  O
wc.lpszClassName = "OpenGL框架程序";
+ C3 B) k- I# ]* S! i9 T
% h5 {7 H. F& \. c//注册窗口类
# a" E/ e& V" R; S0 ], KRegisterClass(&amp;wc);</P>7 q) J( Y( L% L. N
<P>//全屏模式开
# \' \; J" f6 e! X" bif(fullscreen)* K2 _; O/ D+ B, Y6 H5 H  [
{
: I4 O6 S' Y( y3 c: J' s7 j  //创建窗口9 K4 ~- @6 l7 Y' f! S
  hWnd=CreateWindow("OpenGL框架程序",title,WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,9 ^& ]5 b7 o, u4 G8 x3 p9 f. m
   0,0,sw,sh,NULL,NULL,hInst,NULL);7 Y+ W' m1 t. O" V
}
% e- W' b7 O. K$ Celse
+ ?: S9 @4 I. A{
& S6 z: h* b) [& W& t* h) V  //让窗口保持在屏幕的正中间,计算左起,和上起 坐标, C8 i0 m  a4 o: g
  int t,l;( a$ b1 d& a9 I5 H4 X
  l=(GetSystemMetrics(SM_CXSCREEN)-sw)/2;
  c, [4 H( I% e8 a' d7 W  t=(GetSystemMetrics(SM_CYSCREEN)-sh)/2;</P>
9 {) i$ K# W5 p/ s<P>  hWnd=CreateWindow("OpenGL框架程序",title,WS_VISIBLE|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX,
8 u. ?0 H' ^3 o1 b: d( z/ \   l,t,sw,sh,NULL,NULL,hInst,NULL);
( j4 F- o: B& x; n& E6 P) m}</P>' _) K# W. v8 S4 I: f
<P>//显示窗口5 ^8 `- f6 [+ a2 Q
ShowWindow(hWnd,SW_SHOW);2 ~  r1 C3 M5 e& r, ~  g) t4 \
//更新+ O+ s0 Q# i+ J) r) P9 z
UpdateWindow(hWnd);</P>
' @# _9 J9 ~& ]<P>if(fullscreen)
. [' D5 [- |! D3 ?9 f{6 L6 J$ H) z) t* S
  //更改分辩率2 E( f7 w0 }0 n% x
  ChangeResolution(sw,sh,bit,60);& m) {3 U  Y, {, I  ^2 W7 d
  //隐藏鼠标
0 G1 m( w; B, Y2 \9 o+ g$ r9 {  ShowCursor(false);
8 b  \# n7 _" P+ h0 e4 H3 l5 {}</P>
* s' r; D  T2 a# ^8 t4 ]; [<P>//返回窗口句柄4 C# @9 T7 V: q# \
return hWnd;1 T. ~  h# ]! I. l1 @4 `0 l  a  g
}</P>7 o9 N. x# w) h7 p) S
<P>//入口函数
: Y$ y' z' V* |5 ~int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
+ T8 T. H5 g  f) F: k{+ a! n& `, `1 ^* B9 N
MSG msg;
! J6 C3 ?9 t8 {% f! SHWND hWnd;0 t+ k5 C( G+ E+ O- L
bool fullscreen=false;</P>: n( K2 x, X5 O
<P>//创建窗口
' r/ _! B7 e  ], L! PhWnd=CreateOpenGL("OpenGL 2D",hInst,640,480,16,fullscreen);</P>5 f' B+ [% u6 v
<P>//初始化OpenGL设置
* o( l, T- e8 v- sInitOpenGL(hWnd);</P>2 G) X! _2 D  z  D5 ~7 |" b! M. x
<P>//进入循环
9 a! e- g: \3 Y6 Owhile(1)8 ?" J( E, D3 y7 `
{( ]& t( p2 }( ]/ i7 O5 A" e6 H* r$ ^
  if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))
0 R$ D+ {  S1 p) N9 a; U# A  {% O$ N" k7 q" }, o0 \9 g6 L( N2 I
   if(msg.message==WM_QUIT)
) j, A9 ~/ [) {8 u  L3 Z" s, _  C   {7 Z# Q# r# t9 [6 s: `( G
    break;' ]8 n+ K+ c# e9 V1 U. D' w
   }
! H0 m4 b7 k5 ~% ?   else
9 I7 [) i8 U! z6 }   {
& [7 _6 a- D5 p- l+ a    TranslateMessage(&amp;msg);
$ ?5 [! g; q0 \, N1 W# w3 Q    DispatchMessage(&amp;msg);& ?0 O9 \8 g5 E9 S4 ]7 a; ^$ }
   }
5 J! `6 u5 n! r: J5 X* [  }1 ~+ C5 N9 |; d8 Y' b
  else- d: ^: s- t* u
  {. D/ d: ?5 f# A" j' O* |2 h
    SceneShow();
4 s/ K2 o  P4 s  D2 I  }
! [. a* n8 ]4 x4 e+ D}</P>' P# E( v* H9 q1 u: h+ n
<P>ReleaseOpenGL(hWnd);
" _% n9 e$ F9 D3 ^8 X6 I& @DestroyWindow(hWnd);</P>
+ h% V# x: o0 A<P>return 0;4 ?+ E! E* J" `8 j9 E% T( q
}2 `& z7 ]/ n  d- @4 X
% u, C8 y" P5 h  W

$ r* p" h; {% z" t5 M! q- w</P>9 W/ ?+ H0 O. p8 |2 Z$ ~0 I

' A' B- k" T4 V0 ^: H
[此贴子已经被作者于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-27 13:03 , Processed in 0.395055 second(s), 55 queries .

回顶部