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

📄 tutorial_42.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 3 页
字号:
    <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&lt;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 + -