`
tiankefeng0520
  • 浏览: 147867 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习十一:抗锯齿

 
阅读更多
启用抗锯齿
还是以glEnable来启用抗锯齿,可以根据不同图形进行处理
1. GL_POINT_SMOOTH 点
2. GL_LINE_SMOOTH 线
3. GL_POLYGON_SMOOTH 多边形

抗锯齿质量
效果越好,那么计算机速度就越慢
glHint用于对点,线,多边形的抗锯齿程度进行设置
1. GL_DONT_CARE 放弃,应该是系统默认吧
2. GL_FASTEST 速度优先
3. GL_NICEST 图形显示质量优先
点抗锯齿(RGBA模式)
glPointSize(10);
glEnable (GL_POINT_SMOOTH);//启动点抗锯齿
glHint (GL_POINT_SMOOTH, GL_NICEST); //图像渲染质量

左图1:不启动抗锯齿
右图2:启动抗锯齿
 
线抗锯齿

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable (GL_LINE_SMOOTH);
glHint (GL_LINE_SMOOTH, GL_NICEST);
glLineWidth (10);

右图1:不启动抗锯齿
右图2:启动抗锯齿,不启用混合
右图2:启动抗锯齿,启用混合
  

多重采样
多重采样的技巧使用额外的颜色,深度和模板信息,对OPENGL图元进行抗锯齿处理
1.创建一个多重采样的窗口
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB |
GLUT_MULTISAMPLE
);
2.查询状态变量GL_SAMPLE_BUFFERS
   glGetIntegerv (GL_SAMPLE_BUFFERS, buf);
3.查询状态变量GL_SAMPLE
  glGetIntegerv (GL_SAMPLES, sbuf);
如果buf=1 sbuf>1 就可以使用多重采样
4.启动多重采样
glEnable(GLUT_MULTISAMPLE)

说明:多边形抗锯齿做好采用多重采样进行抗锯齿

 

#include "header.h"
static float rotAngle = 0.;


void init(void)
{
   GLfloat values[2];
   glGetFloatv (GL_LINE_WIDTH_GRANULARITY, values);
   printf ("GL_LINE_WIDTH_GRANULARITY value is %3.1f\n", values[0]);

   glGetFloatv (GL_LINE_WIDTH_RANGE, values);
   printf ("GL_LINE_WIDTH_RANGE values are %3.1f %3.1f\n",
      values[0], values[1]);

   glEnable (GL_LINE_SMOOTH);
   glEnable (GL_BLEND);
   glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
   glLineWidth (1.5);

   glEnable (GL_POINT_SMOOTH);
   glHint (GL_POINT_SMOOTH_HINT, GL_NICEST);
   glPointSize(100);
   glClearColor(0.0, 0.0, 0.0, 0.0);
}


void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);


   glPushMatrix();
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0,600,0,600,-10,10);
   glColor3f (1.0, 1.0, 1.0);
   glBegin (GL_LINES);
	 glVertex2f (0, 300);
     glVertex2f (600, 300);
   glEnd ();
   glBegin (GL_LINES);
     glVertex2f (300, 600);
     glVertex2f (300, 0);
   glEnd ();
   glPopMatrix();

   glEnable (GL_LINE_SMOOTH);
   glEnable (GL_BLEND);

   glPushMatrix();
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   
   glOrtho(-150,450,-450,150,-10,10);
   glPushMatrix();
     glRotatef(rotAngle, 0.0, 0.0, 1);
     glColor3f (0.0, 1.0, 0.0);
     glBegin (GL_LINES);
      glVertex2f (-100, -100);
      glVertex2f (100, 100);
   glEnd ();
   glPopMatrix();
   glPushMatrix();
	 glRotatef(-rotAngle, 0.0, 0.0, 1);
     glColor3f (0.0, 0.0, 1.0);
     glBegin (GL_LINES);
       glVertex2f (-100,100);
       glVertex2f (100, -100);
     glEnd ();
   glPopMatrix();
   glPopMatrix();


   glDisable(GL_LINE_SMOOTH);
   glDisable (GL_BLEND);
 
   glPushMatrix();
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   glOrtho(-450,150,-450,150,-10,10);
   glPushMatrix();
     glRotatef(rotAngle, 0.0, 0.0, 1);
     glColor3f (0.0, 1.0, 0.0);
     glBegin (GL_LINES);
       glVertex2f (-100, -100);
       glVertex2f (100, 100);
     glEnd ();
   glPopMatrix();
   glPushMatrix();
     glRotatef(-rotAngle, 0.0, 0.0, 1);
     glColor3f (0.0, 0.0, 1.0);
     glBegin (GL_LINES);
       glVertex2f (-100,100);
       glVertex2f (100, -100);
     glEnd ();
   glPopMatrix();
   glPopMatrix();

   glEnable (GL_POINT_SMOOTH);
   glPushMatrix();
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   glOrtho(-450,150,-150,450,-10,10);
   glColor3f (0.0,0.0, 1.0);
   glBegin (GL_POINTS);
     glVertex2f(0,0);
   glEnd ();
   glPopMatrix();

   glDisable (GL_POINT_SMOOTH);
   glPushMatrix();
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(-150,450,-150,450,-10,10);
   glColor3f (0.0, 1.0, 0.0);
   glBegin (GL_POINTS);
     glVertex2f(0,0);
   glEnd ();
   glPopMatrix();



   glFlush();
}

void reshape(int w, int h)
{
   glViewport(0, 0, w, h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0,600,0,600,-10,10);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 'r':
      case 'R':
         rotAngle += 20.;
         if (rotAngle >= 360.) rotAngle = 0.;
         glutPostRedisplay();	
         break;
      case 27:
         exit(0);
         break;
      default:
         break;
    }
}


int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (600, 600);
   glutCreateWindow (argv[0]);
   init();
   glutReshapeFunc (reshape);
   glutKeyboardFunc (keyboard);
   glutDisplayFunc (display);
   glutMainLoop();
   return 0;
}

 

  • 大小: 1.3 KB
  • 大小: 1.5 KB
  • 大小: 4.4 KB
  • 大小: 4.3 KB
  • 大小: 4.4 KB
分享到:
评论

相关推荐

    MSAA-FBO-Demo-master_opengl抗锯齿_fbo抗锯齿_terrible8bm_抗锯齿_DEMO_

    OpenGL 抗锯齿技术是计算机图形学中一种用于提高图像边缘清晰度的重要方法,它能够消除图像中的像素边缘不连续性,使得图像看起来更加平滑和自然。在本示例"MSAA-FBO-Demo-master"中,我们将深入探讨OpenGL多采样抗...

    GDI 实现抗锯齿

    2. 线条和曲线抗锯齿:GDI虽然没有直接提供线条和曲线的抗锯齿功能,但可以通过自定义画笔(Pen)和刷子(Brush)的样式来实现。例如,可以使用虚线画笔绘制出具有模糊边缘的线条,或者在填充图形时采用渐变填充来...

    Qt OpenGL多重采样

    在Qt框架中结合OpenGL进行开发时,可以利用多重采样(Multisampling)来实现抗锯齿效果。本文将深入探讨如何使用Qt和OpenGL实现多重采样抗锯齿,并基于提供的源码进行分析。 首先,我们需要了解OpenGL中的多重采样。...

    opengl绘制弹簧振动(包含全频抗锯齿)

    通过分析和学习这个文件,开发者可以了解到如何将抗锯齿技术整合到自己的OpenGL项目中,以提升图形质量。 总的来说,这个主题涵盖了OpenGL编程中的几个关键知识点:物理模拟、3D图形渲染、以及高级图形效果的实现,...

    OpenGL资源.zip

    对于有经验的开发者,可能还会涉及更复杂的技术,如多重采样抗锯齿、帧缓冲对象(Frame Buffer Objects, FBOs)、顶点数组对象(Vertex Array Objects, VAOs)、纹理数组、计算着色器等。 五、资源和社区 压缩包...

    Programming with OpenGL Advanced Rendering

    9. **抗锯齿**:OpenGL提供了多种抗锯齿技术,如MSAA(多采样抗锯齿)、SSAA(超级采样抗锯齿)和FXAA(快速近似抗锯齿),以消除边缘锯齿。 10. **后期处理**:通过全屏累加器、模糊滤镜等技术,可以在所有图形...

    OpenGL教程之——OpenGL红宝书

    10. 高级特性:包括多重采样抗锯齿、帧缓冲对象(FBO)、顶点数组对象(VAO)、索引缓冲对象(IBO)等,这些都是提高性能和实现复杂效果的关键。 通过“OpenGL红宝书”的学习,你可以逐步掌握OpenGL的核心概念和...

    NeHe OPenGL 英文教程

    - **抗锯齿技术**:掌握抗锯齿技术以减少图形边缘的锯齿效应。 - **定时控制**:实现精确的帧率控制。 - **正交视图**:设置正交视图来渲染2D图形。 - **声音效果**:添加简单的音效以增强用户体验。 #### 二十五、...

    QtOpenGL文字显示

    本文将深入探讨在Qt中使用OpenGL进行文字显示、透视投影、纹理贴图以及抗锯齿的技术。 首先,让我们来看看“QtOpenGL文字显示”这个主题。在OpenGL中,显示文本通常需要额外的库支持,如FreeType或GLUT,因为OpenGL...

    nanovg 基于 OpenGL 的抗锯齿二维矢量绘图库,用于 UI 和可视化

    在 NanoVG 中,你可以实现抗锯齿的文本、曲线、形状以及图像的绘制,非常适合于创建高质量的 UI 和数据可视化应用。 在 C/C++ 中使用 NanoVG,你需要先包含库头文件并链接相应的库。NanoVG 的核心概念是 `...

    【GAMES101】作业7(提高)多线程、Microfacet(全镜面反射)、抗锯齿

    在游戏渲染中,常见的抗锯齿方法有MSAA(多重采样抗锯齿)、SSAA(超级采样抗锯齿)、FXAA(快速近似抗锯齿)和TXAA(时间抗锯齿)。MSAA通过对像素边缘进行多次采样来平均颜色,减少锯齿,而SSAA则是对整个帧进行...

    nanovg-marmalade:Marmalade 子项目,用于基于 OpenGL 的抗锯齿 2D 矢量绘图库,用于 UI 和可视化

    总之,NanoVG 是一个针对 Marmalade 平台的优秀工具,它利用 OpenGL 实现了高效的 2D 矢量图形绘制,并提供了抗锯齿功能,使得 GUI 和可视化应用的视觉效果更加出色。通过深入理解和运用这个库,开发者能够构建出跨...

    一些学习OpenGL的书籍

    - 高级主题:如使用3DLensFlare实现遮挡测试、使用顶点缓冲区对象、全屏抗锯齿、使用CG顶点着色器、ArcBall旋转、纹理映射三角形等。 - 工具和库:这部分还提到了FreeType字体库、OpenGL中的_tokens、扩展、剪裁...

    OpenGL开发库(学习OpenGL必备)

    在学习过程中,掌握这些基本概念和操作后,你可以逐步深入研究更高级的主题,如光照、投影、混合模式、多重采样抗锯齿、后期处理特效以及现代OpenGL的向量和矩阵操作。同时,了解现代图形编程范式,如图元装配、光栅...

    opengl_experiments:探索OpenGL

    8. **帧缓冲对象**:帧缓冲对象(FBO)允许我们将渲染结果存储在离屏纹理中,便于实现后期处理效果,如模糊、抗锯齿等。 9. **深度测试**:OpenGL提供深度测试功能,确保正确处理重叠的3D物体,避免出现错误的绘制...

    opengl的概要介绍与分析

    OpenGL的核心特性包括顶点着色器、片段着色器、几何着色器等可编程管线,以及纹理映射、光照模型、抗锯齿等高级图形技术。学习OpenGL通常需要掌握着色器语言(如GLSL)、矩阵变换、摄像机视角等概念。 项目源码概述...

    OpenGL源代码学习.rar_nehe opengl_opengl neHe

    9. **效果处理**:chap15可能涵盖各种视觉效果,如雾化、抗锯齿、纹理过滤、混合模式等。 10. **三维动画**:教程中的“利用OpenGL实现三维动画”部分会讲解如何通过改变时间来动态更新物体的位置、旋转和缩放,...

    opengl红宝书源代码

    帧缓冲区则用于存储最终的渲染结果,可以进行多重采样抗锯齿等高级效果。 5. **纹理映射**:纹理映射是OpenGL中一种常见的表面装饰技术,它将2D图像应用到3D物体表面,增加真实感。包括一维、二维、三维纹理以及...

    OpenGL教程jingdian .rar_Opengl 教程_gdi_opengl_opengl教程

    8. **帧缓冲对象(FBO)和离屏渲染**:学习如何使用FBO进行复杂的后期处理效果,如抗锯齿、模糊等。 9. **混合模式和Alpha测试**:掌握透明效果的实现,理解如何处理重叠物体的混合。 10. **状态机机制**:理解...

Global site tag (gtag.js) - Google Analytics