📄 tutorial_24.htm
字号:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); <font color="#ffffaa">// 设置过滤器为线性过滤</font>
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); </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,如果是则设置类型为GL_RGB</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> if (texture[0].bpp==24) <font color="#ffffaa">// 是否为24位图像?</font>
{
type=GL_RGB; <font color="#ffffaa">// 如果是设置类型为GL_RGB</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%">下面的代码在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> glTexImage2D(GL_TEXTURE_2D, 0, type, texture[0].width, texture[0].height, 0, type, GL_UNSIGNED_BYTE, texture[0].imageData);
return true; <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%">下面的代码是从图像创建字体的典型的方法,这些代码将包含在后面的课程中,以显示文字。<br>
只有一个不同的地方,纹理0用来保存字符图像。</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">GLvoid BuildFont(GLvoid) <font color="#ffffaa">// 创建字体显示列表</font>
{
base=glGenLists(256); <font color="#ffffaa">// 创建256个显示列表</font>
glBindTexture(GL_TEXTURE_2D, textures[0].texID); <font color="#ffffaa">// 绑定纹理</font>
for (int loop1=0; loop1<256; loop1++) <font color="#ffffaa">// 循环创建256个显示列表</font>
{
float cx=float(loop1%16)/16.0f; <font color="#ffffaa">// 当前字符的X位置</font>
float cy=float(loop1/16)/16.0f; <font color="#ffffaa">// 当前字符的Y位置</font>
glNewList(base+loop1,GL_COMPILE); <font color="#ffffaa">// 开始创建显示列表</font>
glBegin(GL_QUADS); <font color="#ffffaa">// 创建一个四边形用来包含字符图像</font>
glTexCoord2f(cx,1.0f-cy-0.0625f); <font color="#ffffaa">// 左下方纹理坐标</font>
glVertex2d(0,16); <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">左下方坐标</font></font>
glTexCoord2f(cx+0.0625f,1.0f-cy-0.0625f); <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">右下方纹理坐标</font></font>
glVertex2i(16,16); <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#aaffaa" size="3"><font color="#ffffaa">右下方坐标</font></font></font>
glTexCoord2f(cx+0.0625f,1.0f-cy-0.001f); <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">右上方纹理坐标</font></font>
glVertex2i(16,0); <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#aaffaa" size="3"><font color="#ffffaa">右上方坐标</font></font></font>
glTexCoord2f(cx,1.0f-cy-0.001f); <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">左上方纹理坐标</font></font>
glVertex2i(0,0); <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#aaffaa" size="3"><font color="#ffffaa">左上方坐标</font></font></font>
glEnd(); <font color="#ffffaa">// 四边形创建完毕</font>
glTranslated(14,0,0); <font color="#ffffaa">// 向右移动14个单位</font>
glEndList(); <font color="#ffffaa">// 结束创建显示列表</font>
}
}
</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>GLvoid KillFont(GLvoid)
{
glDeleteLists(base,256); <font color="#ffffaa">// 从内存中删除256个显示列表</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%">glPrint函数只有一点变化,我们在Y轴方向把字符拉长一倍</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>GLvoid glPrint(GLint x, GLint y, int set, const char *fmt, ...)
{
char text[1024]; <font color="#ffffaa"> // 保存我们的字符</font>
va_list ap; <font color="#ffffaa">// 指向第一个参数</font>
if (fmt == NULL) <font color="#ffffaa">// 如果要显示的字符为空则返回</font>
return;
va_start(ap, fmt); <font color="#ffffaa">// 开始分析参数,并把结果写入到text中</font>
vsprintf(text, fmt, ap);
va_end(ap);
if (set>1) <font color="#ffffaa">// 如果字符集大于1则使用第二个字符集</font>
{
set=1;
}
glEnable(GL_TEXTURE_2D); <font color="#ffffaa">// 使用纹理映射</font>
glLoadIdentity(); <font color="#ffffaa">// 重置视口矩阵</font>
glTranslated(x,y,0); <font color="#ffffaa">// 平移到(x,y,0)处</font>
glListBase(base-32+(128*set)); <font color="#ffffaa">// 选择字符集</font>
glScalef(1.0f,2.0f,1.0f); <font color="#ffffaa">// 沿Y轴放大一倍</font>
glCallLists(strlen(text),GL_UNSIGNED_BYTE, text); <font color="#ffffaa">// 把字符写入到屏幕</font>
glDisable(GL_TEXTURE_2D); <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%">窗口改变大小的函数使用正投影,把视口范围设置为(0,0)-(640,480)</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>GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
{
swidth=width; <font color="#ffffaa">// 设置剪切矩形为窗口大小</font>
sheight=height;
if (height==0) <font color="#ffffaa">// 防止高度为0时,被0除</font>
{
height=1;
}
glViewport(0,0,width,height); <font color="#ffffaa">// 设置窗口可见区</font>
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f,640,480,0.0f,-1.0f,1.0f); <font color="#ffffaa">// 设置视口大小为640x480</font>
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
</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>int InitGL(GLvoid)
{
if (!LoadTGA(&textures[0],"Data/Font.TGA")) <font color="#ffffaa">// 载入字体纹理</font>
{
return false; <font color="#ffffaa">// 载入失败则返回</font>
}
BuildFont(); <font color="#ffffaa">// 创建字体</font>
glShadeModel(GL_SMOOTH); <font color="#ffffaa">// 使用平滑着色</font>
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); <font color="#ffffaa">// 设置黑色背景</font>
glClearDepth(1.0f); <font color="#ffffaa">// 设置深度缓存中的值为1</font>
glBindTexture(GL_TEXTURE_2D, textures[0].texID); <font color="#ffffaa">// 绑定字体纹理</font>
return TRUE; <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%">绘制代码几乎是全新的:),token为一个指向字符串的指针,它将保存OpenGL扩展的全部字符串,cnt纪录扩展的个数。<br>
接下来清楚背景,并显示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>int DrawGLScene(GLvoid)
{
char *token; <font color="#ffffaa">// 保存扩展字符串</font>
int cnt=0; <font color="#ffffaa">// 纪录扩展字符串的个数</font>
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); <font color="#ffffaa"> // 清楚背景和深度缓存</font>
glColor3f(1.0f,0.5f,0.5f); <font color="#ffffaa"> // 设置为红色</font>
glPrint(50,16,1,"Renderer");
glPrint(80,48,1,"Vendor");
glPrint(66,80,1,"Version"); </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%">下面的代码显示OpenGL实现方面的相关信息,完成之后我们用蓝色在屏幕的下方写上“NeHe Productions”,当然你可以使用任何你想使用的字符,比如"DancingWind
Translate"。</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> glColor3f(1.0f,0.7f,0.4f); <font color="#ffffaa">// 设置为橘黄色</font>
glPrint(200,16,1,(char *)glGetString(GL_RENDERER)); <font color="#ffffaa">// 显示OpenGL的实现组织</font>
glPrint(200,48,1,(char *)glGetString(GL_VENDOR)); <font color="#ffffaa">// 显示销售商</font>
glPrint(200,80,1,(char *)glGetString(GL_VERSION)); <font color="#ffffaa">// 显示当前版本</font>
glColor3f(0.5f,0.5f,1.0f); <font color="#ffffaa">// 设置为蓝色</font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -