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

📄 tutorial_22.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 5 页
字号:
				i++;
			}
		}
	}
	return false;								<font color="#ffffaa">// 没找到</font>
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_22_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_22_files/l.png"><img src="Tutorial_22_files/l.png"></td>
    <td valign="top" width="100%">现
在我们需要先取得扩展名字符串,并把它转换为以'\n'分割的字符串,接着调用以上定义的函数看看是否包含我们需要的扩展。如果定义了
__ARB_ENABLE则使用多重纹理扩展,接下来我们检查是否支持GL_EXT_texture_env_combine扩展,这个扩展提供各个纹理
单元复杂的交互方式,利用它可以完成复杂的混合方程。如果所有的扩展都被支持,我们首先取得纹理单元的个数,把它保存到变量maxTexelUnits
中,接着通过函数wglGetProcAdress把各个函数定义连接到各自的实体上,这样在后面的程序中就可以使用这些函数了。</td>
    <td background="Tutorial_22_files/r.png"><img src="Tutorial_22_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_22_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>bool initMultitexture(void) {
	char *extensions;
	extensions=strdup((char *) glGetString(GL_EXTENSIONS));			<font color="#ffffaa">// 返回扩展名字符串</font>
	int len=strlen(extensions);
	for (int i=0; i&lt;len; i++)							<font color="#ffffaa">// 使用'\n'分割各个扩展名</font>
		if (extensions[i]==' ') extensions[i]='\n';

#ifdef EXT_INFO
	MessageBox(hWnd,extensions,"supported GL extensions",MB_OK | MB_ICONINFORMATION);
#endif

	if (isInString(extensions,"GL_ARB_multitexture")				<font color="#ffffaa">// 是否支持多重纹理扩展?</font>
		&amp;&amp; __ARB_ENABLE							<font color="#ffffaa">// 是否使用多重纹理扩展?</font>
		&amp;&amp; isInString(extensions,"GL_EXT_texture_env_combine"))		<font color="#ffffaa">// 是否支持纹理环境混合</font>
	{
		glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB,&amp;maxTexelUnits);
		glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) wglGetProcAddress("glMultiTexCoord1fARB");
		glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress("glMultiTexCoord2fARB");
		glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) wglGetProcAddress("glMultiTexCoord3fARB");
		glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) wglGetProcAddress("glMultiTexCoord4fARB");
		glActiveTextureARB   = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress("glActiveTextureARB");
		glClientActiveTextureARB= (PFNGLCLIENTACTIVETEXTUREARBPROC) wglGetProcAddress("glClientActiveTextureARB");

#ifdef EXT_INFO
		MessageBox(hWnd,"The GL_ARB_multitexture 扩展被使用.","支持多重纹理",MB_OK | MB_ICONINFORMATION);
#endif

		return true;
	}
	useMultitexture=false;							<font color="#ffffaa">// 如果不支持多重纹理则返回false</font>
	return false;
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_22_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_22_files/l.png"><img src="Tutorial_22_files/l.png"></td>
    <td valign="top" width="100%">初始化灯光</td>
    <td background="Tutorial_22_files/r.png"><img src="Tutorial_22_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_22_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>void initLights(void) {
	glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);				
	glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
	glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
	glEnable(GL_LIGHT1);
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_22_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_22_files/l.png"><img src="Tutorial_22_files/l.png"></td>
    <td valign="top" width="100%">下面我们加载许多纹理,这和前面的教程很像</td>
    <td background="Tutorial_22_files/r.png"><img src="Tutorial_22_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_22_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
</font><pre><font color="#aaffaa" size="3">int LoadGLTextures() {								<font color="#ffffaa">// 载入*.bmp图像,并转换为纹理</font>
	bool status=true;		
	AUX_RGBImageRec *Image=NULL;						
	char *alpha=NULL;

	<font color="#ffffaa">// 加载基础纹理</font>
	if (Image=auxDIBImageLoad("Data/Base.bmp")) {
		glGenTextures(3, texture);						<font color="#ffffaa">// 创建3个纹理</font>

		<font color="#ffffaa">// 创建使用临近过滤器过滤得纹理</font>
		glBindTexture(GL_TEXTURE_2D, texture[0]);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
		glTexImage2D(GL_TEXTURE_2D, 0, <font color="#ffaa55">GL_RGB8</font>, Image-&gt;sizeX, Image-&gt;sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image-&gt;data);

		<font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">创建使用线形过滤器过滤得纹理</font></font>
		glBindTexture(GL_TEXTURE_2D, texture[1]);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, <font color="#ffaa55">GL_RGB8</font>, Image-&gt;sizeX, Image-&gt;sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image-&gt;data);

		<font color="#ffffaa">// 创建使用线形Mipmap过滤器过滤得纹理</font>
		glBindTexture(GL_TEXTURE_2D, texture[2]);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
		gluBuild2DMipmaps(GL_TEXTURE_2D, <font color="#ffaa50">GL_RGB8</font>, Image-&gt;sizeX, Image-&gt;sizeY, GL_RGB, GL_UNSIGNED_BYTE, Image-&gt;data);
	}
	else status=false;

	if (Image) {								<font color="#ffffaa">// 如果图像句柄存在,则释放图像回收资源</font>
		if (Image-&gt;data) delete Image-&gt;data;				
		delete Image;
		Image=NULL;
	}
</font></pre>

