OpenGL--抗锯齿

2024-02-17 15:40
文章标签 opengl 抗锯齿

本文主要是介绍OpenGL--抗锯齿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 理论基础
    1,锯齿:在图元边缘处我们能相当清楚地看到两种颜色的分界,我们把这种称之为锯齿。为什么会产生?这是因为我们的图像是由一个个像素组成的,而每个像素近似一个很小的正方形,这样由正方形组成的图像边缘肯定会产生锯齿。示意图如下:
    这里写图片描述
    2,抗锯齿:常见的抗锯齿方法有两种:混合和多重采样。使用混合消除锯齿的原理是,在边缘处降低alpha值再做混合操作从而达到欺骗眼睛的目的。然而混合操作受绘制顺序的影响,对于整个场景的抗锯齿操作是很麻烦的(排序)。这时可以使用另一种抗锯齿方式,多重采样:它在边缘的像素颜色是采集了多种颜色信息最终计算得出个平滑的颜色。其实这种模式它是单独又开辟了一个缓冲区来保存这些信息,这些处理都是要额外带来开销的,有可能对性能造成影响。因此有些opengl实现可能并不支持多重采样。

注释:现在手机上貌似都不需要考虑锯齿问题了,因为分辨率普遍都很高了。


  • 实例代码
    1,使用混合形式的抗锯齿
#include "GLTools.h"
#include "GLShaderManager.h"#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endifstatic float rotAngle = 0.;void init(void)
{GLfloat values[2];/*获取opengl支持信息*/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);//启用线抗锯齿,边缘会降低其alpha值glEnable (GL_BLEND);//启用混合glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);/*对图像质量和渲染速度之间控制权衡关系*/glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);//没有偏向glLineWidth (1.5);glClearColor(0.0, 0.0, 0.0, 0.0);
}void display(void)
{glClear(GL_COLOR_BUFFER_BIT);//绘制绿线(默认alpha=1)glColor3f (0.0, 1.0, 0.0);glPushMatrix();glRotatef(-rotAngle, 0.0, 0.0, 0.1);glBegin (GL_LINES);glVertex2f (-0.5, 0.5);glVertex2f (0.5, -0.5);glEnd ();glPopMatrix();//绘制蓝线glColor3f (0.0, 0.0, 1.0);glPushMatrix();glRotatef(rotAngle, 0.0, 0.0, 0.1);glBegin (GL_LINES);glVertex2f (0.5, 0.5);glVertex2f (-0.5, -0.5);glEnd ();glPopMatrix();glFlush();
}void reshape(int w, int h)
{glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)gluOrtho2D (-1.0, 1.0,-1.0*(GLfloat)h/(GLfloat)w, 1.0*(GLfloat)h/(GLfloat)w);elsegluOrtho2D (-1.0*(GLfloat)w/(GLfloat)h,1.0*(GLfloat)w/(GLfloat)h, -1.0, 1.0);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:  /*  Escape Key  */exit(0);break;default:break;}
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (200, 200);glutCreateWindow (argv[0]);init();glutReshapeFunc (reshape);glutKeyboardFunc (keyboard);glutDisplayFunc (display);glutMainLoop();return 0;}

这里写图片描述

2,使用多重采样的抗锯齿

