📄 tutorial_23.htm
字号:
<!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_23_files/logo.png" height="130" width="326"></td>
<td align="center" valign="middle" width="75%"><font color="#ffccaa" size="+3"><b><i>第23课</i></b></font></td>
</tr></tbody></table>
<!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_23_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_23_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_23_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_23_files/l.gif"><img src="Tutorial_23_files/l.gif" height="28" width="28"></td>
<!-- 中部文字部分-->
<td valign="top" width="100%">
<table border="0" width="100%">
<tbody><tr>
<td width="30%"><img src="Tutorial_23_files/lesson23.jpg" height="180" width="240"></td>
<td width="70%"><p><font class="head">球面映射:</font></p>
<p><font size="3">这一个将教会你如何把环境纹理包裹在你的3D模型上,让它看起来象反射了周围的场景一样。</font></p></td>
</tr>
</tbody></table>
</td>
<!-- 中部右边框-->
<td background="Tutorial_23_files/r.gif"><img src="Tutorial_23_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_23_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_23_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_23_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_23_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_23_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_23_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_23_files/l.png"><img src="Tutorial_23_files/l.png"></td>
<td valign="top" width="100%">球体环境映射是一个创建快速金属反射效果的方法,但它并不像真实世界里那么精确!我们从18课的代码开始来创建这个教程,教你如何创建这种效果。
<p>在我们开始之间,看一下红宝书中的介绍。它定义球体环境映射为一幅位于无限远的图像,把它映射到球面上。 </p>
<p>在Photoshop中创建一幅球体环境映射图。</p>
<p>首先,你需要一幅球体环境映射图,用来把它映射到球体上。在Photoshop中打开一幅图并选择所有的像素,创建它的一个复制。<br>
接着,我们把图像变为2的幂次方大小,一般为128x128或256x256。<br>
最后使用扭曲(distort)滤镜,并应用球体效果。然后把它保存为*.bmp文件。</p>
<p>我们并没有添加任何全局变量,只是把纹理组的大小变为6,以保存6幅纹理。<br>
</p></td><td background="Tutorial_23_files/r.png"><img src="Tutorial_23_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_23_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_23_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_23_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3"><pre>GLuint texture[6]; <font color="#ffffaa">// 保存6幅纹理 </font>
</pre></font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_23_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_23_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_23_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_23_files/l.png"><img src="Tutorial_23_files/l.png"></td>
<td valign="top" width="100%">下面我们要做的就是载入这些纹理</td>
<td background="Tutorial_23_files/r.png"><img src="Tutorial_23_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_23_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_23_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_23_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>int LoadGLTextures() <font color="#ffffaa"></font>
{
int Status=FALSE; <font color="#ffffaa"></font>
AUX_RGBImageRec *TextureImage[2]; <font color="#ffffaa">// 创建纹理的保存空间</font>
memset(TextureImage,0,sizeof(void *)*2); <font color="#ffffaa"> // 清空为0</font>
<font color="#ffffaa">// 载入*.bmp图像</font>
if ((TextureImage[0]=LoadBMP("Data/BG.bmp")) && <font color="#ffffaa">// 背景图</font>
(TextureImage[1]=LoadBMP("Data/Reflect.bmp"))) <font color="#ffffaa">// 反射图(球形纹理图)</font>
{
Status=TRUE;
glGenTextures(6, &texture[0]); <font color="#ffffaa">// 创建6个纹理</font>
for (int loop=0; loop<=1; loop++)
{
<font color="#ffffaa">// 创建临近点过滤纹理图</font>
glBindTexture(GL_TEXTURE_2D, texture[loop]); <font color="#ffffaa"> // 创建纹理0和1</font>
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);
<font color="#ffffaa">// 创建线形过滤纹理图</font>
glBindTexture(GL_TEXTURE_2D, texture[loop+2]); <font color="#ffffaa">// 创建纹理2,3</font>
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);
<font color="#ffffaa">// 创建线形Mipmap纹理图</font>
glBindTexture(GL_TEXTURE_2D, texture[loop+4]); <font color="#ffffaa">// 创建纹理4,5</font>
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY,
GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);
}
for (loop=0; loop<=1; loop++)
{
if (TextureImage[loop]) <font color="#ffffaa">// 如果图像存在则清除</font>
{
if (TextureImage[loop]->data)
{
free(TextureImage[loop]->data);
}
free(TextureImage[loop]);
}
}
}
return Status;
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_23_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_23_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_23_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_23_files/l.png"><img src="Tutorial_23_files/l.png"></td>
<td valign="top" width="100%">我们对立方体的绘制代码做了一些小的改动,把法线的范围从[-1,1]缩放到[-0.5,0.5]。如果法向量太大的话,会产生一些块状效果,影响视觉效果。</td>
<td background="Tutorial_23_files/r.png"><img src="Tutorial_23_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_23_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_23_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_23_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>GLvoid glDrawCube()
{
glBegin(GL_QUADS);
<font color="#ffffaa">// 前面</font>
glNormal3f( 0.0f, 0.0f, 0.5f);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -