OpenGL ES学习(4)——投影和绘制

本文介绍了OpenGL ES 2.0在Android下的应用,讲解了摄像机位置的设置、两种投影(正交投影和透视投影)的概念及作用,详细阐述了光栅化过程和投影矩阵对视景体的影响。同时,讨论了OpenGL ES的绘制方法、合理的视角选择以及卷绕和背面裁剪的重要性,帮助开发者理解3D图形在OpenGL ES中的呈现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

【参考】

  1. https://www.khronos.org/opengles/
  2. 《OpenGL ES应用开发实践指南 Android卷 Kevin Brothaler》
  3. https://en.wikipedia.org/wiki/OpenGL_ES
  4. https://developer.android.google.cn/guide/topics/graphics/opengl
  5. https://developer.android.google.cn/training/graphics/opengl
  6. Android3D游戏开发技术宝典OpenGL ES 2.0
  7. 着色器语言
  8. OpenGL ES Shading Language
  9. 光栅化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值