OpenGL ES 中抗锯齿处理

OpenGL ES 中抗锯齿处理

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生
-  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

本博文中,默认研究OpenGL ES都是针对2.0及以后版本,即带着色器的版本。

对1.x这种固定管线的版本,不考虑去深入研究,也或许会通过1.x中提供的API来研究2.0及以后版本中的相关算法实现。

猜想,可能是这样的,1.x中提供的API,其实后端也是在着色器中写的代码,只不过通过API设置个状态,回头渲染管线根据这些状态来选择是否执行和执行哪一段着色器代码。

只不过在1.x中并未提供着色器语言给开发者,所以也就没办法通过着色器代码来实现了。

真的不知道具体是否如上面猜想,不过感觉最好有2.0及以后的版本中有最起码的1.x中的功能,在着色器中实现,并可以在着色器中调用,这样对于起步研究还是大有益处。

越是复杂的系统,越需要提供最基本的示例,可供入门者使用,确保高楼大厦都有一个缓台可用,每一个缓台让人看到的高度都很直观,但距离确都很舒适,这样才不至于一下子被吓破了胆,提G色变啊!真不是夸张,我对OpenGL 垂涎三四年了,都未曾敢支碰过,怕浪费宝贵的时间;就连流媒体这种东西,我至少还有胆去玩玩它。周围的同事、朋友,无一不提G色变,只要提起OpenGL没有不知道的,但都害怕得要命,已经变成了一种习惯性的思维。

感觉这种现状,确实不太好改变,新生需求的逼迫,也迫使不少人硬着头皮研究、使用,发现这东西不光入门难,入门之后,琐碎的技术知识、计算多得很,要解决的问题也多不胜举。

但至少目前,我还在坚持着,目标明确就好了,朝着他一步一步地做,本来学习、研究和使用OpenGL ES就是个慢工夫的事儿。

转入正题,转一篇别人的 OpenGL中的抗锯贴子,不过很多功能在ES中没有,暂且保留,未来需要做抗锯时,有个切入点:

-----转自:http://www.cocoachina.com/bbs/read.php?tid=28590

各位,我们从第一讲到现在所绘制出的图形的边缘都会存在比较明显的犬齿印,如果边缘不处于水平、垂直或斜45度角的话。
这一讲,我们将介绍如何摆脱这大煞风景的犬齿。
抗犬齿的第一种做法是比较直观、易懂的。我们通过将线段边缘所覆盖到的像素面积进行判断,如果覆盖到了大部分的像素,那么使用线段颜色的比例就高,否则线段颜色的比例就低。
也就是说,我们通过淡化边缘覆盖到一个面积小的像素来达成抗犬齿效果。
我们可以看到红宝石书的第149页,图6-3。像素A、B、M以及N所覆盖到的像素面积很小,因此这些像素基本上就用背景色。

这种方式的算法是:将OpenGL片断的覆盖比例与alpha值相乘,并且将这个值作为新的alpha把片断与帧缓存中对应的像素进行混合。

我们下面将介绍一下如何多线段进行抗犬齿。
首先,我们要用glEnable()开启GL_LINE_SMOOTH,这个用于启动直线的抗犬齿功能。然后我们可以调用glHint()函数来指定,暗示OpenGL做何种质量的抗犬齿。
选项一般有:GL_FASTEST,这个是速度最快,但质量最差的;GL_NICEST,这个是速度最慢,但效果最好的;GL_DONT_CARE,这个是默认方式,没有偏向。
下面贴代码:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

//

//  MyView.m

//  OpenGLTest

//

//  Created
by Zenny Chen on 4/25/10.

//  Copyright
2010 GreenGames Studio. All rights reserved.

//  P44

 

#import
"MyView.h"

 

#include
<OpenGL/OpenGL.h>

#include
<math.h>

 

 

@implementationMyView

 

-
(
id)initWithFrame:(NSRect)frame
{

    self=
[
superinitWithFrame:frame];

    if(self)
{

        //
Initialization code here.

    }

    returnself;

}

 

 

staticconst

struct

VertexInfo

{

    GLfloat
vertices[3];

}vertexList[]
= {

    //
line 1

    {-0.8f,
0.0f, -2.0f},

    {-0.2f,
0.0f, -2.0f},

     

    //
line2

    {0.2f,
0.0f, -2.0f},

    {0.8f,
0.0f, -2.0f},

};

 

-
(
void)prepareOpenGL

{

    glEnable(GL_CULL_FACE);

    glEnable(GL_DEPTH_TEST);

     

    glEnableClientState(GL_VERTEX_ARRAY);

     

    glVertexPointer(3,
GL_FLOAT, 0, vertexList);

     

    glFrontFace(GL_CCW);

    glCullFace(GL_BACK);

     

    glShadeModel(GL_SMOOTH);

     

    glClearColor(0.4,
0.4, 0.4, 1.0);

     

    glViewport(0,
0, 320, 320);

     

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    glOrtho(-1.0,
1.0, -1.0, 1.0, 1.0, 5.0);

     

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    glRotatef(10.0f,
0.0f, 0.0f, 1.0f);

     

    glHint(GL_LINE_SMOOTH_HINT,
GL_NICEST);

    glBlendEquation(GL_FUNC_ADD);

    glBlendFunc(GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA);

    glLineWidth(1.5f);

}

 

