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

📄 tutorial_24.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 4 页
字号:
          <td>0</td>
        </tr>
        <tr> 
          <td>6</td>
          <td>0</td>
        </tr>
        <tr> 
          <td>7</td>
          <td>0</td>
        </tr>
        <tr> 
          <td colspan="4" bgcolor="#000080">8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图像规格说明 
            开始</td>
        </tr>
        <tr> 
          <td> 8</td>
          <td rowspan="2">2</td>
          <td rowspan="2">图像 x 坐标起始位置,一般为0</td>
          <td rowspan="2">0</td>
        </tr>
        <tr> 
          <td>9</td>
        </tr>
        <tr> 
          <td>10</td>
          <td rowspan="2">2</td>
          <td rowspan="2">图像 y 坐标起始位置,一般为0</td>
          <td rowspan="2">0</td>
        </tr>
        <tr> 
          <td>11</td>
        </tr>
        <tr> 
          <td>12</td>
          <td rowspan="2">2</td>
          <td rowspan="2">图像宽度,以像素为单位</td>
          <td rowspan="2">256</td>
        </tr>
        <tr> 
          <td>13</td>
        </tr>
        <tr> 
          <td>14</td>
          <td rowspan="2">2</td>
          <td rowspan="2">图像高度,以像素为单位</td>
          <td rowspan="2">256</td>
        </tr>
        <tr> 
          <td>15</td>
        </tr>
        <tr> 
          <td>16</td>
          <td>1</td>
          <td>图像每像素存储占用位(bit)数</td>
          <td>32</td>
        </tr>
        <tr> 
          <td>17</td>
          <td>1</td>
          <td><p>图像描述符字节<br>
              bits 3-0 - 每像素对应的属性位的位数,对于 TGA 24,该值为 0<br>
              bit 4 - 保留,必须为 0<br>
              bit 5 - 屏幕起始位置标志,0 = 原点在左下角,1 = 原点在左上角<br>
              一般这个字节设为0x00即可<br>
            </p></td>
          <td>00100000<sub>(2)</sub></td>
        </tr>
        <tr> 
          <td>18 </td>
          <td>可变</td>
          <td>图像数据域<br>
            这里存储了(宽度)x(高度)个像素,每个像素中的 rgb 色值该色值包含整数个字节 </td>
          <td>...</td>
        </tr>
      </tbody></table>
      <p>如果一切顺利,读取文件后关闭文件。</p></td><td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>	FILE *file = fopen(filename, "rb");						<font color="#ffffaa">// 打开一个TGA文件</font>

	if(	file==NULL ||							<font color="#ffffaa">// 文件存在么?</font>
		fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) ||	<font color="#ffffaa">// 是否包含12个字节的文件头?</font>
		memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0		||	<font color="#ffffaa">// 是否是我们需要的格式?</font>
		fread(header,1,sizeof(header),file)!=sizeof(header))			<font color="#ffffaa">// 如果是读取下面六个图像信息</font>
	{
		if (file == NULL)							<font color="#ffffaa">// 文件不存在返回</font><font color="#aaffaa" size="3"><font color="#ffffaa">错误</font></font>
			return false;							
		else
		{
			fclose(file);						<font color="#ffffaa">// 关闭文件返回错误</font>
			return false;							
		}
	}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_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_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
    <td valign="top" width="100%">下面的代码记录文件的宽度和高度,并判断文件是否为24位/32位TGA文件。</td>
    <td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3">	texture-&gt;width  = header[1] * 256 + header[0];					<font color="#ffffaa">// 记录文件高度</font>
	texture-&gt;height = header[3] * 256 + header[2];					<font color="#ffffaa">// 记录文件宽度</font>

 	if(	texture-&gt;width	&lt;=0	||						<font color="#ffffaa">// 宽度是否小于0</font>
		texture-&gt;height	&lt;=0	||						<font color="#ffffaa">// 高度是否小于0</font>
		(header[4]!=24 &amp;&amp; header[4]!=32))					<font color="#ffffaa">	// TGA文件是24/32位?</font>
	{
		fclose(file);								<font color="#ffffaa">// 如果失败关闭文件,返回错误</font>
		return false;								
	}
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_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_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
    <td valign="top" width="100%">下面的代码记录文件的位深和加载它需要的内存大小</td>
    <td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>	texture-&gt;bpp	= header[4];							<font color="#ffffaa">// 记录文件的位深</font>
	bytesPerPixel	= texture-&gt;bpp/8;							<font color="#ffffaa">// 记录每个象素所占的字节数</font>
	imageSize	= texture-&gt;width*texture-&gt;height*bytesPerPixel;				<font color="#ffffaa">// 计算TGA文件加载所需要的内存大小</font>
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_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_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
    <td valign="top" width="100%">下面的代码为图像数据分配内存并载入它</td>
    <td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>	texture-&gt;imageData=(GLubyte *)malloc(imageSize);				<font color="#ffffaa">// 分配内存去保存TGA数据</font>

	if(	texture-&gt;imageData==NULL ||						<font color="#ffffaa">// 系统是否分配了足够的内存?</font>
		fread(texture-&gt;imageData, 1, imageSize, file)!=imageSize)		<font color="#ffffaa">// 是否成功读入内存?</font>
	{
		if(texture-&gt;imageData!=NULL)					<font color="#ffffaa">// 是否有数据被加载</font>
			free(texture-&gt;imageData);					<font color="#ffffaa">// 如果是,则释放载入的数据</font>

		fclose(file);							<font color="#ffffaa">// 关闭文件</font>
		return false;							<font color="#ffffaa">// 返回错误</font>
	}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_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_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
    <td valign="top" width="100%">TGA文件中,颜色的存储顺序为BGR,而OpenGL中颜色的顺序为RGB,所以我们需要交换每个象素中R和B的值。如果一切顺利,TGA文件中的图像数据将按照OpenGL的要求存储在内存中了。</td>
    <td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>	for(GLuint i=0; i&lt;int(imageSize); i+=bytesPerPixel)				<font color="#ffffaa">// 循环所有的像素</font>
	{									<font color="#ffffaa">// 交换R和B的值</font>
		temp=texture-&gt;imageData[i];						
		texture-&gt;imageData[i] = texture-&gt;imageData[i + 2];		
		texture-&gt;imageData[i + 2] = temp;				
	}

	fclose (file);								<font color="#ffffaa">// 关闭文件</font>
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_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_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
    <td valign="top" width="100%">下面的代码创建一个纹理,并设置过滤方式为线性</td>
    <td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>	<font color="#ffffaa">// 创建纹理</font>
	glGenTextures(1, &amp;texture[0].texID);						<font color="#ffffaa">// 创建纹理,并记录纹理ID</font>

	glBindTexture(GL_TEXTURE_2D, texture[0].texID);				<font color="#ffffaa">// 绑定纹理</font>

⌨️ 快捷键说明

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