您的位置:首页 > 运维架构

opengles2——1.opengles介绍

2014-03-23 20:50 316 查看
【渲染管线】



【顶点着色器】



属性Attribute:顶点矩阵支持的Per_vertex数据

uniforms:顶点着色器使用的常量数据

samplers:被uniforms使用的特殊类型,在顶点着色器的贴图中使用,是可选的

顶点着色器的输出叫做varying变量,在最初的光栅化阶段,这些变量被计算,作为片段着色器的输入,从顶点着色器的矩阵使用插补的方法产生片段着色器的变量,输入和输出在上图描述。

顶点着色器被使用在传统的基于顶点的操作,如位移矩阵、计算光照方程、产生贴图坐标。下面的例子中,顶点着色器需要一个位置和颜色数据作为输入属性,输入位置数据是vec4向量,输出是变换后的位置和颜色:

// UNIFORMS
uniform mat4	u_mvpMatrix;	// 用来将P从模型空间model space转到标准化的设备空间normalized device space

// ATTRIBUTES
attribute vec4	a_position;		// 位置值
attribute vec4	a_color;		// 输入顶点颜色

// VARYINGS 输出到fragment shade片段着色器
varying vec4 	v_color;		// 输出顶点颜色

void main()
{
	v_color = a_color;
	gl_Position = u_mvpMatrix * a_position;
}
u_mvpMatrix应用存储模型的关联视图和投射矩阵。

【图元装配】

图元是能被opengles绘制的几何物体,描述了一个顶点属性和图元几何体以及图元类型的集合。

顶点属性包括计算位置、颜色和贴图坐标的信息,他们将被输入到片段着色器中。

顶点着色器能绘制的图元包括三角形、直线、点,对每个图元必须判断是否在视锥体内,在外可能被丢弃。

然后顶点位置被转换为屏幕坐标,剔除操作也能舍弃一些图元,根据图元位于正面还是背面。剪切和剔除后图元进入光栅化阶段。

【光栅化】

光栅化 是转换图元为二维片段的过程,被片段着色器执行,二维的片段像素能被绘制在屏幕上。



【片段着色器】




片段着色器使用下面的输入,执行光栅化后形成片段:

varying变量:光栅化阶段使用插补技术为片段着色器产生,顶点着色器的输入

uniforms:常量数据

samplers:特殊类型,在贴图中使用

片段着色器也能丢弃片段或产生一些颜色值像gl_FragColor,光栅化阶段产生的颜色、深度、模板、屏幕坐标(Xw, Yw)变成opengl es2.0管线输入,

下面显示片段着色器绘制一个gouraud三角形:

precision mediump float;

varying vec4	v_color;		// 从顶点着色器 输入的顶点颜色

void main()
{
	gl_FragColor = v_color;
}
第一行显示质量,片段着色器不需要定义输出,因为片段着色器仅仅输出的是gl_FragColor。

下一个操作是per-fragment操:



像素所有权测试:决定缓冲器某点的像素当前是否被opengles所有,例如窗口检测到缓冲区被另一个窗口遮挡,视图系统可决定遮挡部分不显示

剪切测试:测试某点是否在剪切矩形内,若在外片段被丢弃

模板深度测试:决定输入的片段是否该被拒绝

抖动:被使用在用几种颜色的组合模拟出大范围内的多种色彩模式

per-fragment阶段最后,片段颜色、深度值、模板值是否被写入缓冲区还要看各自的掩码位是否被使能。

opengles2也支持缓冲器数据读回功能,但仅颜色缓冲区像素能读回。且alpha测试盒logicop测试不再是per-fragment测试的部分。

因为片段着色器能丢弃片段,alpha测试能在片段着色器阶段执行。

【EGL】

opengles要求一个渲染上下文环境和绘图窗口,渲染上下文存储着opengl es状态的属性,绘图窗口决定那个窗口被绘制、

指出将要绘制的图形对颜色缓冲区、深度缓冲区、模板缓冲区的要求,还有每个缓冲区位数。

任何opengles在使用egl渲染前需要做下面的事情:

·查询设备上可用的显示器初始化它,例如一个翻盖手机又两个LCD屏幕,可渲染其中的一个或两个。

·创造一个渲染屏幕,EGL能创造隐藏平面或显示屏平面,显示屏平面联系着操作系统,隐藏平面联系着像素缓冲区。

·创造渲染上下文,EGL需要创造渲染上下文,它在实际使用前需要联系上合适的平面

【库和包含文件】

需要链接:libGLESv2.lib和ELG库libEGL.lib

需要包含的头文件:

#include <EGL/egl.h>

#include <GLES2/gl2.h>

#include <GLES2/gl2ext.h>

egl.h是egl头文件,gl2.h是opengles2.0头文件,gl2ext.h是opengles批准的扩展。

所有的EGL函数以egl前缀开始(如eglCreateWindowSurface),EGL数据类型开始,如EGLint和EGLenum。

所有的opengl函数以gl开始,组成函数的每个单词的首个字母大写(如glBlendEquation),同样数据类型以GL开始。

命令后缀和输入参数类型的描述:



opengles命令出错会产生一个错误码,能用glGetError查询。一旦错误码被查询,当前错误码将变成GL_NO_ERROR。

除了GL_OUT_OF_MEMORY错误码意外其他的错误码将被忽略,不影响程序运行状态。

【基本状态管理】

图1-1显示opengles2.0各种管线状态,每种状态能被使能或关闭,状态值被各自的线程维护,例如抖动、剔除、混合等。

当上下文被初始化时,这些状态被初始化。状态使能可用glEnable和glDisable命令设置。

初始化时除了GL_DITHER功能设置为GL_TRUE外,其他的功能都为GL_FALSE,若输入非法参数产生GL_INVALID_ENUM错误码。

可使用glIsEnabled函数查询某状态是否使能。特殊的状态值像混合因子,深度测试值等也使用glGet***函数查询。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: