1.相机的位置
Android下使用Matrix.setLookAtM()设置相机位置参数:
/** * * @param eyeX 相机X位置 * @param eyxY 相机y位置 * @param eyeZ * @param centerX 目标点x位置 * @param centerY * @param centerZ * @param upx x轴向上向量的重量 * @param upy * @param upz */ Matrix.setLookAtM(mVMatrix, 0, eyeX, eyxY, eyeZ, centerX, centerY, centerZ, upx, upy, upz);
相机的位置、观察方向和UP方向是三个关键信息。
2. OpenGL ES 2.两种两种投影
回顾OpenGL ES 2.0渲染管理图:
光栅化的概念
光栅化:将顶点数据转换为片元的过程具有将图像转换为格栅组成的图像的功能,其特征是每个元素对应帧缓冲区的一像素。
在光栅化之前,D在二维平面上投影物体需要投影。
2.1 正交投影
应用程序将提供投影矩阵,管道将确定视觉空间区域,称为视觉体。视觉体包括六个表面:上平面(up)、下平面(down)、左平面(left)、右平面(right)、远平面(far)、近平面(near)。视觉体内的物体会被投影到近平面上,视觉体外会被剪掉。
正交投影是平行投影,视场为长方体,投影到近平面的图形不会产生近大远小的效果。
/** * 正交投影 * * @param left * @param right * @param bottom * @param top * @param near * @param far */ Matrix.orthoM(mProjMatrix, 0, left, right, bottom, top, near, far);
2.2 透视投影
透视投影可以达到更真实的人眼世界效果——近大远小。透视投影的投影线与视点相交,视觉体为锥形区域。
/** * 设置透视投影 * * @param left * @param right * @param bottom * @param top * @param near * @param far */ Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far);
3.OpenGL ES绘制
OpenGL ES支持绘制:点、线段和三角形
绘制方式 | 说明 |
---|---|
GL_POINTS | 绘制点 |
GL_LINES | 绘制线段,绘制两个组织,奇数忽略最后一个 |
GL_LINE_STRIP | 按顺序绘制顶点 |
GL_LINE_LOOP | 按顺序绘制顶点,形成环 |
GL_TRIANGLES | 每三个顶点按顺序组成一个三角形 |
GL_TRIANGLE_STRIP | 顶点依次形成三角形绘制,实际上最终形成三角形带(共享顶点) |
GL_TRIANGLE_FAN | 以传入管道的第一个顶点为中心点,其他三角形作为边缘点绘制 |
点和线段源码下载
4. 合理的视角
大视角可以观察到更广泛的内景,但投影到照片中的景物较小;小视角可以观察到景物范围较窄,但投影到照片中的景物较大。
- near值不变的情况下,left、right、top、bottom值越大,视角越大,反之亦然;
- 在left、right、top、bottom值不变,near值越小,视角越大,反之亦然;
- 在开发过程中,除视角外,还应考虑物体变形,不能随意选择组合;
5.卷绕和背面切割
5.1 卷绕–确定正面还是反面
当摄像机观察三角形时,三角形三个顶点的绘制顺序定义了形状的环绕方向。OpenGL ES中规定: 也可以设置代码
///设置逆时针为正方向 GLES20.glFrontFace(GLES20.GL_CCW); ///顺时针设置为正方向 GLES20.glFrontFace(GLES20.GL_CW);
5.2 背面裁剪
背面切割:渲染管道在绘制构成立体物体的三角形图元时,只有在摄像机观察点位于三角形正面时才绘制三角形,而观察点位于背面则不绘制。
//打开背面切割 GLES20.glEnable(GLES20.GL_CULL_FACE);
【参考】
- https://www.khronos.org/opengles/
- 《OpenGL ES应用开发实践指南 Android卷 Kevin Brothaler》
- https://en.wikipedia.org/wiki/OpenGL_ES
- https://developer.android.google.cn/guide/topics/graphics/opengl
- https://developer.android.google.cn/training/graphics/opengl
- Android3D游戏开发技术宝典OpenGL ES 2.0
- 着色器语言
- OpenGL ES Shading Language
- 光栅化