<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_22_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_22_files/l.png"><img src="Tutorial_22_files/l.png"></td>
    <td valign="top" width="100%">现在我们加载凹凸映射纹理。这个纹理必须使用50%的亮度(原因我们在后面介绍),我们使用glPixelTransferf函数完成这个功能。<br>
      另一个限制是我们不希望纹理重复贴图,只希望它粘贴一次,从纹理坐标(0,0)-(1,1),所有大于它的纹理坐标都被映射到边缘,为了完成这个功能,我们使用glTexParameteri函数。</td>
    <td background="Tutorial_22_files/r.png"><img src="Tutorial_22_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_22_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>	<font color="#ffffaa">// 载入凹凸贴图</font>
	if (Image=auxDIBImageLoad("Data/Bump.bmp")) {
		glPixelTransferf(GL_RED_SCALE,0.5f);					<font color="#ffffaa">// 把颜色值变为原来的50%</font>
		glPixelTransferf(GL_GREEN_SCALE,0.5f);				
		glPixelTransferf(GL_BLUE_SCALE,0.5f);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);	<font color="#ffffaa">	//不使用重复贴图</font>
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
		glGenTextures(3, bump);						<font color="#ffffaa">//创建凹凸贴图纹理</font>

		<font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">创建使用临近过滤器过滤得纹理</font></font>
		&gt;…&lt;</pre>
</font> <font color="#aaffaa" size="3"> 
<pre><font color="#ffffaa">	// </font><font color="#aaffaa" size="3"><font color="#ffffaa"></font><font color="#aaffaa" size="3"><font color="#ffffaa">创建使用线形过滤器过滤得纹理</font></font></font>
		&gt;…&lt;<br><font color="#ffffaa">	// </font><font color="#aaffaa" size="3"><font color="#ffffaa">创建使用线形Mipmap过滤器过滤得纹理</font></font>
		&gt;…&lt;
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_22_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_22_files/l.png"><img src="Tutorial_22_files/l.png"></td>
    <td valign="top" width="100%">反转凹凸贴图数据,创建三个反转的凹凸贴图纹理</td>
    <td background="Tutorial_22_files/r.png"><img src="Tutorial_22_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_22_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>		for (int i=0; i&lt;3*Image-&gt;sizeX*Image-&gt;sizeY; i++)			<font color="#ffffaa">// 反转凹凸贴图数据</font>
			Image-&gt;data[i]=255-Image-&gt;data[i];

		glGenTextures(3, invbump);					<font color="#ffffaa">	// 创建三个反转了凹凸贴图</font>

<font color="#aaffaa" size="3"><pre>		<font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">创建使用临近过滤器过滤得纹理</font></font>
		&gt;…&lt;<font color="#aaffaa" size="3"></font></pre></font><font color="#aaffaa" size="3"><pre><font color="#ffffaa">	// </font><font color="#aaffaa" size="3"><font color="#ffffaa"></font><font color="#aaffaa" size="3"><font color="#ffffaa">创建使用线形过滤器过滤得纹理</font></font></font>
		&gt;…&lt;<br><font color="#ffffaa">	// </font><font color="#aaffaa" size="3"><font color="#ffffaa">创建使用线形Mipmap过滤器过滤得纹理</font></font>
		&gt;…&lt;
	}
	else status=false;
	if (Image) {								<font color="#ffffaa">// 如果图像存在,则删除</font>
		if (Image-&gt;data) delete Image-&gt;data;	
		delete Image;
		Image=NULL;
	}
</pre></font></pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_22_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_22_files/l.png"><img src="Tutorial_22_files/l.png"></td>
    <td valign="top" width="100%">载入标志图像,图像是把颜色和alpha通道存为两张不同的bmp位图的,所以在处理的时候需要注意以下各个分量的位置。</td>
    <td background="Tutorial_22_files/r.png"><img src="Tutorial_22_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_22_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_22_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_22_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3"> 
<pre>	if (Image=auxDIBImageLoad("Data/OpenGL_ALPHA.bmp")) {
		alpha=new char[4*Image-&gt;sizeX*Image-&gt;sizeY];
		for (int a=0; a&lt;Image-&gt;sizeX*Image-&gt;sizeY; a++)
			alpha[4*a+3]=Image-&gt;data[a*3];				
		if (!(Image=auxDIBImageLoad("Data/OpenGL.bmp"))) status=false;
		for (a=0; a&lt;Image-&gt;sizeX*Image-&gt;sizeY; a++) {
			alpha[4*a]=Image-&gt;data[a*3];				
			alpha[4*a+1]=Image-&gt;data[a*3+1];		
			alpha[4*a+2]=Image-&gt;data[a*3+2];			
		}

		glGenTextures(1, &amp;glLogo);						<font color="#ffffaa">// 创建标志纹理</font>

		<font color="#ffffaa">// 使用线形过滤器</font>
		glBindTexture(GL_TEXTURE_2D, glLogo);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, <font color="#ffaa55">GL_RGBA8</font>, Image-&gt;sizeX, Image-&gt;sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, <font color="#ffaa55">alpha</font>);
		delete alpha;
	}
	else status=false;

	if (Image) {								<font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#aaffaa" size="3"><font color="#ffffaa">如果图像存在,则删除</font></font></font>
		if (Image-&gt;data) delete Image-&gt;data;				
		delete Image;
		Image=NULL;
	}

	<font color="#ffffaa">// 载入扩展标志纹理</font>
	if (Image=auxDIBImageLoad("Data/multi_on_alpha.bmp")) {
		alpha=new char[4*Image-&gt;sizeX*Image-&gt;sizeY];			
		&gt;...&lt;
		glGenTextures(1, &amp;multiLogo);					
		&gt;...&lt;
		delete alpha;
	}
	else status=false;

	if (Image) {								<font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#aaffaa" size="3"><font color="#aaffaa" size="3"><font color="#ffffaa">如果图像存在,则删除</font></font></font></font>
		if (Image-&gt;data) delete Image-&gt;data;				
		delete Image;
		Image=NULL;
	}

⌨️ 快捷键说明

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