#include "GLTools.h"
#include "GLShaderManager.h"#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif/*多重采样步骤:1,获得一个支持多重采样的窗口2,查看系统是否支持3,激活多重采样*/static int bgtoggle = 1;void init(void)
{static GLint buf[1], sbuf[1];int i, j;glClearColor(0.0, 0.0, 0.0, 0.0);/*查看系统是否支持多重采样*/glGetIntegerv (GL_SAMPLE_BUFFERS_ARB, buf);printf ("number of sample buffers is %d\n", buf[0]);glGetIntegerv (GL_SAMPLES_ARB, sbuf);printf ("number of samples is %d\n", sbuf[0]);/*显示列表形式*///线段与三角形交替环绕glNewList (1, GL_COMPILE);for (i = 0; i < 19; i++) {glPushMatrix();glRotatef(360.0*(float)i/19.0, 0.0, 0.0, 1.0);glColor3f (1.0, 1.0, 1.0);glLineWidth((i%3)+1.0);glBegin (GL_LINES);//线段glVertex2f (0.25, 0.05);glVertex2f (0.9, 0.2);glEnd ();glColor3f (0.0, 1.0, 1.0);glBegin (GL_TRIANGLES);//三角形glVertex2f (0.25, 0.0);glVertex2f (0.9, 0.0);glVertex2f (0.875, 0.10);glEnd ();glPopMatrix();}glEndList ();//二维正方形背景glNewList (2, GL_COMPILE);glColor3f (1.0, 0.5, 0.0);glBegin (GL_QUADS);//正方形for (i = 0; i < 16; i++) {for (j = 0; j < 16; j++) {if (((i + j) % 2) == 0) {glVertex2f (-2.0 + (i * 0.25), -2.0 + (j * 0.25));glVertex2f (-2.0 + (i * 0.25), -1.75 + (j * 0.25));glVertex2f (-1.75 + (i * 0.25), -1.75 + (j * 0.25));glVertex2f (-1.75 + (i * 0.25), -2.0 + (j * 0.25));}}}glEnd ();glEndList ();
}void display(void)
{glClear(GL_COLOR_BUFFER_BIT);if (bgtoggle)glCallList (2);//二维正方形背景绘制//左边glEnable (GL_MULTISAMPLE_ARB);//激活多重采样glPushMatrix();glTranslatef (-1.0, 0.0, 0.0);glCallList (1);//线段和三角形环绕绘制glPopMatrix();//右边glDisable (GL_MULTISAMPLE_ARB);//关闭多重采样glPushMatrix();glTranslatef (1.0, 0.0, 0.0);glCallList (1);glPopMatrix();glutSwapBuffers();
}void reshape(int w, int h)
{glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= (2 * h))gluOrtho2D (-2.0, 2.0,-2.0*(GLfloat)h/(GLfloat)w, 2.0*(GLfloat)h/(GLfloat)w);elsegluOrtho2D (-2.0*(GLfloat)w/(GLfloat)h,2.0*(GLfloat)w/(GLfloat)h, -2.0, 2.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}void keyboard(unsigned char key, int x, int y)
{switch (key) {case 'b':case 'B':bgtoggle = !bgtoggle;glutPostRedisplay();break;case 27:  /*  Escape Key  */exit(0);default:break;}
}int main(int argc, char** argv)
{glutInit(&argc, argv);//创建一个支持多重采样,双缓冲,RGB颜色模式的窗口glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_MULTISAMPLE);glutInitWindowSize (600, 300);glutCreateWindow (argv[0]);init();glutReshapeFunc (reshape);glutKeyboardFunc (keyboard);glutDisplayFunc (display);glutMainLoop();return 0;
}

这里写图片描述

这篇关于OpenGL--抗锯齿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/718240

相关文章

OPENGL顶点数组, glDrawArrays,glDrawElements

顶点数组, glDrawArrays,glDrawElements  前两天接触OpenGL ES的时候发现里面没有了熟悉的glBegin(), glEnd(),glVertex3f()函数,取而代之的是glDrawArrays()。有问题问google,终于找到答案:因为OpenGL ES是针对嵌入式设备这些对性能要求比较高的平台,因此把很多影响性能的函数都去掉了,上述的几个函数都被移除了。接

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

OpenGL雾(fog)

使用fog步骤: 1. enable. glEnable(GL_FOG); // 使用雾气 2. 设置雾气颜色。glFogfv(GL_FOG_COLOR, fogColor); 3. 设置雾气的模式. glFogi(GL_FOG_MODE, GL_EXP); // 还可以选择GL_EXP2或GL_LINEAR 4. 设置雾的密度. glFogf(GL_FOG_DENSITY, 0

opengl纹理操作

我们在前一课中,学习了简单的像素操作,这意味着我们可以使用各种各样的BMP文件来丰富程序的显示效果,于是我们的OpenGL图形程序也不再像以前总是只显示几个多边形那样单调了。——但是这还不够。虽然我们可以将像素数据按照矩形进行缩小和放大,但是还不足以满足我们的要求。例如要将一幅世界地图绘制到一个球体表面,只使用glPixelZoom这样的函数来进行缩放显然是不够的。OpenGL纹理映射功能支持将

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

抗锯齿技术简介

虽然3D图形渲染技术的飞速进步给我们带来了一次次的视觉震撼,电影级的画面早已经不是遥远的梦想,但电脑在计算3D画面时所出现的锯齿效果仍是不可避免的,这种效果在物体边缘最为明显。画面上那些跳牙咧嘴的锯齿每每令我们如蟹在喉,不吐不快。为了消除这些碍眼的锯齿,抗锯齿技术应运而生,并在图形处理技术不断发展的推动下日趋成熟和完善。 1. FSAA抗锯齿技术 最早的抗锯齿技术来自于3DFX,名为FSA

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点: #include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram;GLuint vao[numVAOs];GLuintcreateShaderProgram (){c

试用GLFW并创建OpenGL和DX的环境

介绍GLFW GLFW官网:https://www.glfw.org/ GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contex

鸿蒙(API 12 Beta6版)图形加速【OpenGL ES平台内插模式】超帧功能开发

超帧内插模式是利用相邻两个真实渲染帧进行超帧计算生成中间的预测帧,即利用第N-1帧和第N帧真实渲染帧预测第N-0.5帧预测帧,如下图所示。由于中间预测帧的像素点通常能在前后两帧中找到对应位置,因此内插模式的预测帧效果较外插模式更优。由于第N帧真实渲染帧需要等待第N-0.5帧预测帧生成并送显后才能最终送显,因此会新增1~2帧的响应时延。 OpenGL ES平台 业务流程 基于OpenGL