📄 tutorial_42.htm
字号:
<td class="bc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>GLfloat xrot, yrot, zrot; <font class="theme">// 旋转物体</font>
GLUquadricObj *quadric; <font class="theme">// 二次几何体对象</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">下面的小段代码设置纹理中位置dmx,dmy的颜色值为纯白色。tex_data是指向我们的纹理数据的指针。每一个象素都由3字节组成(1字节红色分量,1字节绿色分量,一字节兰色分量).
红色分量的偏移为0,我们要修改的象素的在纹理数据中的偏移为dmx(象素的x坐标)加上dmy(象素y坐标)与贴图宽度的乘积,最后的结果乘3(3字节每象素)。<br>
下面第一行代码设置red(0)颜色分量为255, 第二行设置green(1)颜色分量为255,最后一行设置blue(2)颜色分量为255,最后的结果为在dmx,dmy处的象素颜色为白色。</td>
<td class="r"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>void UpdateTex(int dmx, int dmy) <font class="theme">// 更新纹理</font>
{
tex_data[0+((dmx+(width*dmy))*3)]=255; <font class="theme">// 设置颜色为白色</font>
tex_data[1+((dmx+(width*dmy))*3)]=255;
tex_data[2+((dmx+(width*dmy))*3)]=255;
}
</pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">重置有相当多的工作量。它清空纹理,给每一个视口设置随机颜色,删除迷宫中的墙并为迷宫的生成设置新的随机起点。<br>
第一行代码清空tex_data指向的贴图数据。我们需要清空width(贴图宽)*height(贴图高)*3(红,绿,兰)。 (代码已经够清楚了,呜呼,干吗要翻译这段?)
清空内存空间就是设置所有的字节为0。如果3个颜色分量都清零,那么整个贴图就完全变黑了!</td>
<td class="r"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>void Reset (void)
{
ZeroMemory(tex_data, width * height *3); <font class="theme">// 清空纹理数据</font>
</pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">现
在我们来给每一个视口设置随机的颜色。对于不了解这些的人来说,这里的随机并不是真正那种随机!
如果你写了一个简单的程序来打印出10个随机数字,每次你运行程序,你都会得到同样的10个数字。为了使事情(看起来)更加随机,我们可以设置随机数种
子。同样的,如果你设置种子为1,你总是会得到同样的结果。然而,如果我们设置srand为开机后当前时钟计数(这可能是任意的数),我们的程序每次运行
都会有不同的结果。<br>
我们有四个视口,因此我们需要从0-3的循环来处理。我们给每一个颜色(red,green,blue)从128-255中间的随机值。要加128的目的是需要更亮的颜色。最小值为0,最大值为255,而128则表示大约有50%的亮度。
</td>
<td class="r"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre> srand(GetTickCount()); <font class="theme">// 初始化随机向量</font>
for (int loop=0; loop<4; loop++) <font class="theme">// 循环随机生成颜色</font>
{
r[loop]=rand()%128+128;
g[loop]=rand()%128+128;
b[loop]=rand()%128+128;
}
</pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">下
一步,我们设置一个随机的起点。我们的起点必须是一个房间。在纹理中每两个象素就是一个房间。为确保起点是房间而不是墙,我们在0至贴图宽度一半的范围内
挑选一个数,并和2相乘。通过这种方法我们只能得到如0,2,6,8之类的数,也就是说我们总是得到一个随机的房间,决不会着陆到一堵墙上如
1,3,5,7,9等等。</td>
<td class="r"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre> mx=int(rand()%(width/2))*2;
my=int(rand()%(height/2))*2;
}
</pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">初始化的第一行代码非常重要。它分配了足够的内存来保存我们的纹理(width*height*3).
如果你不分配内存,你很可能使你的系统崩溃。</td>
<td class="r"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>BOOL Initialize (GL_Window* window, Keys* keys) <font class="theme">//初始化</font>
{
tex_data=new BYTE[width*height*3]; <font class="theme">// 分配保存纹理的空间</font>
g_window = window;
g_keys = keys; </pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">一分配完内存,我们就调用Reset()函数,Reset会清空贴图,设置所需颜色,并为迷宫选取随机起点。<br>
一旦所有的东西都设置好了。我们建立我们的初始纹理。前两个纹理参数将纹理坐标截断在 [0,1]范围内,当把一个单独的图像映射到一个物体上时,这种方式可以避免缠绕时人为因素的影响(?本句翻译不爽,请指正).
为了看到CLAMP参数的重要性,可以移掉这两行代码看看。如果没有Clamping,你会注意到在纹理的顶部和右边的细小线条。这些线条的出现是因为线性过滤想使整个纹理平滑,包括纹理边界。如果一个靠近边界的点被画了,在纹理的对边上就会出现一条线。<br>
我们打算用线性过滤来使纹理变的更平滑一点。 用什么类型的过滤是由你来决定的。如果它使程序跑起来很慢,那就换成过滤类型为GL_NEAREST<br>
最后,我们利用tex_data数据(并没有利用alpha通道)建立了一个二维的RGB纹理。</td>
<td class="r"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre> Reset(); <font class="theme">// 重置纹理贴图</font>
<font class="theme">// 设置纹理参数</font>
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_data);
</pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_42_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">我们设置用于清空颜色缓冲区的颜色为黑色,清空深度缓冲区的值为1.0f.
设置深度函数为less than或者equal to, 然后激活深度测试。<br>
激活GL_COLOR_MATERIAL可以让你在激活光照的情况下用glColor函数给物体上色。这个方法又称为颜色追踪,
常常是性能杀手的glMaterial的代替品。我收到?
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -