Android OpenGLES2.0绘制三角形(二)

选择绘制三角形作为OpenGL ES 2.0的第一个实例,是因为前文中提到的,点、线、三角形是OpenGL ES世界的图形基础。无论多么复杂的几何物体,在OpenGL ES的世界里都可以用三角形拼成。关于Android OpenGL ES 三角形的绘制,在Android官方文档中有详细的说明和步骤,本文实例也是依照官方文档步骤绘制的三角形。

步骤

依照官方文档中的说明,Android中利用OpenGL ES 2.0绘制三角形的步骤为:

1. 在AndroidManifest.xml文件中设置使用的OpenGL ES的版本:

<!-- Tell the system this app requires OpenGL ES 2.0. --> <uses-feature android:glEsVersion="0x00020000" android:required="true" />

3.0的版本为0x00030000,3.1的版本为0x00030001。
需要注意的是前一篇博客中提到的Android各个版本对于OpenGL ES版本的支持,设置Android应用的minSDK不应该小于使用的支持OpenGL ES版本的最低Android SDK版本。

2. 毫无疑问的,显示三角形,需要一个载体。创建显示三角形的Activity,利用GLSurfaceView作为显示三角形的View,图形的具体渲染工作都是在Render中完成的。

3. 实现GLSurfaceView的Render,在Render中完成三角形的绘制,具体行为有:

加载顶点和片元着色器 确定需要绘制图形的坐标和颜色数据 创建program对象,连接顶点和片元着色器,链接program对象。 设置视图窗口(viewport)。 将坐标数据颜色数据传入OpenGL ES程序中 使颜色缓冲区的内容显示到屏幕上。

具体实现

我们设置好OpenGL ES版本、创建入口Activity并设置好GLSurfaceView做为显示载体后,就进入了我们最主要的工作了。

第一步

首先,我们需要编写一个简单的顶点着色器和一个简单的片元着色器:
顶点着色器:

attribute vec4 vPosition; void main() { gl_Position = vPosition; }

片元着色器:

precision mediump float; uniform vec4 vColor; void main() { gl_FragColor = vColor; }

gl_Position和gl_FragColor都是Shader的内置变量,分别为定点位置和片元颜色。

第二步

然后,我们确定我们要绘制的图形的顶点坐标和颜色:
我们现在需要绘制的是在一个三维空间中绘制一个三角形,三角形当然是三个顶点了。因为我们三角形只是一个平面图形,为了方便,我们现在不设置相机(相机在后面的博客中使用时在讲解)的情况下,三角形正对我们来呈现。所以我们把三个顶点的Z坐标都设定为0。
上篇博客中也有提到OpenGL ES坐标映射到屏幕上,从屏幕中心垂直到上下左右边缘距离都为1.0,所以(-1.0,0,0)和(0,1.0,0)到原点的距离在屏幕上呈现出来的结果是不一样的,图解如下(左边是理想状态,右边是实际状态):

所以,为了不超出屏幕,我们的坐标数据设置为:

