基本数据类型
GLenum: 用于GL枚举的无符号整型。通常用于通知OpenGL由指针传递的存储于数组中数据的类型(例如,GL_FLOAT用于指示数组由GLfloat组成)。
GLboolean: 用于单布尔值。OpenGL ES还定义了其自己的“真”和“假”值(GL_TRUE和GL_FALSE)以避免平台和语言的差别。当向OpenGL传递布尔值时,请使用这些值而不是使用YES或NO(尽管由于它们的定义实际没有区别,即使你不小心使用了YES或NO。但是,使用GL-定义值是一个好的习惯。)
GLbitfield: 用于将多个布尔值(最多32个)打包到单个使用位操作变量的四字节整型。我们将在第一次使用位域变量时详细介绍,请参阅 wikipedia
GLbyte: 有符号单字节整型,包含数值从-128 到 127
GLshort: 有符号双字节整型,包含数值从−32,768 到 32,767
GLint: 有符号四字节整型,包含数值从−2,147,483,648 到 2,147,483,647
GLsizei: 有符号四字节整型,用于代表数据的尺寸(字节),类似于C中的size_t
GLubyte: 无符号单字节整型,包含数值从0 到 255。
GLushort: 无符号双字节整型,包含数值从0 到 65,535
GLuint: 无符号四字节整型,包含数值从0 到 4,294,967,295
GLfloat: 四字节精度IEEE 754-1985 浮点数
GLclampf: 这也是四字节精度浮点数,但OpenGL使用GLclampf特别表示数值为0.0 到 1.0
GLvoid:void值用于指示一个函数没有返回值,或没有参数
GLfixed: 定点数 使用整型数存储实数。由于大部分计算机处理器在处理整型数比处理浮点数快很多,这通常是对3D系统的优化方式。但因为iPhone具有用于浮点运算的矢量处理器,我们将不讨论定点运算或GLfixed数据类型。
GLclampx: 另一种定点型,用于使用定点运算来表示0.0 到 1.0之间的实数。正如GLfixed,我们不会讨论或使用它。
存储修饰符
const:本地变量只能使用存储修饰符const。函数参数只能用const。函数返回值类型和结构体字段不要使用const。命名的编译时常量可以用const声明。任何使用const声明的变量在其所属的着色器中均是只读的。将变量声明为常量可以减少使用硬连线的数字常数。const可以用来修饰任何基本数据类型。通常const变量在声明的同时要进行初始化。
attribute:用于声明通过OpenGL ES应用程序传递到顶点着色器中的变量值。在其它任何非顶点着色器的着色器中声明attribute变量是错误的。在顶点着色器被程序使用之前,attribute变量是只读的。attribute变量的值通过OpenGL ES顶点API或者作为顶点数组的一部分被传进顶点着色器。它们传递顶点属性值到顶点着色器,并且在每一个运行的顶点着色器中都会改变。attribute修饰符只能修饰float, vec2, vec3, vec4,mat2,mat3,mat4。attribute变量不能声明为数组或结构体,如 attribute vec4 position;。
uniform:修饰符用来修饰那些在整个图元被处理的过程中保持不变的全局变量。所有的uniform变量都是只读的,可以通过应用程序调用API命令初始化,或者通过OpenGL ES间接初始化。
varying:提供了顶点着色器,片元着色器和二者通讯控制模块之间的接口。顶点着色器计算每个顶点的值(如颜色,纹理坐标等)并将它们写到varying变量中。顶点着色器也会从varying变量中读值,获取和它写入相同的值。如果从顶点着色器中读取一个尚未被写入的varying变量,将返回未定义值。
参数修饰符
函数参数修饰符有如下几种:
(1)in,作为函数的传入参数
(2)out,作为函数的传出参数
(3)inout,即作为传入参数,又作为传出参数
默认情况下为in
精度修饰符
精度:用于存储和展示浮点数、整数变量的范围和精度依赖于数值的源(varying,uniform,纹理查找,等等),是不是顶点或者片元着色器,还有其他一些底层实现的细节。
顶点语言必须提供一种至少16位,加上一个符号位的整数精度
。
片元语言提供与顶点着色器相同的浮点数范围和精度是很有必要的,但不是必须的。这就需要片元语言提供的浮点数的范围至少是(-16384,+16384),精度至少是1024。
片元语言必须提供一种至少10为,加上一个符号位的整数精度。
精度修饰符:任何浮点数或者整数声明前面都可以添加如下精度修饰符:
举例:lowp float color;varying mediump vec2 Coord;lowp ivec2 foo(lowp mat3);highp mat4 m;
精度修饰符声明了底层实现存储这些变量必须要使用的最小范围和精度。实现可能会使用比要求更大的范围和精度,但绝对不会比要求少。
以下是精度修饰符要求的最低范围和精度:
基本绘制流程
1.创建一个OpenGL ES 上下文
EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2; //使用OpenGL ES 2.0版本
_context = [[EAGLContext alloc] initWithAPI:api]; //创建上下文
if (!_context) {
NSLog(@"Failed to initialize OpenGLES 2.0 context");
exit(1);
}
if (![EAGLContext setCurrentContext:_context]) { //设定上下文
NSLog(@"Failed to set current OpenGL context");
exit(1);
}
</br>
2.绑定Renderbuffers
glGenRenderbuffers(1, &_colorRenderBuffer); //创建一个新的render buffer object,用于存放渲染过的图像。这里返回一个唯一的integer来标记render buffer(这里把这个唯一值赋值到_colorRenderBuffer)。有时候你会发现这个唯一值被用来作为程序内的一个OpenGL 的名称。
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer); //告诉OpenGL:我在后面引用GL_RENDERBUFFER的地方,其实是想用_colorRenderBuffer。其实就是告诉OpenGL,我们定义的buffer对象是属于哪一种OpenGL对象
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; //为render buffer分配空间
</br>
3.绑定FrameBuffer
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, _colorRenderBuffer); // 把前面创建的buffer render依附在frame buffer的GL_COLOR_ATTACHMENT0位置上。
</br>
4.渲染
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0); //设置一个RGB颜色和透明度
glClear(GL_COLOR_BUFFER_BIT); //“填色”动作,GL_COLOR_BUFFER_BIT声明要清理那个缓冲区
[_context presentRenderbuffer:GL_RENDERBUFFER]; //将缓冲区(render buffer和color buffer)的颜色呈现到UIView上