📄 tutorial_24.htm
字号:
<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
10 图像规格说明
开始</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->width = header[1] * 256 + header[0]; <font color="#ffffaa">// 记录文件高度</font>
texture->height = header[3] * 256 + header[2]; <font color="#ffffaa">// 记录文件宽度</font>
if( texture->width <=0 || <font color="#ffffaa">// 宽度是否小于0</font>
texture->height <=0 || <font color="#ffffaa">// 高度是否小于0</font>
(header[4]!=24 && 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->bpp = header[4]; <font color="#ffffaa">// 记录文件的位深</font>
bytesPerPixel = texture->bpp/8; <font color="#ffffaa">// 记录每个象素所占的字节数</font>
imageSize = texture->width*texture->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->imageData=(GLubyte *)malloc(imageSize); <font color="#ffffaa">// 分配内存去保存TGA数据</font>
if( texture->imageData==NULL || <font color="#ffffaa">// 系统是否分配了足够的内存?</font>
fread(texture->imageData, 1, imageSize, file)!=imageSize) <font color="#ffffaa">// 是否成功读入内存?</font>
{
if(texture->imageData!=NULL) <font color="#ffffaa">// 是否有数据被加载</font>
free(texture->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<int(imageSize); i+=bytesPerPixel) <font color="#ffffaa">// 循环所有的像素</font>
{ <font color="#ffffaa">// 交换R和B的值</font>
temp=texture->imageData[i];
texture->imageData[i] = texture->imageData[i + 2];
texture->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, &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 + -