转自【翻译】NeHe OpenGL 教程

前言

声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改。对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢。

NeHe OpenGL第四十六课:全屏反走样

全屏反走样

当今显卡的强大功能,你几乎什么都不用做,只需要在创建窗口的时候该一个数据。看看吧,驱动程序为你做完了一切。

 

在图形的绘制中,直线的走样是非常影响美观的,我们可以使用反走样解决这个问题。在众多的解决方案里,多重采样是一种易于硬件实现的方法,也是一种快速的方法。

全凭多重采样可以使你的图形看起来更美观,我们可以使用ARB_MULTISAMPLE扩展完成这个功能,但它会降低你的程序的速度。

 

Vid_mem = sizeof(Front_buffer) + sizeof(Back_buffer) + num_samples  * (sizeof(Front_buffer) +sizeof(ZS_buffer))

  

如果你想知道更多的关于多重采样的信息,请访问下面的链接:

GDC2002 -- OpenGL Multisample

OpenGL Pixel Formats and Multisample Antialiasing

下面我们来介绍如何使用多重采样,不向其他的扩展,我们在使用多重采样时,必须在窗口创建时告诉它使用多重采样,典型的步骤如下:

1、创建一个窗口

2、查询是否支持多重采样

3、如果支持删除当前的窗口,使用支持多重采样的格式创建窗口

4、如果我们想使用多重采样,仅仅启用它既可。

了解了上面,我们从头说明如何使用多重采样,并介绍ARB_Multisample的实现方法:

 

#include <windows.h>#include <gl.h>#include <glu.h>#include "arb_multisample.h"

下面两行定义我需要使用的像素格式 

  

// 声明我们将要使用#define WGL_SAMPLE_BUFFERS_ARB 0x2041#define WGL_SAMPLES_ARB  0x2042

bool arbMultisampleSupported = false;

int arbMultisampleFormat = 0;

下面这个函数在扩展名的字符串中查找,如果包含则返回true

 

// 判断是否支持这个扩展bool WGLisExtensionSupported(const char *extension){ const
size_t extlen = strlen(extension); const char *supported = NULL;

// 返回在WGL的扩展中查找是否支持特定的扩展

PROC wglGetExtString = wglGetProcAddress("wglGetExtensionsStringARB");

if (wglGetExtString)

supported = ((char*(__stdcall*)(HDC))wglGetExtString)(wglGetCurrentDC());

//在OpenGL的扩展中查找是否支持特定的扩展

if (supported == NULL)

supported = (char*)glGetString(GL_EXTENSIONS);

// 如果都不支持,则返回失败

if (supported == NULL)

return false;

// 查找是否包含需要的扩展名

for (const char* p = supported; ; p++)

{

p = strstr(p, extension);

if (p == NULL)

return false;

if ((p==supported || p[-1]==' ') && (p[extlen]=='\0' || p[extlen]==' '))

return true;

}

}

下面这个函数在扩展名的字符串中查找,如果包含则返回true 

  

// 初始化多重渲染bool InitMultisample(HINSTANCE hInstance,HWND
hWnd,PIXELFORMATDESCRIPTOR pfd){    // 检测是否支持多重渲染 if
(!WGLisExtensionSupported

("WGL_ARB_multisample")) {  arbMultisampleSupported=false;  return false; }

// 返回wglChoosePixelFormatARB函数的入口

PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB =
(PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");


if (!wglChoosePixelFormatARB)

{

arbMultisampleSupported=false;

return false;

}

HDC hDC = GetDC(hWnd);

int pixelFormat;

int valid;

UINT numFormats;

float fAttributes[] = {0,0};

//下面的代码设置多重采样的像素格式

int iAttributes[] =

{

WGL_DRAW_TO_WINDOW_ARB,GL_TRUE,

WGL_SUPPORT_OPENGL_ARB,GL_TRUE,

WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,

WGL_COLOR_BITS_ARB,24,

WGL_ALPHA_BITS_ARB,8,

WGL_DEPTH_BITS_ARB,16,

WGL_STENCIL_BITS_ARB,0,

WGL_DOUBLE_BUFFER_ARB,GL_TRUE,

WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,

WGL_SAMPLES_ARB,4,

0,0

};

// 首先我们测试是否支持4个采样点的多重采样

valid = wglChoosePixelFormatARB(hDC,iAttributes,fAttributes,1,&pixelFormat,&numFormats);

// 如果返回true并且numformats大于1,则表示成功,那么起用多重采样

if (valid && numFormats >= 1)

{

arbMultisampleSupported = true;

arbMultisampleFormat = pixelFormat;

return arbMultisampleSupported;

}

// 接着我们测试是否支持2个采样点的多重采样

iAttributes[19] = 2;

// 如果返回true并且numformats大于1,则表示成功,那么起用多重采样

valid = wglChoosePixelFormatARB(hDC,iAttributes,fAttributes,1,&pixelFormat,&numFormats);

if (valid && numFormats >= 1)

{

arbMultisampleSupported = true;

arbMultisampleFormat = pixelFormat;

return arbMultisampleSupported;

}

// 返回支持多重采样

return arbMultisampleSupported;

}

下面到了我们的主程序部分了,和前面一样还是按照常规包含一些头文件 

  

#include <windows.h>        #include <gl/gl.h>

#include <gl/glu.h>       #include "NeHeGL.h" 

  #include "ARB_MULTISAMPLE.h"

BOOL DestroyWindowGL (GL_Window* window);

BOOL CreateWindowGL (GL_Window* window);

下面我们需要在CreateWindowGL函数中添加下面的代码,首先我们先创建一个不需要支持多重采样的窗口,它在不启用多重采样的情况下起作用。 

  

 //如果不启用多重采样 if(!arbMultisampleSupported) {  PixelFormat = ChoosePixelFormat (window->hDC, &pfd);

// 选择一种相容的像素格式  if (PixelFormat == 0)            // 是否获得相容

的像素格式  {

ReleaseDC (window->hWnd, window-

>hDC);       // 释放设备描述表   window->hDC = 0;

// 设置窗口设备描述表为0   DestroyWindow (window->hWnd);

// 删除窗口   window->hWnd = 0;

// 设置窗口句柄为0   return FALSE;             // 返回错误

}

}

