浅学OpenGLES2.0
来源:互联网 发布:蓝带 知乎 编辑:程序博客网 时间:2024/06/03 13:29
一.OpenGLES2.0原理浅析
1.
2.
每种变换都可以由相应的Matrix静态方法生成相应的变换矩阵。 坐标系原点在屏幕中央,z轴正方向垂直屏幕向外。
行为
变换
记录变换方式的放法
记录变换方式的[4*4]矩阵
眼睛相对物体的位置改变
视图变换
Matrix.setLookAtM(mVMatrix,
cx, cy, cz,//相机位置,
tx, ty, tz,//观察点位置
upx, upy, upz//顶部朝向
)
mVMatrix[16]
物体平移
模型变换
Matrix.translateM(
mMMatrix,
0,//偏移量
x, y, z//平移量
)
mMMatrix[16]
物体按坐标缩放比例缩放
Matrix.scaleM(
mMMatrix,
sx,sy, sz//缩放因子
)
物体旋转
Matrix.rotateM(
mMMatrix,
0,//偏移量
angle,//旋转角度
x, y, z//需要旋转的轴
)
凸透镜眼睛
投影变换
Matrix.frustumM(
mPMatrix,
0,//偏移量
left,right,
buttom,top,
near,far//near>0
)
mPMatrix[16]
平面透镜眼睛
Matrix.orthoM(
mPMatrix,
0,//偏移量
left,right,
buttom,top,
near,far//near>0
)
PS: 如果眼睛不是凸透镜而是平面透镜, 则不会产生近小远大的效果, 视图变换可由人眼模拟。函数参数都是float。
变换叠加: 可通过变换矩阵相乘得出想要的变换矩阵: Matrix.multiplyMM(
mMVPMatrix,
0,
3.
点
GLES20.GL_POINTS
线
GLES20.GL_LINES
GLES20.GL_LINE_STRIP
GLES20.GL_LINE_LOOP
面
GLES20.TRIANGLES
GLES20.TRIANGLE_TRIP//条带,可间断
GLES20.TRIANGLE_FAN//扇面
非索引法:GLES20.glDrawArrays(GLES20.GL_POINTS, 0, vCount);
索引法 :GLES20.glDrawElements(GLES20.GL_POINTS, iCount,GLES20.GL_UNSIGNED_BYTE,
二.android的openGLES2.0程序设计框架浅析
1.主要实现流程有如下顺序的几点操作:
定义物体顶点信息–>编辑着色器代码 –> 编译连接着色器程序 -> 物体顶点信息传入着色器 –> GLSurfaceView加载Renderer –> Activity加载GLSurfaceView -> 渲染物体输出屏幕
操作名称
一般实现方法
定义物体顶点信息
(1)三维坐标信息; (2)三维法向量信息;(3)颜色信息或二维贴图坐标信息;
编辑着色器代码
编译连接着色器
主要方法:(1. InputStream in = rgetAssets .open(fname);
(1.
int shaderId= GLES20.glCreateShader(shaderType);// shaderType
如果申请成功则返回的shaderId不为零
(2.
GLES20.glShaderSource(shaderId, source);///source是脚本字符串
GLES20.glCompileShader(shaderId);///编译
intcompiles[1];
GLES20.glGetShaderiv(shaderId, GLES20._GL_COMPILE_STATUS,compiles, 0);///查看编译情况
if(compiles[0] == 0){//编译失败,释放申请的着色器
}
(1.
(2.
while((error =GLES20.glGetError()) != GLES20.GL_NO_ERROR){
}
(3.
GLES20.glLinkProgram(program);
intLinkStatus[1];
GLES20.glGetPromgramiv(program,GLES20.GL_LINK_STATUS, LinkStatus, 0);
if(LinkStatus[0]!=GLES20.GL_TRUE){
GLES20.glDeletePromgram(program);
program =0;
}
物体顶点信息传入着色器
获取着色器参数ID
传入数据
使用数据:GLES20.glEnableVertexAttribArra
GLSurfaceView加载Renderer
setEGLContextClientVersi
setRanderer(new MyRenderer());//增添渲染器
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//主动渲染模式
}
- 浅学OpenGLES2.0
- 浅学OpenGLES2.0
- 浅学OpenGLES2.0
- openglES2.0 时代来临?
- opengles2.0中的纹理
- opengles2.0 shader备忘
- OpenGLes2.0 什么是Pbuffer
- ndk opengles2.0 配置
- Opengles2.0入门
- OpenGLES2.0笔记
- OpenGLES2.0 概念
- OpenGLES2.0原理浅析
- opengles2.0 headfirst Simple_VertexShader
- Android OpenGLES2.0(一)——了解OpenGLES2.0
- Android OpenGLES2.0(一)——了解OpenGLES2.0
- Android opengles2.0 背景透明
- opengles2.0 programming guide: attribute
- opengles2.0 显示yuv数据
- django admin上传文件和图片
- openpyxl - 学习目录
- HDU 2059 龟兔赛跑
- Python练习100例-4
- 关于libcurl下载数据不全的bug
- 浅学OpenGLES2.0
- 广播的两种形式
- HACM 2104 hide handkerchief
- hdoj1003
- 【Lifht-oj】-1067-Combinations(Lucas定理&逆元)
- Qt 判断数据库db中 table是否已经创建
- AngularJS之用户输入验证
- Git的常用命令
- linux兴趣小组暑假第七次讲座总结