逐帧读取VR视频的逐帧数据,之后通过着色器渲染到球体模型上,获取球体中心的作为视觉取镜点,通过重力感应接受头部移动向量方向,更新手机的映射取镜点。
有位大神写了一个模型转换为顶点数组的工具:https://github.com/HBehrens/obj2opengl
GLfloat squareVertexData[] =
{
0.5, -0.5, 0.0f, 1.0f, 0.0f, //右下
-0.5, 0.5, 0.0f, 0.0f, 1.0f, //左上
-0.5, -0.5, 0.0f, 0.0f, 0.0f, //左下
0.5, 0.5, -0.0f, 1.0f, 1.0f, //右上
};
//顶点索引
GLuint indices[] ={
0, 1, 2,
1, 3, 0
};
//顶点数据,前三个是顶点坐标, 中间三个是顶点颜色, 最后两个是纹理坐标
GLfloat attrArr[] =
{
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 1.0f,//左上
0.5f, 0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 1.0f, 1.0f,//右上
-0.5f, -0.5f, 0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f,//左下
0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 1.0f, 0.0f,//右下
-0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.5f, 0.0f, 1.0f,//后方左上
0.5f, 0.5f, 1.0f, 0.0f, 0.5f, 0.0f, 1.0f, 1.0f,//后方右上
-0.5f, -0.5f, 1.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f,//后方左下
0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.5f, 1.0f, 0.0f,//后方右下
};
//顶点索引
GLuint indices[] =
{
0, 3, 2,
0, 1, 3,
0, 4, 1,
5, 4, 1,
1, 5, 3,
7, 5, 3,
2, 6, 3,
6, 7, 3,
0, 6, 2,
0, 4, 6,
4, 5, 7,
4, 6, 7,
};
CPU的运算能力(每秒亿次级别)远高于其对内存的读写能力(每秒百万次级别),为了优化效率,避免产生数据饥饿,在OpenGL ES中,可以让程序从CPU的内存中复制数据到GPU控制的连续RAM缓存中,GPU在取得一个缓存数据之后,便会独占该缓存,从而尽可能有效的读写内存数据,缓存数据包含:几何数据、颜色、灯光效果等等。
2.2.1. 坐标系(笛卡尔坐标系):OpeGLES坐标系没有单位,点{1,0,0}到点{2,0,0}的距离就是沿着X轴的的1单位。 2.2.2. 矢量:矢量是理解现代GPU的关键,因为图形处理器就是大规模矢量处理器。 2.2.3. 点、线、三角形:OpenGLES只渲染顶点、线段和三角形。下图就是一种渲染案例,通过点、线、三角形渲染环形体。
由于iOS操作系统不会让应用直接向前帧缓存或者后帧缓存绘图,也不会让应用直接控制前帧缓存和后帧缓存之间的切换。所以iOS使用Core Animation合成器去控制所有绘制层的合成。(例如:StatusBar层+开发者提供的渲染层 = 屏幕最终显示像素)
GLKView/GLKViewController都是GLKit框架的一部分。GLKView是UIView的子类,GLKView简化了 通过CoreAnimation对于:创建帧缓存、管理帧缓存、绘制帧缓存的所需要作的工作。于GLKView相关的GLKViewController是视图的委托,并接收当视图需要重绘时的消息。
1. GLKBaseEffecty: 隐藏了iOS设备支持的多格OpenGLES版本之间的差异。在应用中使用BaseEffect能够减少代码量,例如简化避免我们去使用OpenGLES2中的Shading Lauguage。
4. glTexParameter :函数用于制定纹理的应用方式。[滤波模式(第14页)]
纹理放大与缩小如下图
/* TextureParameterName */
//提供纹理放大缩小滤波
#define GL_TEXTURE_MAG_FILTER 0x2800
#define GL_TEXTURE_MIN_FILTER 0x2801
#define GL_TEXTURE_WRAP_S 0x2802
#define GL_TEXTURE_WRAP_T 0x2803
@ glTexParameteri (GLenum target, GLenum pname, GLint param);
//glTexParameterf vs glTexParameteri:不同点在于 integer和 float类型入参。
//In the case where the pname (second) parameter is GL_TEXTURE_WRAP_S where you are passing an enum you should use glTexParameteri but for other possible values such as GL_TEXTURE_MIN_LOD and GL_TEXTURE_MAX_LOD it makes sense to pass a float parameter using glTexParameterf.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
#define GL_TEXTURE_WRAP_S 0x2802
#define GL_TEXTURE_WRAP_T 0x2803
点采样方法:最近纹素的纹理值。
线性滤波:最近领域(2x2)纹素加权平均值。