//如果起用多重采样

else

{

PixelFormat = arbMultisampleFormat; //设置采样格式为多重采样格式

}

接着测试是否支持多重采样,如果支持,初始化多重采样,并重新创建窗口

//检测是否支持多重采样 if(!arbMultisampleSupported && CHECK_FOR_MULTISAMPLE) {  //如果是,初始化多重采样  if(InitMultisample

(window->init.application->hInstance,window->hWnd,pfd))  {   //消耗当前窗口   DestroyWindowGL (window);

//创建一个支持多重采样的窗口   return CreateWindowGL(window);  } }

好了创建好多重采样后,只需要起用它。其他的一切绘制都和平常一样。

glEnable(GL_MULTISAMPLE_ARB);

// 渲染场景

glDisable(GL_MULTISAMPLE_ARB);

原文及其个版本源代码下载:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=46

 
 

NeHe OpenGL教程 第四十六课:全屏反走样的更多相关文章

  1. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. NeHe OpenGL教程 第四十八课:轨迹球

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. NeHe OpenGL教程 第四十五课:顶点缓存

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. NeHe OpenGL教程 第四十二课:多重视口

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. NeHe OpenGL教程 第四十四课:3D光晕

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. NeHe OpenGL教程 第四十课:绳子的模拟

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. NeHe OpenGL教程 第三十五课:播放AVI

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. NeHe OpenGL教程 第三十二课:拾取游戏

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. Linux字符设备

    一.linux系统将设备分为3类:字符设备.块设备.网络设备. 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的 ...

  2. 【小月博客】用HTML5的File API做上传图片预览功能

    前段时间做了一个项目,涉及到上传本地图片以及预览的功能,正好之前了解过 html5(点击查看更多关于web前端的有关资源) 可以上传本地图片,然后再网上看了一些demo结合自己的需求,终于搞定了.(P ...

  3. iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)

    iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接) 这里推荐两款好用的Xcode插件,并提供下载链接. 一.插件和使用如下: 1.两款插件 对项目中图片提供自动提示功能的插件:KSImag ...

  4. 【jQuery】serializeArray()与serialize()的区别

    serialize()序列化表单元素为字符串,用于 Ajax 请求. serializeArray()序列化表单元素为JSON数据. 具体实例如下: 1 <!DOCTYPE html PUBLI ...

  5. sqoop的增量导入(increment import)

    1.import增量导入的官方说明

  6. sql datetime操作

    Sql Server中的日期与时间函数 SQL中的时间函数非常有用,特别是在我们进行初始赋值.复杂查询的时候,就显得特别方便. 1.获得系统当前时间 select getdate()  2.DateN ...

  7. 使用本地JConsole监控远程JVM (转)

    问题背景   Tomcat经常崩溃crash,想看看JVM内存使用情况,就想到了用Jconsole监控,以前只是监控本地的JVM,这次要监控远程的,遇到了不少问题.   经过几个小时的努力,参考了众多 ...

  8. Linux的awk命令

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  9. windows server 2008 r2 切换windows 7主题方法

    1. 打开Powershell 里 Cmdlets 管理角色和功能Import-Module servermanager 2. 安装桌面体验Add-WindowsFeature Desktop-Exp ...

  10. 跟大牛之间关于hibernate的一些探讨记录

    hibernate的工作原理!! 1.读取配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transcation 5.持久化操作 6.提交事务 ...