-
(
void)drawRect:(NSRect)dirtyRect
{

     

    //
Drawing code here.

    glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT);

     

    glEnable(GL_BLEND);

    glEnable(GL_LINE_SMOOTH);

     

    glColor4f(1.0f,
0.0f, 0.0f, 1.0f);

    glDrawArrays(GL_LINES,
0, 2);

     

    glDisable(GL_BLEND);

    glDisable(GL_LINE_SMOOTH);

     

    glColor4f(0.0f,
1.0f, 0.0f, 1.0f);

    glDrawArrays(GL_LINES,
2, 2);    

     

     

    glFlush();

}

 

@end


时间: 2024-09-28 07:12:14

OpenGL ES 中抗锯齿处理的相关文章

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.5节2D动画的开发

2.5 2D动画的开发 Android 3D游戏开发技术宝典--OpenGL ES 2.0 虽然本书是着重介绍3D的开发技术,但在大部分的3D应用中也需要有不少的2D界面,如菜单.帮助等.本节将介绍一般用于开发游戏中2D界面的SurfaceView类的使用.其继承自View类,但与View的不同之处在于,View更新画面必须是在UI线程中(也可以理解为主线程中),而SurfaceView更新画面可以在自定义线程中进行,大大方便了开发. 提示 关于Android下的多线程问题,读者可以参考笔者在人

通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸_Android

当开发基于软件模式的游戏时,通过缩放视频缓冲区来适应显示尺寸是最棘手的问题之一.当面对众多不同的分辨率时(比如开放环境下的Android),该问题会变得更加麻烦,作为开发人员,我们必须尝试在性能与显示质量之间找到最佳平衡点.正如我们在第2章中看到的,缩放视频缓冲区从最慢到最快共有3种类型. 软件模拟:3中类型中最慢,但最容易实现,是没有GPU的老款设备上的最佳选择.但是现在大部分智能手机都支持硬件加速. 混合模式:这种方式混合使用软件模拟(创建图像缓冲区)和硬件渲染(向显示屏绘制)两种模式.这种

OpenGL ES 可用纹理单元数量与大量纹理的思考

OpenGL ES 可用纹理单元数量与大量纹理的思考 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 2013-12-29更新: 写完下面这些,感觉思路有些清晰了,可是我的中心意思,还没表达出来

通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸

当开发基于软件模式的游戏时,通过缩放视频缓冲区来适应显示尺寸是最棘手的问题之一.当面对众多不同的分辨率时(比如开放环境下的Android),该问题会变得更加麻烦,作为开发人员,我们必须尝试在性能与显示质量之间找到最佳平衡点.正如我们在第2章中看到的,缩放视频缓冲区从最慢到最快共有3种类型. 软件模拟:3中类型中最慢,但最容易实现,是没有GPU的老款设备上的最佳选择.但是现在大部分智能手机都支持硬件加速. 混合模式:这种方式混合使用软件模拟(创建图像缓冲区)和硬件渲染(向显示屏绘制)两种模式.这种

第二章 你好三角形:一个OpenGL ES 2.0例子

介绍基本概念的OpenGL ES 2.0,我们首先从一个简单的例子.在这一章里,我们将展示什么是需要创建一个OpenGL ES 2.0一个三角形的项目..我们要编写的程序是最基本的例子,一个OpenGL ES 2.0应用程序,绘制几何.有数量的概念,我们将介绍在本章: 1.创建一个屏幕渲染表面与EGL. 2.加载片段着色器和定点. 3.创建程序的对象,附着顶点和片段着色器,连接程序对象. 4.设置窗口. 5.清除颜色缓冲. 6.渲染一个简单的例子. 7.使内容的颜色缓冲可见在EGL窗口表面. 事

Android开发之OpenGL ES 颜色

一.基础知识: 1.平滑着色(Smooth coloring): 将多个顶点的不同颜色混合在一起,创建出漂亮的色彩混合. 2.单调着色: 给图形涂上一种固定单一的颜色. 3.三角形定义的颜色数组(平滑着色): [java] int one = 0x10000; //三角形的顶点颜色值(r,g,b,a) private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{ one,0,0,one, 0,one,0,one, 0,0,one,one, }

Android开发之OpenGL ES 画多边形

一.基础知识: OpenGL ES目前只支持三角形,但任何多边形都可拆分成多个三角形,所以无所谓这个限制的存在. 1.OpenGL中的坐标点: 每一个坐标点由(X, Y, Z)组成. 定义一个三角形的顶点数组: [java] int one = 0x10000; //三角形三个顶点 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{ 0,one,0, //上顶点 -one,-one,0, //左下点 one,-one,0,});

Android开发之OpenGL ES 基础

OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计. 该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准. 在Android中搭建一个3D开发的基本框架: 一.导入opengl es库: [java] import javax.microedition.khronos.egl.EGLConfig; import

ARKit &amp; OpenGL ES - ARKit 原理及实现

原理篇 如果你想了解更多关于OpenGL ES的知识,请移步至 OpenGL ES相关文章目录 本文所用的代码在https://github.com/SquarePants1991/OpenGLESLearn.git的ARKit分支中. iOS11推出了新框架ARKit,通过ARKit和SceneKit可以很方便的制作AR App.苹果也提供了AR基本的应用框架,你可以直接从此开始你的AR App的开发. 不过本系列文章将使用OpenGL ES为ARKit提供渲染支持,接下来我们先去了解一下AR