分享
 
 
 

入门系列--OpenGL最简单的入门

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

现在是1:00了,在睡觉之前先写一点东西...想了一下,就简单的OpenGL入门介绍吧。在Windows下的用户都知道Direct X系列驱动吧,OpenGL也是与这种东西Direct3D作用很一样的。关于DirectX与OpenGL的详细介绍,文章太多了,国内有一篇文章介绍得很详细,而且历史脉络也说得很清楚,推荐看一下:http://www.zkxt.com/D3D_OPENGL_1.htm。作为一个程序员,单是了解这些还是不够的,不过,不看这篇文章的话更是不行,先看以上这篇文章再说吧。

OpenGL全称"开放式图形库",是由SGI公司开发的低层三维图形API,目前在图形开发领域已经成为工业标准。作为一个标准,在其官方网站可以查看其标准:http://www.opengl.org/,主要是由非赢利组织ARB来维护,主要是C/C++库的实现,其他的实现现在已经有Java的支持http://www.opengl.org/resources/java/ (如:GL4Java)。不过,目前主要还是用于C/C++。在一些游戏产商的强烈要求下,微软公司也在Windows95以上的平台都实现了自己的操作系统的OpenGL库支持,SGI公司也有自己的一套实现,不过是作为软件来实现的,不支持硬件加速。

以下就简单的介绍一下入门知识:

1、环境的选择:

由于是国内很多用户都是Windows操作系统,现在我简单的介绍在Dev-C++中怎样编译自己的第一个OpenGL程序。Dev-C++是基于MinGW来开发的,关于这些信息请到网上查找吧。下载信息请看我的其他Blog( ftp://ftp.jaist.ac.jp )里为你提供的一个高速开源下载地址,登陆服务器后,在sourceforge系列里查找Dev-cpp文件夹,然后再下载就OK了。

好了,打开Dev-C++,选择菜单:文件/新建/工程/MultiMedia,选择OpenGL,c++工程,然后确定就okay了。默认会替你创建一个样例的文件。你现在也可以编译运行它,F9快捷键(或者使用菜单:运行/编译运行也行)。好了,等待,一个不停选择的三角形在动了吧。

等等,就这么简单的话,我肯定要被人骂死的,尤其是那些不熟悉Win32API函数的读者,根本就看不懂代码是在做什么。现在我来把这些简单化。

2、简单化的学习:

找到代码:

else

{

/* OpenGL animation code goes here */

glClearColor (0.0f, 0.0f, 0.0f, 0.0f); //这一行开始

....

SwapBuffers (hDC);

theta += 1.0f; //到这一行

Sleep (1);

}

好的,主要的内容就在这里了,现在我们把这部分OpenGL绘图的内容提到一个函数drawGrapchics中,并放到其他文件中(这样的话,我们在学习中就可以简单的不管这个main.cpp文件了)。

好了,现在我们创建一个新的文件simple.hpp吧,在左边的工程管理里,右击,然后新建单元,把这个文件保存为simple.hpp,把上面的相关代码剪切下来:

float theta=1.0f; //注意在原来的main.cpp的相关的这行东西,也剪切出来(这个主要是旋转控制角度的)

void drawGraphics(HDC& hDC){

glClearColor (0.0f, 0.0f, 0.0f, 0.0f);

......

SwapBuffers (hDC); //调用交换缓冲数据,无论哪中实现,这个最后都是要调用的。

theta -= 1.0;//控制角度,旋转角度的大小

}

main.cpp就变为:

...

#include "simple.hpp" //添加头文件

....

else

{

/* OpenGL animation code goes here */

drawGraphics(hDC); //简化为函数操作

Sleep (1);

}

...

以后当你要练习其他的话,呵呵,就添加其他的,然后把#include "simple.hpp"改为自己测试的文件就行了,其他的都不用改。

3、大量的练习与学习:

对于程序员来说,没有API函数查找是最为痛苦的事情了,在这方面Java做的最好。Dev-C++提供了Win32API和OpenGL API文档的参考手册下载,请到我上面提到的那个下载Dev-C++里面下载。

最好的入门教材莫过于OpenGL的RedBook了http://www.opengl.org/documentation/red_book_1.0/ 官方网站提供了这个版本的1.1的免费下载,其他版本的话自己出钱好了....~~。注意,学习过程中,不要看其他的框架实现,你主要是看OpenGL的主要主要函数实现,由于RedBook使用的是aux的创建窗口的方法,所以这部分东西我们可以省略,主要就学习其中的gl的实现就OK了。

其次,再一步就是看NeHe的教程,现在国内有中文版下载,上Google搜索下载就行了。

其他的就等着学习,自己写代码,经验学习了....

4、核对一下,完整的代码(以免误解了我的说解~~~):

首先是main.cpp:

/**************************

* Includes

*

**************************/

#include <windows.h>

#include <gl/gl.h>

#include "simple.hpp"

//::void drawGraphics(HDC&);使用opengl

/**************************

* Function Declarations

*

**************************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,

WPARAM wParam, LPARAM lParam);

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

/**************************

* WinMain

*

**************************/

int WINAPI WinMain (HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int iCmdShow)

{

WNDCLASS wc;

HWND hWnd;

HDC hDC;

HGLRC hRC;

MSG msg;

BOOL bQuit = FALSE;

/* register window class */

wc.style = CS_OWNDC;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor (NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName = "GLSample";

RegisterClass (&wc);

/* create main window */

hWnd = CreateWindow (

"GLSample", "OpenGL Sample",

WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,

0, 0, 256, 256,

NULL, NULL, hInstance, NULL);

/* enable OpenGL for the window */

EnableOpenGL (hWnd, &hDC, &hRC);

/* program main loop */

while (!bQuit)

{

/* check for messages */

if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))

{

/* handle or dispatch messages */

if (msg.message == WM_QUIT)

{

bQuit = TRUE;

}

else

{

TranslateMessage (&msg);

DispatchMessage (&msg);

}

}

else

{

/* OpenGL animation code goes here */

drawGraphics(hDC);

Sleep (2);

}

}

/* shutdown OpenGL */

DisableOpenGL (hWnd, hDC, hRC);

/* destroy the window explicitly */

DestroyWindow (hWnd);

return msg.wParam;

}

