转自【翻译】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. python语法------时间函数

    1.导入函数库: import time 获取格式化的时间 你可以根据需求选取各种格式,但是最简单的获取可读的时间模式的函数是asctime(): #!/usr/bin/python # -*- co ...

  2. windows下python安装pyquery

    安装pyquery之前首先要明确一点,easyinstall 是一款python包管理器,类似于node的npm,用于安装python的扩展包,它安装的包是以*.egg的方式. 要安装pq需要经历以下 ...

  3. 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

    Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...

  4. 工厂方法(factory method)

    动机(Motivation) 在软件系统中,经常面临着“某个对象”的创建工作:由需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?如何提供一种“封装机制”来隔离出 ...

  5. Python开发入门与实战3-Django动态页面

    3.Django动态页面 上一章节我们实现的helloworld视图是用来演示Django网页是创建的,它不是一个动态网页,每次运行/helloworld/,我们都将看到相同的内容,它类似一个静态HT ...

  6. WCF服务开发与调用的完整示例

    WCF服务开发与调用的完整示例 开发工具:VS2008 开发语言:C# 开发内容:简单的权限管理系统 第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IServi ...

  7. Debian 8(jessie)下设置系统启动直接进入命令行,无GUI

    修改grub项 sudo vi /etc/default/grub 修改其中三项 ... GRUB_CMDLINE_LINUX_DEFAULT="quiet" GRUB_CMDLI ...

  8. 关于工伤事故索赔计算很好用的一款APP

    关于工伤事故索赔计算很好用的一款APP.详细介绍工伤伤残等级评估 工伤计算器根据国家颁布<劳动能力鉴定 职工工伤与职业病致残等级>,通过关键字检索,快速评估工伤伤残等级. 软件说明:  1 ...

  9. LInux内核分析——计算机是如何工作的进行

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " 实 ...

  10. iOS- UITextField限制输入长度

    限制输入长度的问题,在这里完美的解决了! //先创建一个textField 和 一个button. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...