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方向是关键的3个信息。
2. OpenGL ES 2.0常用两种投影
回顾OpenGL ES 2.0的渲染管理图:
“光栅化”概念
光栅化:把顶点数据转换为片元的过程,具有将图转化为一个个栅格组成的图象的作用,特点是每个元素对应帧缓冲区中的一像素。
在光栅化之前,需要将3D物体投影到二维平面上,这就需要使用投影。
2.1 正交投影
应用程序会提供投影矩阵,管线会据此确定一个可视空间区域,称为视景体。视景体包括6个面:上平面(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 | 顶点按序每3个组成一个三角形绘制 |
GL_TRIANGLE_STRIP | 顶点按序依次组成三角形绘制,实际最后形成三角形带(会共用顶点) |
GL_TRIANGLE_FAN | 以传入管线的第一个顶点为中心点,其他作为边缘点绘制组成扇形的三角形 |
【点和线段源码下载】
4. 合理的视角
视角大可以观察到更宽范围内景物,但投影到照片里的景物较小;视角小可以观察到景物范围更窄,但投影到照片里的景物较大。
- near值不变的情况下,left、right、top、bottom值越大,视角越大,反之视角越小;
- 在left、right、top、bottom值不变情况下,near值越小,视角越大,反之视角越小;
- 开发中,除了考虑视角还要考虑物体变型,不能随意选择组合;
5.卷绕和背面裁剪
5.1 卷绕–确定正面还是反面
摄像机观察一个三角形时候,三角形3个顶点的绘制顺序定义了该形状的环绕方向。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
- 光栅化