float triangleCoords[] = { 0.5f, 0.5f, 0.0f, // top -0.5f, -0.5f, 0.0f, // bottom left 0.5f, -0.5f, 0.0f // bottom right };

颜色数据,我们设置为单一颜色:

float color[] = { 1.0f, 1.0f, 1.0f, 1.0f }; //白色

第三步

接着我们开始在Render中实现我们的三角形绘制了。Render接口有三个方法,分别为onSurfaceCreated、onSurfaceChanged和onDrawFrame。
在onSurfaceCreated方法中,我们来创建program对象,连接顶点和片元着色器,链接program对象。

//将背景设置为灰色 GLES20.glClearColor(0.5f,0.5f,0.5f,1.0f); //申请底层空间 ByteBuffer bb = ByteBuffer.allocateDirect( triangleCoords.length * 4); bb.order(ByteOrder.nativeOrder()); //将坐标数据转换为FloatBuffer,用以传入给OpenGL ES程序 vertexBuffer = bb.asFloatBuffer(); vertexBuffer.put(triangleCoords); vertexBuffer.position(0); int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); //创建一个空的OpenGLES程序 mProgram = GLES20.glCreateProgram(); //将顶点着色器加入到程序 GLES20.glAttachShader(mProgram, vertexShader); //将片元着色器加入到程序中 GLES20.glAttachShader(mProgram, fragmentShader); //连接到着色器程序 GLES20.glLinkProgram(mProgram);

第四步

在onSurfaceChanged中设置设置视图窗口:

GLES20.glViewport(0,0,width,height);

第五步

最后在onDrawFrame中绘制:

//将程序加入到OpenGLES2.0环境 GLES20.glUseProgram(mProgram); //获取顶点着色器的vPosition成员句柄 mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); //启用三角形顶点的句柄 GLES20.glEnableVertexAttribArray(mPositionHandle); //准备三角形的坐标数据 GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); //获取片元着色器的vColor成员的句柄 mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); //设置绘制三角形的颜色 GLES20.glUniform4fv(mColorHandle, 1, color, 0); //绘制三角形 GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); //禁止顶点数组的句柄 GLES20.glDisableVertexAttribArray(mPositionHandle);

最终效果

源码地址

所有的代码全部在一个项目中,托管在Github上——Android OpenGLES 2.0系列博客的Demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-13 09:51:53

Android OpenGLES2.0绘制三角形(二)的相关文章

Android OpenGLES2.0绘制三角形(二)_Android

选择绘制三角形作为OpenGL ES 2.0的第一个实例,是因为前文中提到的,点.线.三角形是OpenGL ES世界的图形基础.无论多么复杂的几何物体,在OpenGL ES的世界里都可以用三角形拼成.关于Android OpenGL ES 三角形的绘制,在Android官方文档中有详细的说明和步骤,本文实例也是依照官方文档步骤绘制的三角形. 步骤 依照官方文档中的说明,Android中利用OpenGL ES 2.0绘制三角形的步骤为: 1. 在AndroidManifest.xml文件中设置使用

Android OpenGLES2.0等腰直角三角形和彩色的三角形(三)_Android

上一篇博客中我们已经绘制出了一个直角三角形,虽然我们相对于坐标,我们设置的直角三角形的两腰是相等的,但是实际上展示出来的却并不是这样,虽然通过计算,我们可以把三角形的两腰计算一下比例,使它们在坐标上不等,但是现实出来相等,但是当绘制的图形比较复杂的话,这个工作量对我们来说实在太庞大了.那么我们怎么做呢?答案是,使用变换矩阵,把计算交给OpenGL. 矩阵 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家

Android OpenGLES2.0等腰直角三角形和彩色的三角形(三)

上一篇博客中我们已经绘制出了一个直角三角形,虽然我们相对于坐标,我们设置的直角三角形的两腰是相等的,但是实际上展示出来的却并不是这样,虽然通过计算,我们可以把三角形的两腰计算一下比例,使它们在坐标上不等,但是现实出来相等,但是当绘制的图形比较复杂的话,这个工作量对我们来说实在太庞大了.那么我们怎么做呢?答案是,使用变换矩阵,把计算交给OpenGL. 矩阵 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家

了解Android OpenGLES2.0(一)_Android

什么是OpenGL ES? OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言.跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库. OpenGL在不同的平台上有不同的实现,但是它定义好了专业的程序接口,不同的平台都是遵照该接口来进行实现的,思想完全相同,方法名也是一致的,所以使用时也基本一致,只需要根据不同的语言环境稍有不同而已.OpenGL这套3D图形API从1992年发布的1.0版本到目前最新20

了解Android OpenGLES2.0(一)

什么是OpenGL ES? OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言.跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库. OpenGL在不同的平台上有不同的实现,但是它定义好了专业的程序接口,不同的平台都是遵照该接口来进行实现的,思想完全相同,方法名也是一致的,所以使用时也基本一致,只需要根据不同的语言环境稍有不同而已.OpenGL这套3D图形API从1992年发布的1.0版本到目前最新20

Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View

Android特效专辑(十二)--仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术不行,也太懒了 PS:这个view也是我模仿了人家的效果,参考了人家的思路写的,不是纯手撸,罪过罪过,网上应该也能找到很多这样的效果,我只是加入了一些自己的需求在里面 我么新建一个工程--Whew RoundImageView 这个之前讲过,网上 的粒子,把头像变成圆形的,这里就不多说了,直接撸代码

Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现

Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还是要追究一下原理怎么做的,我们新建一个GifLibrary,然后右键Properties--Android,我们把架包勾上 然后我们新建一个类GifSurfaceView继承自SurfaceView并且实现它的Callback接口 GifSurfaceView package com.lgl.gif

ios移植-使用OPENGLES2.0在安卓上如何实现增量点绘?

问题描述 使用OPENGLES2.0在安卓上如何实现增量点绘? 我在iOS上使用openGLES2.0实现了一个增量点绘的功能. 即我点击屏幕的某个位置,则在那个位置增加一个三角形. 我使用的是GLKView,在 -(void)glkView:(GLKView *)view drawInRect:(CGRect)rect; 里调用如下方法 (不clear) glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPoin

Android中google Zxing实现二维码与条形码扫描

Android中google Zxing实现二维码与条形码扫描 了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心. 随着微信的到来,二维码越来越火