OpenGLES 阅读笔记
Section 1: 基本概念
1> 使用GL定义的数据类型,好处是易移植, 保证数据的大小空间以及精度正确.
2> 只支持三角形.
3> 逆时针次序绘制顶点构成的面是frontface, 可见.
Section 2: 简单绘图
1> glLoadIdentity() 复位成单位矩阵
2> color buffer: 存储当前帧各像素的颜色, 基本上就是屏幕看到的
3> depth buffer: z-buffer 存储像素离观察者的距离信息, 用来确定一个像素是否要绘制. 精度不够的话会产生z-fighting
4> glEnableClientState(GL_VERTEX_ARRAY) 启动顶点数组功能, 告诉其我们使用何种方式提供顶点数据. 与glVertexPointer()匹配
5> glEnableClientState(GL_COLOR_ARRAY) 启动颜色数组功能, 告诉其我们使用何种方式提供颜色数据. 与glColorPointer() 匹配
6> glDrawElements() 使用顶点索引来降低重复顶点内存开销
Section 3: 透视
1> 正交投影: 射线不相交
glOrthorf( -1.0f, // left
-1.0 / (width/height), // bottom
1.0 / (width/height), // top
0.01, // Near
10000.0) // Far
2> 透视投影: 近大远小
GLFloat size = 0.01 * tanf(DEGREES_TO_RADIANS(45.f) / 2.f);
glFrustumf(-size, // Left
size, // Right
-size / (width / height), // Bottom
size / (width / height), // Top
0.01, // Near
10000.f) // Far
Section 4: 光效
1> 默认未开启光效, 只是提供一种十分单调的整体光让我们看见物体.
2> 阴影模型:
GL_FLAT: 将制定三角形上的每个像素具有相同的颜色
GL_SMOOTH: 平滑但较快速的阴影算法
3> glEnable(GL_LIGHTING) 启动光效, 只需要在设定时启动一次就可以了.
4> glEnable(GL_LIGHT0) 启动光源
5> glLightfv(GL_LIGHT0, GL_AMBIENT, light0Ambient) 设置环境光, 通常只指定一个光源的环境光
6> glLightfv(GL_LIGHT0, GL_DIFFUSE, light0Diffuse) 设置散射光, 定向光, 只有面向光源的物体面才会反射散射光
7> glLightfv(GL_LIGHT0, GL_SPECULAR, light0Specular) 设置高光, 会以热点和光晕的形式反射到观察者眼中
8> glLightfv(GL_LIGHT0, GL_POSITION, light0Position) 设置光源位置
9> glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light0Direction) 设置光照方向
10> glLightfv(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0) 设置光照角度 总角度为90.0, GL_SPOT_CUTOFF最大值为180.0
11> 使用手电筒光时, 需要表面法线来确定光线是怎样与各多边形交互作用的.
顶点法线:
12> glEnableClientState(GL_NORMAL_ARRAY) 启动法线数组
13> glNormalPointer(GL_FLOAT, 0, normals) 传递法线数组
Section 5: 材质
1> 材质是如何反射光效三要素的.
2> OpenGLES仅支持 GL_FRONT_AND_BACK 为正面和背面指定相同的材质
3> glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, ambientAndDiffuse) 同时指定环境光与散射光
4> glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular) 指定高光
5> glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 25.0) 指定高光热点, 值越大, 热点越小.
6> 高光通常在低面片物体上表现不好, 解决方案有两个 (1) shader (2) texture
7> 自发光,只会影响自己,其周边物体不会收到影响.
8> glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emission) 设置自发光颜色
Section 6: 纹理及纹理映射
1> glEnable(GL_TEXTURE_2D) 启动纹理映射功能, 只需要在启动时打开就可以了.
2> glEnable(GL_BLEND) 打开混色, 提供了通过指定源和目标怎样组合而合成图像的功能, 如纹理和多边形表面合成.
3> glBlendFunc(GL_ONE, GL_SRC_ONE) 混色函数,
4> 创建纹理最好在加载之前, 如果在显示之前创建,会引起明显的程序停顿
5> 纹理不能单独显示,必须映射到物体上
6> glGenTextures(1, &texture) 生成纹理, 是个GLuint
7> glBindTexture(GL_TEXTURE_2D, texture) 绑定纹理, 使其处于激活状态, OpenGLES只支持二维纹理
8> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) 纹理需要被收缩到适合多边形的尺寸时用到 简单的线性插值方法
9> mipmap技术 允许OpenGL选择最为接近的尺寸版本以避免过多的插值计算并且在物体远离观察者时通过使用更小的纹理来更好的管理内存. 不过iPhone的图形芯片在图像插值方面做的很好, 不需要考虑mipmap技术了.
10> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData) 加载纹理数据,
11> 加载纹理的两种方式
(1) UIImage 最普通的方式
(2) PVRTC: PoverVR MBX提供了对PVRTC压缩技术的硬件支持, 缺点时图像质量会下降,优点是可以节省大量的内存空间. texturetool 是命令行工具提供了将标准的jpeg/png 转化为pvrtc格式.
12> 纹理限制: 宽高必须为2的n次方, 若是pvrtc格式的话,源必须是正方形, 若不是可以给图像加黑边.
13> 纹理坐标y轴翻转 UIImage: 在context中给个翻转. PVRTX: 做图时就翻转
14> glEnableClientState(GL_TEXTURE_COORD_ARRAY) 打开纹理坐标数组
glTexCoordPointer(2, GL_FLOAT, 0, texCoords) 传递纹理坐标数组
15> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) S轴平铺
16> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) S轴clamp
Section 7: 矩阵
1> glMatrixModel(GL_MODELVIEW) 设置活动矩阵
2> 向量处理器可以完成硬件级别的矩阵相乘 (VFP数学库)
3> 多轴旋转使用矩阵会产生其中一个轴的旋转被锁定,可以使用四元数来实现我的
4> 可以实现剪切矩阵, 物体沿两轴扭转