📄 tutorial_46.htm
字号:
<td class="l"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">下面这个函数在扩展名的字符串中查找,如果包含则返回true
<p> </p>
</td>
<td class="r"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre><span class="theme">// 判断是否支持这个扩展</span><br>bool WGLisExtensionSupported(const char *extension)<br>{<br> const size_t extlen = strlen(extension);<br> const char *supported = NULL;</pre>
<p> <span class="theme">// 返回在WGL的扩展中查找是否支持特定的扩展</span><br>
PROC wglGetExtString = wglGetProcAddress("wglGetExtensionsStringARB");</p>
<p> if (wglGetExtString)<br>
supported = ((char*(__stdcall*)(HDC))wglGetExtString)(wglGetCurrentDC());</p>
<p> <span class="theme">//在OpenGL的扩展中查找是否支持特定的扩展</span><br>
if (supported == NULL)<br>
supported = (char*)glGetString(GL_EXTENSIONS);</p>
<p> <span class="theme">// 如果都不支持,则返回失败</span><br>
if (supported == NULL)<br>
return false;</p>
<p> <span class="theme">// 查找是否包含需要的扩展名</span><br>
for (const char* p = supported; ; p++)<br>
{<br>
p = strstr(p, extension);</p>
<p> if (p == NULL)<br>
return false; </p>
<p> if ((p==supported || p[-1]==' ') && (p[extlen]=='\0' || p[extlen]=='
'))<br>
return true; <br>
}<br>
}<br>
</p>
<p></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">下面这个函数在扩展名的字符串中查找,如果包含则返回true</td>
<td class="r"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre><span class="theme">// 初始化多重渲染</span><br>bool InitMultisample(HINSTANCE hInstance,HWND hWnd,PIXELFORMATDESCRIPTOR pfd)<br>{ <br><span class="theme"> // 检测是否支持多重渲染</span><br> if (!WGLisExtensionSupported("WGL_ARB_multisample"))<br> {<br> arbMultisampleSupported=false;<br> return false;<br> }</pre>
<p> <span class="theme">// 返回wglChoosePixelFormatARB函数的入口</span><br>
PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB =
(PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");
<br>
if (!wglChoosePixelFormatARB) <br>
{<br>
arbMultisampleSupported=false;<br>
return false;<br>
}</p>
<p> HDC hDC = GetDC(hWnd);</p>
<p> int pixelFormat;<br>
int valid;<br>
UINT numFormats;<br>
float fAttributes[] = {0,0};</p>
<p> <span class="theme">//下面的代码设置多重采样的像素格式</span><br>
int iAttributes[] =<br>
{<br>
WGL_DRAW_TO_WINDOW_ARB,GL_TRUE,<br>
WGL_SUPPORT_OPENGL_ARB,GL_TRUE,<br>
WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,<br>
WGL_COLOR_BITS_ARB,24,<br>
WGL_ALPHA_BITS_ARB,8,<br>
WGL_DEPTH_BITS_ARB,16,<br>
WGL_STENCIL_BITS_ARB,0,<br>
WGL_DOUBLE_BUFFER_ARB,GL_TRUE,<br>
WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,<br>
WGL_SAMPLES_ARB,4,<br>
0,0<br>
};</p>
<p> <span class="theme">// 首先我们测试是否支持4个采样点的多重采样</span><br>
valid = wglChoosePixelFormatARB(hDC,iAttributes,fAttributes,1,&pixelFormat,&numFormats);<br>
// 如果返回true并且numformats大于1,则表示成功,那么起用多重采样<br>
if (valid && numFormats >= 1)<br>
{<br>
arbMultisampleSupported = true;<br>
arbMultisampleFormat = pixelFormat; <br>
return arbMultisampleSupported;<br>
}</p>
<p> <span class="theme">// 接着我们测试是否支持2个采样点的多重采样</span><br>
iAttributes[19] = 2;<br>
<span class="theme">// 如果返回true并且numformats大于1,则表示成功,那么起用多重采样</span><br>
valid = wglChoosePixelFormatARB(hDC,iAttributes,fAttributes,1,&pixelFormat,&numFormats);<br>
if (valid && numFormats >= 1)<br>
{<br>
arbMultisampleSupported = true;<br>
arbMultisampleFormat = pixelFormat; <br>
return arbMultisampleSupported;<br>
}<br>
<br>
// 返回支持多重采样<br>
return arbMultisampleSupported;<br>
}<br>
</p>
<p></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">下面到了我们的主程序部分了,和前面一样还是按照常规包含一些头文件</td>
<td class="r"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>#include <windows.h> <br>#include <gl/gl.h> <br>#include <gl/glu.h> <br>#include "NeHeGL.h" <br>
#include "ARB_MULTISAMPLE.h"</pre>
<p>BOOL DestroyWindowGL (GL_Window* window);<br>
BOOL CreateWindowGL (GL_Window* window);</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">下面我们需要在CreateWindowGL函数中添加下面的代码,首先我们先创建一个不需要支持多重采样的窗口,它在不启用多重采样的情况下起作用。</td>
<td class="r"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre><span class="theme"> //如果不启用多重采样</span><br> if(!arbMultisampleSupported)<br> {<br> PixelFormat = ChoosePixelFormat (window->hDC, &pfd); <span class="theme">// 选择一种相容的像素格式</span><br> if (PixelFormat == 0) <span class="theme">// 是否获得相容的像素格式</span><br> { <br> ReleaseDC (window->hWnd, window->hDC); <span class="theme">// 释放设备描述表</span><br> window->hDC = 0; <span class="theme">// 设置窗口设备描述表为0</span><br> DestroyWindow (window->hWnd); <span class="theme"> // 删除窗口</span><br> window->hWnd = 0; <span class="theme"> // 设置窗口句柄为0</span><br> return FALSE; <span class="theme">// 返回错误</span><br> }</pre>
<p> }<br>
<span class="theme">//如果起用多重采样</span><br>
else<br>
{<br>
PixelFormat = arbMultisampleFormat; <span class="theme">//设置采样格式为多重采样格式</span><br>
}</p>
<p></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">接着测试是否支持多重采样,如果支持,初始化多重采样,并重新创建窗口</td>
<td class="r"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre><span class="theme"> //检测是否支持多重采样</span><br> if(!arbMultisampleSupported && CHECK_FOR_MULTISAMPLE)<br> {<br><span class="theme"> //如果是,初始化多重采样</span><br> if(InitMultisample(window->init.application->hInstance,window->hWnd,pfd))<br> {<br><span class="theme"> //消耗当前窗口</span><br> DestroyWindowGL (window);<br> <span class="theme"> //创建一个支持多重采样的窗口</span><br> return CreateWindowGL(window);<br> }<br> }<br>
</pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">好了创建好多重采样后,只需要起用它。其他的一切绘制都和平常一样。</td>
<td class="r"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>glEnable(GL_MULTISAMPLE_ARB);</pre>
<p class="theme">// 渲染场景</p>
<p>glDisable(GL_MULTISAMPLE_ARB);</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%"><p>好了,那就是全部,希望你能喜欢:)</p>
<table border="1" width="100%">
<tbody><tr>
<td width="27%"><img src="Tutorial_46_files/logo%25203.jpg" align="middle" height="200" width="209"></td>
<td width="73%">版权与使用声明:<br>
我是个对学习和生活充满激情的普通男孩,在网络上我以DancingWind为昵称,我的联系方式是zhouwei02@mails.tsinghua.edu.cn,如果你有任何问题,都可以联系我。
<p>引子<br>
网络是一个共享的资源,但我在自己的学习生涯中浪费大量的时间去搜索可用的资料,在现实生活中花费了大量的金钱和时间在书店中寻找资料,于是我给自己起了
个昵称DancingWind,其意义是想风一样从各个知识的站点中吸取成长的养料。在飘荡了多年之后,我决定把自己收集的资料整理为一个统一的资源库。</p>
<p>版权声明<br>
所有DancingWind发表的内容,大多都来自共享的资源,所以我没有资格把它们据为己有,或声称自己为这些资源作出了一点贡献。故任何人都可以复
制,修改,重新发表,甚至以自己的名义发表,我都不会追究,但你在做以上事情的时候必须保证内容的完整性,给后来的人一个完整的教程。最后,任何人不能以
这些资料的任何部分,谋取任何形式的报酬。</p>
<p>发展计划<br>
在国外,很多资料都是很多人花费几年的时间慢慢积累起来的。如果任何人有兴趣与别人共享你的知识,我很欢迎你与我联系,但你必须同意我上面的声明。</p>
<p>感谢<br>
感谢我的母亲一直以来对我的支持和在生活上的照顾。<br>
感谢我深爱的女友田芹,一直以来默默的在精神上和生活中对我的支持,她甚至把买衣服的钱都用来给我买书了,她真的是我见过的最好的女孩,希望我能带给她幸福。</p>
<p>资源下载: <br>
文档 <a href="http://www.owlei.com/DancingWind/Res/mht/NeHe%20OpenGL%20Chinese%20Course%2046.mht">网页格式</a>
<a href="http://www.owlei.com/DancingWind/Res/pdf/OpenGL_Nehe_Course_Tutorial_46.pdf">PDF格式</a><br>
源码 <a href="http://www.owlei.com/DancingWind/Res/Src/46_MultiSample.rar">RAR格式</a></p></td>
</tr>
</tbody></table>
<font class="text">
<table border="0" width="100%">
<tbody>
<tr>
<td align="left" width="50%"><b><font size="-1"><a href="http://www.owlei.com/DancingWind/Course/Tutorial_45.htm">< 第45课</a></font></b></td>
<td align="right" width="50%"><b><font size="-1"><a href="http://www.owlei.com/DancingWind/Course/Tutorial_47.htm">第47课 > </a></font></b></td>
</tr>
</tbody>
</table>
</font> </td>
<td class="r"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_46_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre> </pre>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -