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

转自【翻译】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

时间: 2024-10-25 08:44:43

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

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

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十六课:从渲染到纹理 放射模糊和渲染到纹理: 如何实现放射状的滤镜效果呢,看上去很难,其实很简单.把渲染得图像作为纹理提取出来,在利用OpenGL本身自带的纹理过滤,就能实现这种效果,不信,你试试. 嗨,我是Dario Corn

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

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十二课:多重视口 多重视口 画中画效果,很酷吧.使用视口它变得很简单,但渲染四次可会大大降低你的显示速度哦:) 欢迎来到充满趣味的另一课.这次我将向你展示怎样在单个窗口内显示多个视口.这些视口在窗口模式下能正确的调整大小.其中有

OpenGL教程翻译 第十六课 基本的纹理贴图

OpenGL教程翻译 第十六课 基本的纹理贴图 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) Background 纹理贴图就是将任意一种类型的图片应用到3D模型的一个或多个面.图片(也可以称之为纹理)内容可以是任何东西,但是他们一般都是一些比如砖,叶子,地面等的图案,纹理贴图增加了场景的真实性.例如,对比下面的两幅图片. 为了进行纹理贴图,你需要进行三个步骤:将图片加载到OpenGl中,定义模型顶点的纹理坐标(以对其进行贴图),用纹理坐标对图片进行

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

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十四课:3D光晕 3D 光晕 当镜头对准太阳的时候就会出现这种效果,模拟它非常的简单,一点数学和纹理贴图就够了.好好看看吧. 大家好,欢迎来到新的一课,在这一课中我们将扩展glCamera类,来实现镜头光晕的效果.在日常生活中,

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

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十八课:资源文件 从资源文件中载入图像: 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用. 欢迎来到NeHe教程第38课.离上节课的写作已经有些时日了,加上写了一整天的code,也许笔头已经

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

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错.你可以试试. 首先我得说我非常喜欢这一章节.Jonat

NeHe OpenGL教程 第三十九课:物理模拟

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切. 物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇文章很适合你. 在这篇教程里,你会创建一个非常简单的物理引

OpenGL教程翻译 第十五课 相机控制(二)

OpenGL教程翻译 第十五课 相机控制(二) 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) Background 在这一节中我们将使用鼠标来控制相机的方向,从而得我们的相机控制更加完善.相机有不同的自由程度,这与其设计有关.在本教程中我们将要实现的是与第一人称游戏中相似的相机控制(如枪战类游戏).这意味着我们将可以使相机完成360度的旋转(绕着Y轴),这与我们的头部向左转向右转.身体转一整圈类似.除此之外我们也能使相机向上或者向下倾斜以获得更好的向

NeHe OpenGL教程 第四十七课:CG顶点脚本

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十七课:CG顶点脚本 CG 顶点脚本 nVidio的面向GPU的C语言,如果你相信它就好好学学吧,同样这里也只是个入门.记住,类似的语言还有微软的HLSL,OpenGL的GLSL,ATI的shaderMonker.不要选错哦:)