⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial_01.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><!-- 这篇文章由Dancingwind翻译,作者的联系方式zhouwei02@mails.tsinghua.edu.cn --><title>NeHe OpenGL教程第一课,DancingWind翻译</title>




<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
A:link {COLOR: #ccaaff; TEXT-DECORATION: none}
A:visited {COLOR: #ccaaff; TEXT-DECORATION: none}
A:active {COLOR: #ccaaff; TEXT-DECORATION: none}
A:hover {COLOR: #ffccaa; TEXT-DECORATION: none}
</style></head><body bgcolor="#000000" text="#ffffff"><br><br>

<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td height="130" width="326"><img src="Tutorial_01_files/logo.png" height="130" width="326"></td>
    <td align="center" valign="middle" width="75%"><font color="#ffccaa" size="+3"><b><i>第01课</i></b></font></td>
  </tr></tbody></table>
  
<!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/tr.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<!-- 中部-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
  	<!-- 中部左边框-->
    <td background="Tutorial_01_files/l.gif"><img src="Tutorial_01_files/l.gif" height="28" width="28"></td>
	<!-- 中部文字部分-->
    <td valign="top" width="100%">
	<table border="0" width="100%">
          <tbody><tr>
            <td width="32%"><img src="Tutorial_01_files/lesson01.jpg" height="180" width="240"></td>
            <td width="68%"><p><font class="head">创建一个OpenGL窗口:</font></p>
              <p><font size="3">在这个教程里,我将教你在Windows环境中创建OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架.<br>
                <br>
                理解OpenGL如何工作非常重要,你可以在教程的末尾下载源程序,但我强烈建议你至少读一遍教程,然后再开始编程. </font></p></td>
          </tr>
     </tbody></table>
      </td>
	<!-- 中部右边框-->
    <td background="Tutorial_01_files/r.gif"><img src="Tutorial_01_files/r.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<!-- 下边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
  
  <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_01_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_01_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_01_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_01_files/l.png"><img src="Tutorial_01_files/l.png"></td>
    <td valign="top" width="100%">欢迎来到我的 OpenGL教程。我是个对 OpenGL充满激情的普通男孩! 我第一次听说 OpenGL是 
      3Dfx 发布 Voodoo1 卡的 OpenGL硬件加速驱动的时候。我立刻意识到 OpenGL是那种必须学习的东西。不幸的是当时很难从书本或网络上找到关于 
      OpenGL的讯息。我花了 N 个 小时来调试自己书写的代码,甚至在 IRC和 EMail 上花更多的时间来恳求别人帮忙。但我发现那 些懂得 OpenGL 
      高手们保留了他们的精华,对共享知识也不感兴趣。实在让人灰心 ! <br>
      我创建这个网站的目的是为了帮助那些对 OpenGL有兴趣却又需要帮助的人。在我的每个教程中,我都会尽可能详细的来解释每一行代码的作用。我会努力让我的代码更简单(您无需学习 
      MFC代码)!就算您是个VC 、OPENGL的绝对新手也应该可以读通代码,并清楚的知道发生了什么。我的站点只是许多提供 OpenGL教程的站点中的一个。如果您是 
      OpenGL的高级程序员的话,我的站点可能太简单了,但如果您才开始的话,我想这个站点会教会您许多东西!
      <p>教
程的这一节在2000年一月彻底重写了一遍。将会教您如何设置一个 OpenGL窗口。它可以只是一个窗口或是全屏幕的、可以任意
大小、任意色彩深度。此处的代码很稳定且很强大,您可以在您所有的OpenGL项目中使用。我所有的教程都将基于此节的代码!所有的错误都有被报告。所以
应该没有内存泄漏,代码也很容易阅读和修改。感谢Fredric Echols对代码所做的修改!</p>
      <p>现在就让我们直接从代码开始吧。第一件事是打开VC然后创建一个新工程。如果您不知道如何创建的话,您也许不该学习OpenGL,而应该先学学VC。某些版本的VC需要将 
        bool 改成 BOOL , true 改成 TRUE , false 改成 FALSE ,请自行修改。</p>
      <p>在您创建一个新的Win32程序(不是console控制台程序)后,您还需要链接OpenGL库文件。在VC中操作如下:Project-&gt; 
        Settings,然后单击LINK标签。在"Object/Library Modules"选项中的开始处(在 kernel32.lib 
        前)增加 OpenGL32.lib GLu32.lib 和 GLaux.lib 后单击OK按钮。现在可以开始写您的OpenGL程序了。</p>
      <p>代码的前4行包括了我们使用的每个库文件的头文件。如下所示:<br>
      </p></td>
    <td background="Tutorial_01_files/r.gif"><img src="Tutorial_01_files/r.gif" height="28" width="28"></td>
  </tr>

</tbody></table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/bl.gif" height="28" width="28"></td>
      <td width="100%"><img src="Tutorial_01_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>#include &lt;windows.h&gt;<font color="#ffffaa">		// Windows的头文件</font>
#include &lt;glew.h&gt;		<font color="#ffffaa">// 包含最新的gl.h,glu.h库</font>
#include &lt;glut.h&gt;		<font color="#ffffaa">// 包含OpenGL实用库</font></pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/tr.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td background="Tutorial_01_files/l.gif"><img src="Tutorial_01_files/l.gif" height="28" width="28"></td>
      <td valign="top" width="100%">接下来您需要设置您计划在您的程序中使用的所有变量。本节中的例程将创建一个空的OpenGL窗口,因此我们暂时还无需设置大堆的变量。余下需要设置的变量不多,但十分重要。您将会在您以后所写的每一个OpenGL程序中用到它们。<br>
        第一行设置的变量是Rendering Context(着色描述表)。每一个OpenGL都被连接到一个着色描述表上。着色描述表将所有的OpenGL调用命令连接到Device 
        Context(设备描述表)上。我将OpenGL的着色描述表定义为 hRC 。要让您的程序能够绘制窗口的话,还需要创建一个设备描述表,也就是第二行的内容。Windows的设备描述表被定义为 
        hDC 。DC将窗口连接到GDI(Graphics Device Interface图形设备接口)。而RC将OpenGL连接到DC。第三行的变量 
        hWnd 将保存由Windows给我们的窗口指派的句柄。最后,第四行为我们的程序创建了一个Instance(实例)。</td>
    <td background="Tutorial_01_files/r.gif"><img src="Tutorial_01_files/r.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>HGLRC           hRC=NULL;							<font color="#ffffaa">// 窗口着色描述表句柄</font>
HDC             hDC=NULL;							<font color="#ffffaa">// OpenGL渲染描述表句柄</font>
HWND            hWnd=NULL;							<font color="#ffffaa">// 保存我们的窗口句柄</font>
HINSTANCE       hInstance;							<font color="#ffffaa">// 保存程序的实例</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/tr.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td background="Tutorial_01_files/l.gif"><img src="Tutorial_01_files/l.gif" height="28" width="28"></td>
      <td valign="top" width="100%">下面的第一行设置一个用来监控键盘动作的数组。有许多方法可以监控键盘的动作,但这里的方法很可靠,并且可以处理多个键同时按下的情况。<br>
        active 变量用来告知程序窗口是否处于最小化的状态。如果窗口已经最小化的话,我们可以做从暂停代码执行到退出程序的任何事情。我喜欢暂停程序。这样可以使得程序不用在后台保持运行。<br>
        fullscreen 变量的作用相当明显。如果我们的程序在全屏状态下运行, fullscreen 的值为TRUE,否则为FALSE。这个全局变量的设置十分重要,它让每个过程都知道程序是否运行在全屏状态下。</td>
    <td background="Tutorial_01_files/r.gif"><img src="Tutorial_01_files/r.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>bool	keys[256];						<font color="#ffffaa">		// 保存键盘按键的数组</font>
bool	active=TRUE;							<font color="#ffffaa">	// 窗口的活动标志,缺省为TRUE</font>
bool	fullscreen=TRUE;							<font color="#ffffaa">// 全屏标志缺省,缺省设定成全屏模式</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/tr.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td background="Tutorial_01_files/l.gif"><img src="Tutorial_01_files/l.gif" height="28" width="28"></td>
      <td valign="top" width="100%">现
在我们需要先定义WndProc()。必须这么做的原因是CreateGLWindow()有对WndProc()的引用,但WndProc()在
CreateGLWindow()之后才出现。在C语言中,如果我们想要访问一个当前程序段之后的过程和程序段的话,必须在程序开始处先申明所要访问的程
序段。所以下面的一行代码先行定义了WndProc(),使得CreateGLWindow()能够引用WndProc()。</td>
    <td background="Tutorial_01_files/r.gif"><img src="Tutorial_01_files/r.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);				<font color="#ffffaa">// WndProc的定义</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/tr.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td background="Tutorial_01_files/l.gif"><img src="Tutorial_01_files/l.gif" height="28" width="28"></td>
      <td valign="top" width="100%">下
面的代码的作用是重新设置OpenGL场景的大小,而不管窗口的大小是否已经改变(假定您没有使用全屏模式)。甚至您无法改变窗口的大小时(例如您在全屏
模式下),它至少仍将运行一次--在程序开始时设置我们的透视图。OpenGL场景的尺寸将被设置成它显示时所在窗口的大小。</td>
    <td background="Tutorial_01_files/r.gif"><img src="Tutorial_01_files/r.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>GLvoid ReSizeGLScene(GLsizei width, GLsizei height)				<font color="#ffffaa">// 重置OpenGL窗口大小</font>
{
	if (height==0)							<font color="#ffffaa">	// 防止被零除</font>
	{
		height=1;							<font color="#ffffaa">// 将Height设为1</font>
	}

	glViewport(0, 0, width, height);					<font color="#ffffaa">// 重置当前的视口</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_01_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_01_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_01_files/tr.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -