OpenGL ES学习001---绘制三角形
PS:OpenGL ES是什么?
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。OpenGL ES 是从 OpenGL 裁剪的定制而来的,去除了glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。经过多年发展,现在主要有两个版本,OpenGL ES 1.x 针对固定管线硬件的,OpenGL ES 2.x 针对可编程管线硬件。OpenGL ES 1.0 是以 OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以 OpenGL 1.5 规范为基础的,它们分别又支持 common 和 common lite两种profile。lite profile只支持定点实数,而common profile既支持定点数又支持浮点数。 OpenGL ES 2.0 则是参照 OpenGL 2.0 规范定义的,common profile发布于2005-8,引入了对可编程管线的支持。
百度百科有详细说明。
下面我们来绘制三角形,大家都知道OpenGL 基础只能 画点、点线、三角形。如果想要画矩形,就要两个三角形来拼接,中间可以随意设置颜色。如果用点线的话,中间就会是空的,我们就没有办法加入颜色。
三维效果类似于如图:
本例绘制三角形效果图:
1:首先要创建一个Activity文件,添加一个画布,GLSurfaceView可以在xml文件中定义,也可以直接动态创建对象,本文是动态添加对象
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
GLSurfaceView view = new GLSurfaceView(this);
view.setRenderer(new OpenGLRenderer());//添加渲染器
setContentView(view);
}
2:创建渲染器OpenGLRenderer,渲染器就是用来画图的,大小、形状、颜色等。
实现接口并重写三个方法。
class OpenGLRenderer implements GLSurfaceView.Renderer {
public OpenGLRenderer(){
}
//写不常变的属性,如背景颜色
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0f, 0f, 0.5f);
// 启用顶点数组(否则glDrawArrays不起作用)
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
//期间的变化
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0,0,width,height);//设置大小
}
private float[] mTriangleArray = {
// X, Y, Z 这是一个直角三角形,中心点为屏幕中心
-0.5f, 0.5f, 0, -0.5f, -0.5f, 0, 0.5f, -0.5f, 0 };
//画图操作
@Override
public void onDrawFrame(GL10 gl) {
Log.i("111", "onDrawFrame");
// 清除屏幕和深度缓存(如果不调用该代码, 将不显示glClearColor设置的颜色)
// 同样如果将该代码放到 onSurfaceCreated 中屏幕会一直闪动
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
}
}
3:具体绘制
//画图操作
@Override
public void onDrawFrame(GL10 gl) {
Log.i("111", "onDrawFrame");
// 清除屏幕和深度缓存(如果不调用该代码, 将不显示glClearColor设置的颜色)
// 同样如果将该代码放到 onSurfaceCreated 中屏幕会一直闪动
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
FloatBuffer mTriangleBuffer = BufferUtil.floatToBuffer(mTriangleArray);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
//
gl.glLoadIdentity();
// 平移 (矩阵相乘)//默认是剧中的,也就是说中间是xyz轴中心。
gl.glTranslatef(-0.3f, -0.3f, 0f);
}
创建一个BufferUtil,目的是吧Array转成buffer
static class BufferUtil {
public static FloatBuffer mBuffer;
public static FloatBuffer floatToBuffer(float[] a) {
// 先初始化buffer,数组的长度*4,因为一个float占4个字节
ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);
// 数组排序用nativeOrder
mbb.order(ByteOrder.nativeOrder());
mBuffer = mbb.asFloatBuffer();
mBuffer.put(a);
mBuffer.position(0);
return mBuffer;
}
}
完
- Stanford机器学习笔记-3.Bayesian statistics and Regularization
- 在R中使用支持向量机(SVM)进行数据挖掘
- 【你问我答】你与Java大牛的距离,只差这24个问题
- Android漏洞扫描工具Code Arbiter
- Huawei HG532 系列路由器远程命令执行漏洞分析
- postMessage与postMessage跨域
- 【手把手教你做项目】自然语言处理:单词抽取/统计
- D-Link系列路由器漏洞挖掘入门
- 大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
- 在Atom中设置Python开发环境
- Kaggle赛题解析:逻辑回归预测模型实现
- Shield:支撑美团点评品类最丰富业务的移动端模块化框架开源了
- 点击块,让小块动起来 - 函数封装
- 玩玩文本挖掘-wordcloud、主题模型与文本分类
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 项目实战 | 细节决定成败的渗透测试
- 构建Rasa低成本的Docker开发部署环境
- JsonPath实践(五)
- 项目实战 | 细节决定成败的渗透测试
- 工具的使用 | CobaltStrike证书修改躲避流量审查
- 一分钟学Python|Python的集合
- 遇到个小BUG之后
- 小白学PyTorch | 1 搭建一个超简单的网络
- 小白学PyTorch | 动态图与静态图的浅显理解
- Go 视图模板篇(五):模板布局和继承
- Go 视图模板篇(四):上下文感知与 XSS 攻击
- 引入 Laravel Mix 管理前端资源
- Go 视图模板篇(三):参数、管道和函数调用
- 基于独立的 Laravel Eloquent 组件编写 ORM 模型类
- 漫画:什么是 “跳表” ?