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

📄 tutorial_33.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      0 2 0 0 0 0 0 0 0 0 0,如果是RLE压缩的,则是0 0 10 0 0 0 0 0 0 0 0 0。这两个值允许我们检查正在读取的文件是否有效。<br></td><td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre>	<font color="#ffffaa">// 未压缩的TGA头</font>
	GLubyte uTGAcompare[12] = {0,0, 2,0,0,0,0,0,0,0,0,0};
	<font color="#ffffaa">// 压缩的TGA头</font>
	GLubyte cTGAcompare[12] = {0,0,10,0,0,0,0,0,0,0,0,0};
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%">最后,我们声明两个函数用于读取过程。<br></td><td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre>	<font color="#ffffaa">// 读取一个未压缩的文件</font>
	bool LoadUncompressedTGA(Texture *, char *, FILE *);
	<font color="#ffffaa">// 读取一个压缩的文件</font>
	bool LoadCompressedTGA(Texture *, char *, FILE *);
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%"><p>现在,回到cpp文件,和程序中真正首当其冲部分,我将会省去一些错误消息处理代码并且使教程更短、更具可读性。你可以参看教程包含的文件(在文章的尾部有链接)。</p>
      <p>马上,我们就可以在文件开头包含我们刚刚建立的头文件。</p></td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3"><pre>	#include "tga.h"				<font color="#ffffaa">// 包含我们刚刚建立的头文件</font>
</pre></font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%"><p>不我们不需要包含其它任何文件了,因为我们已经在自己刚刚完成的头文件中包含他们了。</p>
      <p>接下来,我们要做的事情是看看第一个函数,名为LoadTGA(…)。</p></td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3"><pre>	<font color="#ffffaa">// 读取一个TGA文件!</font>
	bool LoadTGA(Texture * texture, char * filename)
	{
</pre></font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%"><p>它有两个参数。前者是一个指向纹理结构的指针,你必须在你的代码中声明它(见包含的例子)。后者是一个字符串,它告诉计算机在哪里去找你的纹理文件。</p>
      <p>函数的前两行声明了一个文件指针,然后打开由“filename”参数指定的文件,它由函数的第二个指针传递进去。</p></td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre>	FILE * fTGA;					<font color="#ffffaa">// 声明文件指针</font>
	fTGA = fopen(filename, "rb");			<font color="#ffffaa">// 以读模式打开文件</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%">接下来的几行检查指定的文件是否已经正确地打开。</td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre>	if(fTGA == NULL)				<font color="#ffffaa">// 如果此处有错误</font>
	{
		...Error code...
		return false;				<font color="#ffffaa">// 返回 False</font>
	}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%">下一步,我们尝试读取文件的首12个字节的内容并且将它们存储在我们的TGAHeader结构中,这样,我们得以检查文件类型。如果fread失败,则关闭文件,显示一个错误,并且函数返回false。</td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>	if(fread(&amp;tgaheader, sizeof(TGAHeader), 1, fTGA) == 0)
	{
		...Error code here...
		return false;				<font color="#ffffaa">//  如果失败则返回 False</font>
	}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%">接着,通过我们用辛苦编的程序刚读取的头,我们继续尝试确定文件类型。这可以告诉我们它是压缩的、未压缩甚至是错误的文件类型。为了达到这个目的,我们将会使用memcmp(…)函数。</td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
</font><pre><font color="#aaffaa" size="3">	<font color="#ffffaa">// 如果文件头附合未压缩的文件头格式</font>
	if(memcmp(uTGAcompare, &amp;tgaheader, sizeof(tgaheader)) == 0)
	{
		<font color="#ffffaa">// 读取未压缩的TGA文件</font>
		LoadUncompressedTGA(texture, filename, fTGA);
	}
	<font color="#ffffaa">// 如果文件头附合压缩的文件头格式</font>
	else if(memcmp(cTGAcompare, &amp;tgaheader, sizeof(tgaheader)) == 0)
	{
		<font color="#ffffaa">// 读取压缩的TGA格式</font>
		LoadCompressedTGA(texture, filename, fTGA);
	}
	else						<font color="#ffffaa">// 如果任一个都不符合</font>
	{
		...Error code here...
		return false;				<font color="#ffffaa">// 返回 False</font>
	}
</font></pre>
 
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%"><p>我们将要开始读取一个未压缩格式文件的章节。</p>
      <p>下面开始我们要做的第一件事,像往常一样,是函数头。</p></td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3"><pre>	<font color="#ffffaa">//读取未压缩的TGA文件</font>
	bool LoadUncompressedTGA(Texture * texture, char * filename, FILE * fTGA)
	{
</pre></font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%"><p>这个函数有3个参数。头两个和LoadTGA中的一样,仅仅是简单的传递。第三个是来自前一个函数中的文件指针,因此我们没有丢失我们的空间。</p>
      <p>接下来我们试着再从文件中读取6个字节的内容,并且存储在tga.header中。如果他失败了,我们运行一些错误处理代码,并且返回false。</p></td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre>	<font color="#ffffaa">// 尝试继续读取6个字节的内容</font>
	if(fread(tga.header, sizeof(tga.header), 1, fTGA) == 0)
	{
		...Error code here...
		return false;				<font color="#ffffaa">// 返回 False</font>
	}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%">现在我们有了计算图像的高度、宽度和BPP的全部信息。我们在纹理和本地结构中都将存储它。</td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>	texture-&gt;width  = tga.header[1] * 256 + tga.header[0];	<font color="#ffffaa">// 计算高度</font>
	texture-&gt;height = tga.header[3] * 256 + tga.header[2];	<font color="#ffffaa">// 计算宽度</font>
	texture-&gt;bpp = tga.header[4];			<font color="#ffffaa">// 计算BPP</font>
	tga.Width = texture-&gt;width;				<font color="#ffffaa">// 拷贝Width到本地结构中去</font>
	tga.Height = texture-&gt;height;			<font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">拷贝Height到本地结构中去</font></font>
	tga.Bpp = texture-&gt;bpp;				<font color="#ffffaa">// 拷贝Bpp到本地结构中去</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%">现在,我们需要确认高度和宽度至少为1个像素,并且bpp是24或32。如果这些值中的任何一个超出了它们的界限,我们将再一次显示一个错误,关闭文件,并且离开此函数。</td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre>	<font color="#ffffaa">// 确认所有的信息都是有效的</font>
	if((texture-&gt;width &lt;= 0) || (texture-&gt;height &lt;= 0) || ((texture-&gt;bpp != 24) &amp;&amp; (texture-&gt;bpp !=32)))
	{
		...Error code here...
		return false;				<font color="#ffffaa">// 返回 False</font>
	}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
    <td valign="top" width="100%">接下来我们设置图像的类型。24 bit图像是GL_RGB,32 bit 图像是GL_RGBA</td>
    <td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>	if(texture-&gt;bpp == 24)				<font color="#ffffaa">// 是24 bit图像吗?</font>
	{
		texture-&gt;type	= GL_RGB;		<font color="#ffffaa">	//如果是,设置类型为GL_RGB</font>
	}

⌨️ 快捷键说明

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