/********************

* Window Procedure

*

********************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,

WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_CREATE:

return 0;

case WM_CLOSE:

PostQuitMessage (0);

return 0;

case WM_DESTROY:

return 0;

case WM_KEYDOWN:

switch (wParam)

{

case VK_ESCAPE:

PostQuitMessage(0);

return 0;

}

return 0;

default:

return DefWindowProc (hWnd, message, wParam, lParam);

}

}

/*******************

* Enable OpenGL

*

*******************/

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)

{

PIXELFORMATDESCRIPTOR pfd;

int iFormat;

/* get the device context (DC) */

*hDC = GetDC (hWnd);

/* set the pixel format for the DC */

ZeroMemory (&pfd, sizeof (pfd));

pfd.nSize = sizeof (pfd);

pfd.nVersion = 1;

pfd.dwFlags = PFD_DRAW_TO_WINDOW |

PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24;

pfd.cDepthBits = 16;

pfd.iLayerType = PFD_MAIN_PLANE;

iFormat = ChoosePixelFormat (*hDC, &pfd);

SetPixelFormat (*hDC, iFormat, &pfd);

/* create and enable the render context (RC) */

*hRC = wglCreateContext( *hDC );

wglMakeCurrent( *hDC, *hRC );

}

/******************

* Disable OpenGL

*

******************/

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)

{

wglMakeCurrent (NULL, NULL);

wglDeleteContext (hRC);

ReleaseDC (hWnd, hDC);

}

其次是simple.hpp:

//simple.hpp

float theta=1.0f;

void drawGraphics(HDC& hDC){

glClear (GL_COLOR_BUFFER_BIT);

glPushMatrix ();

glRotatef (theta, 0.0f, 0.0f, 1.0f);

glBegin (GL_TRIANGLES);

glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (0.0f, 1.0f);

glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.87f, -0.5f);

glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.87f, -0.5f);

glEnd ();

glPopMatrix ();

SwapBuffers (hDC);

theta -= 1.0;

}

5、好了,简单的怎样介绍入门的就到这里了,想学习OpenGL的哥们,还有MM,剩下的功夫到你自己了,努力去看,努力去写吧...不要相信自己的眼力,不要相信自己理解了,实践才是真理:-)

Note:oh,写了40多分钟....郁闷!要睡觉了~~~各位朋友,有问题的话留言给我;或者看我的联系方法,发E-mail给我也行。先下线睡觉,晚安!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有