📄 tutorial_22.htm
字号:
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<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>
&& __ARB_ENABLE <font color="#ffffaa">// 是否使用多重纹理扩展?</font>
&& isInString(extensions,"GL_EXT_texture_env_combine")) <font color="#ffffaa">// 是否支持纹理环境混合</font>
{
glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB,&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->sizeX, Image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image->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->sizeX, Image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image->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->sizeX, Image->sizeY, GL_RGB, GL_UNSIGNED_BYTE, Image->data);
}
else status=false;
if (Image) { <font color="#ffffaa">// 如果图像句柄存在,则释放图像回收资源</font>
if (Image->data) delete Image->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>
>…<</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>
>…<<br><font color="#ffffaa"> // </font><font color="#aaffaa" size="3"><font color="#ffffaa">创建使用线形Mipmap过滤器过滤得纹理</font></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%">反转凹凸贴图数据,创建三个反转的凹凸贴图纹理</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<3*Image->sizeX*Image->sizeY; i++) <font color="#ffffaa">// 反转凹凸贴图数据</font>
Image->data[i]=255-Image->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>
>…<<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>
>…<<br><font color="#ffffaa"> // </font><font color="#aaffaa" size="3"><font color="#ffffaa">创建使用线形Mipmap过滤器过滤得纹理</font></font>
>…<
}
else status=false;
if (Image) { <font color="#ffffaa">// 如果图像存在,则删除</font>
if (Image->data) delete Image->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->sizeX*Image->sizeY];
for (int a=0; a<Image->sizeX*Image->sizeY; a++)
alpha[4*a+3]=Image->data[a*3];
if (!(Image=auxDIBImageLoad("Data/OpenGL.bmp"))) status=false;
for (a=0; a<Image->sizeX*Image->sizeY; a++) {
alpha[4*a]=Image->data[a*3];
alpha[4*a+1]=Image->data[a*3+1];
alpha[4*a+2]=Image->data[a*3+2];
}
glGenTextures(1, &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->sizeX, Image->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->data) delete Image->data;
delete Image;
Image=NULL;
}
<font color="#ffffaa">// 载入扩展标志纹理</font>
if (Image=auxDIBImageLoad("Data/multi_on_alpha.bmp")) {
alpha=new char[4*Image->sizeX*Image->sizeY];
>...<
glGenTextures(1, &multiLogo);
>...<
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->data) delete Image->data;
delete Image;
Image=NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -