OpenGL ES学习001---绘制三角形

时间:2022-09-21 09:14:15

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 基础只能 画点、点线、三角形。如果想要画矩形,就要两个三角形来拼接,中间可以随意设置颜色。如果用点线的话,中间就会是空的,我们就没有办法加入颜色。

三维效果类似于如图:

OpenGL ES学习001---绘制三角形

本例绘制三角形效果图:

OpenGL ES学习001---绘制三角形

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

OpenGL ES学习001---绘制三角形的更多相关文章

  1. OpenGL ES学习笔记(三)——纹理

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <OpenGL ES学习笔记( ...

  2. OpenGL ES 学习笔记 - Overview - 小旋的博客

    移动端图形标准中,目前 OpenGL ES 仍然是比较通用的标准(Vulkan 则是新一代),这里新开一个系列用于记录学习 OpenGL ES 的历程,以便查阅理解. OverView OpenGL ...

  3. OpenGL ES学习笔记(一)&mdash&semi;&mdash&semi;基本用法、绘制流程与着色器编译

    首先声明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. 在Android.iOS等移动平台上 ...

  4. IOS 中openGL使用教程2(openGL ES 入门篇 &vert; 绘制一个多边形)

    在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...

  5. OpenGL ES学习笔记(二)&mdash&semi;&mdash&semi;平滑着色、自适应宽高及三维图像生成

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...

  6. OpenGL ES 2&period;0 绘制方式

    OpenGL ES 中支持的绘制方式大致分3类,包括点.线段.三角形,每类中包括一种或多种具体的绘制方式. GL_POINTS 传入渲染管线的一系列顶点单独进行绘制. GL_LINES   传入渲染管 ...

  7. OpenGL ES学习资料总结

    从今年春节后开始学习OpenGL ES,发现网上资料很有限,而且良莠不齐,所以整理了一下我学习时用到的资料和一些心得. 1. OpenGL ES1.x参考资料 把NEHE的教程移植到了Android上 ...

  8. Android OpenGL ES 开发:绘制图形

    OpenGL 绘制图形步骤 上一篇介绍了 OpenGL 的相关概念,今天来实际操作,使用 OpenGL 绘制出图形,对其过程有一个初步的了解. OpenGL 绘制图形主要概括成以下几个步骤: 创建程序 ...

  9. Android OpenGL ES(十一)绘制一个20面体 &period;

    前面介绍了OpenGL ES所有能够绘制的基本图形,点,线段和三角形.其它所有复杂的2D或3D图形都是由这些基本图形构成. 本例介绍如何使用三角形构造一个正20面体.一个正20面体,有12个顶点,20 ...

随机推荐

  1. bzoj 3124&colon; &lbrack;Sdoi2013&rsqb;直径

    #include<cstdio> #include<iostream> #define M 400009 #define ll long long using namespac ...

  2. 【Avalon】factory

    (function(global, factory) { if (typeof module === "object" && typeof module.expor ...

  3. 3月25日html&lpar;六&rpar; Javascrip

                             第1部分 JavaScript简介 1.JavaScript它是个什么东西? 它是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 2.它与J ...

  4. AngularJS 路由精分

    AngularJS 路由机制是由ngRoute模块提供,它允许我们将视图分解成布局和模板视图,根据url变化动态的将模板视图加载到布局中,从而实现单页面应用的页面跳转功能. AngularJS 路由允 ...

  5. Android初级教程进程间的通信AIDL

    在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...

  6. &lbrack;Swift-2019力扣杯春季决赛&rsqb;4&period; 有效子数组的数目

    给定一个整数数组 A,返回满足下面条件的 非空.连续 子数组的数目: 子数组中,最左侧的元素不大于其他元素. 示例 1: 输入:[1,4,2,5,3] 输出:11 解释:有 11 个有效子数组,分别是 ...

  7. 编程菜鸟的日记-《软件测试》Ron Patton著-读书笔记

    第一部分 软件测试综述 第一章 软件测试的背景 1.软件测试员的目标:尽可能早地找到软件缺陷,并确保其能得以修复. 2.仅仅测试程序是否按预期方式运行有何问题:程序能完好的跑通并不代表软件不存在缺陷, ...

  8. zrange 复杂度 O&lpar;log&lpar;N&rpar;&plus;M&rpar;, N 为有序集的基数,而 M 为结果集的基数

    redis 的 zrange 效率 - 简书 https://www.jianshu.com/p/40a66ff92768 ZRANGE key start stop [WITHSCORES] — R ...

  9. FineCMS v5&period;4&period;1 后台getshell

    0x01.前言 最近在学代码审计,拿finecms学习的时候偶然发现的,应该算个1day吧 0x02.正文 FineCMS v5.4.1 后台域名配置处 域名配置文件config/domain.php ...

  10. Practice5&period;1 测试与封装5&period;1

    结对同伴: 姓名 学号 博客地址 叶子鹏 201306114420 http://www.cnblogs.com/kazehanaai/ 王佳宁 201306114434 http://www.cnb ...