android opengl es 简单实例

Android OpenGL ES学习笔记之实现OpenGL ES接口 一、GLSurfaceView介绍 在Android平台上实现OpenGL的view很简单,只需要用到GLSurfaceView和GLSurfaceView.Renderer。 GLSurfaceView是用来连接OpenGL ES和android的view结构的.GLSurfaceView位于android.opengl包类,继承自SurfaceView public class GL 阅读详情

      我就是个悲剧的娃,想做个android的3d游戏,所以就把之前没看过的opengl拿过来看,一看不得了,这不,调试一个三角形和正方形就弄了这一晚上,严重影响了本人的睡眠,可能还会老几岁。。。。

      解决了Must use a native order direct Buffer ,及颜色绘不上去 的问题。废话不说了,把今天的实例贴上来,本实例分FirstGL 类与MyRenderer类。

      鉴于我也正忙着学其它的(比如jpct-ae),所以,也只能慢慢的把详细注释加上去,今晚先附上此篇的注释,后续的,我当然也会一点一点加上去的,但时不是那么快:-)

 

 

Activity类:

package sim.feel;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

/**
 * Activity类
 *
 * @author Sim
 *
 */
public class FirstGL extends Activity {
    // GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。
    // 更多GLSurfaceView信息见
    // http://120.132.134.205/cmdn/supesite/?uid-5358-action-viewspace-itemid-6527
    private GLSurfaceView glSurfaceView;

    // 这是渲染器(Render)的公共接口,它的任务就是调用OpenGL的API来作帧的渲染。
    // 更多MyRenderer信息见
    // http://dev.10086.cn/cmdn/supesite/?uid-5358-action-viewspace-itemid-6528
    private MyRenderer renderer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 实例化MyRenderer,GLSurfaceView类
        renderer = new MyRenderer();
        glSurfaceView = new GLSurfaceView(this);
        // 设置渲染器
        glSurfaceView.setRenderer(renderer);
        // 为当前Activity类指定视图
        setContentView(glSurfaceView);
    }
}

 

MyRenderer类:

 

package sim.feel;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

public class MyRenderer implements Renderer {
    // 关于0x10000注明:Thus 0x10000 means a hexadecimal memory address 10000
    // 就像cai_huan25大哥说的,大家把它理解为google画图单位就ok

    static int one = 0x10000;
    // Int型的缓冲区,下面定义了四个分别是三角形,正方形,三角形颜色,正方形颜色的缓冲区
    private static IntBuffer triangleBuffer;
    private static IntBuffer quaterBuffer;
    private static IntBuffer color1Buffer;
    private static IntBuffer color2Buffer;
    // 三角形顶点,分别对应x,y,z,因此程序为二维,所以z轴上皆为0
    private int[] vertices = new int[] {
            0, one, 0,
            -one, -one, 0,
            one, -one, 0
    };
    //以正方形为例,说明坐标轴:坐标中心位于正方形中心,下面四个顶点分别是右上角,左上角,右下角,左下角
    private int[] quater = new int[] {
            one, one, 0,
            -one, one, 0,
            one, -one, 0,
            -one, -one, 0
    };
    //定义每个顶点的颜色,每个顶点的颜色皆由(r,g,b,a)
    //三角形各顶点颜色(三个顶点)
    private int[] color = new int[] {
            one, 0, 0,one,
            0, one,0, one,
            0,0,one, one
    };
    //正方形各顶点颜色(4个顶点)
    private int[] color2 = new int[] {
            one, 0, 0, 0,
            one, one, 0, 0,
            one,one,one, 0,
            0, one, one, 0
    };

    //实现Renderer接口的方法onDrawFrame
    @Override
    public void onDrawFrame(GL10 gl) {
        //因为在glVertexPointer或者是glColorPointer方法中要求传入一个直接的Buffer,
        //所以下面的vbb1,vbb2,colorvbb1,colorvbb2皆为创建一个直接的Buffer
        //以第一个为例说明,首先用ByteBuffer的allocateDirect方法来分配新的直接字节缓冲区。
        //因1个Int有4个byte,所以将vertices的长度乘以4
        // order(ByteOrder.nativeOrder)方法以本机字节顺序来修改此缓冲区的字节顺序
        //然后用asIntBuffer方法创建此字节缓冲区的视图,作为 int 缓冲区。
        //put方法将给定 int 写入此缓冲区的当前位置,然后该位置递增。
        //position方法设置此缓冲区的位置。如果标记已定义并且大于新的位置,则要丢弃该标记。
       

        // triangle的ByteBuffer
        ByteBuffer vbb1 = ByteBuffer.allocateDirect(vertices.length * 4);
        vbb1.order(ByteOrder.nativeOrder());
        triangleBuffer = vbb1.asIntBuffer();
        triangleBuffer.put(vertices);
        triangleBuffer.position(0);

        // quater的ByteBuffer
        ByteBuffer vbb2 = ByteBuffer.allocateDirect(quater.length * 4);
        vbb2.order(ByteOrder.nativeOrder());
        quaterBuffer = vbb2.asIntBuffer();
        quaterBuffer.put(quater);
        quaterBuffer.position(0);

        // color的ByteBuffer
        ByteBuffer colorvbb1 = ByteBuffer.allocateDirect(color.length * 4);
        colorvbb1.order(ByteOrder.nativeOrder());
        color1Buffer = colorvbb1.asIntBuffer();
        color1Buffer.put(color);
        color1Buffer.position(0);

        // color2的ByteBuffer
        ByteBuffer colorvbb2 = ByteBuffer.allocateDirect(color2.length * 4);
        colorvbb2.order(ByteOrder.nativeOrder());
        color2Buffer = colorvbb2.asIntBuffer();
        color2Buffer.put(color2);
        color2Buffer.position(0);

        // 绘制Triangles
        // 清除屏幕和深度缓存
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        // 重置当前的模型观察矩阵
        gl.glLoadIdentity();

        //以下两步为绘制颜色与顶点前必做操作
        //(颜色可采用另一种简单方式,说见http://blog.youkuaiyun.com/Simdanfeg/archive/2011/03/17/6255932.aspx)
        // 允许设置顶点
        //GL10.GL_VERTEX_ARRAY顶点数组
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        // 允许设置颜色
        //GL10.GL_COLOR_ARRAY颜色数组
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

        // 左移1.5单位,并移入屏幕6.0
        gl.glTranslatef(-1.5f, 0.0f, -6.0f);

        //GL_FIXED,GL_FLOAT,GL_UNSIGNED_BYTE
        //更多信息见  http://www.devx.com/wireless/Article/32879/1954
        //参数中的GL_FIXED表示我们之前定义的one为单位长度

        // 设置三角形
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer);
        // 设置三角形颜色
        gl.glColorPointer(4, GL10.GL_FIXED, 0, color1Buffer);
        // 绘制三角形
        //GL10.GL_TRIANGLES:把每三个顶点作为一个独立的三角形。顶点3n-2,3n-1和3n定义了第n个三角形,总共绘制N/3个三角形。
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

        // 重置当前模型的观察矩阵
        gl.glLoadIdentity();

        // 左移1.5单位,并移入屏幕6.0
        gl.glTranslatef(1.5f, 0.0f, -6.0f);
        // 设置正方形
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
        // 设置正方形颜色
        gl.glColorPointer(4, GL10.GL_FIXED, 0, color2Buffer);
        //GL_TRIANGLE_STRIP:绘制一组相连的三角形。对于奇数点n,顶点n,n+1和n+2定义了第n个三角形;
        //对于偶数n,顶点n+1,n和n+2定义了第n个三角形,总共绘制N-2个三角形。

        // 绘制正方形
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

        // 取消颜色设置
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        // 取消顶点设置
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    }

    //实现Renderer接口的方法onSurfaceChanged
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        float ratio = (float) width / height;
        // 设置OpenGL场景的大小,(0,0)表示窗口内部视口的左下角,(w,h)指定了视口的大小
        gl.glViewport(0, 0, width, height);
        // 设置投影矩阵
        gl.glMatrixMode(GL10.GL_PROJECTION);
        // 重置投影矩阵
        gl.glLoadIdentity();
        // 设置视口的大小
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
        //以下两句告诉opengl es,以后所有的变换都将影响这个模型(即我们绘制的图形)
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    //实现Renderer接口的方法onSurfaceCreated
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

       
        // 告诉系统对透视进行修正(选择效率优先还是速度优先,这里我们选择速度优先)
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        // 用黑色来清除屏幕颜色
        gl.glClearColor(0, 0, 0, 0);
        // 启用阴影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);

        // 设置深度缓存
        gl.glClearDepthf(1.0f);
        // 启用深度测试
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 所做深度测试的类型
        gl.glDepthFunc(GL10.GL_LEQUAL);

    }
}

 

运行效果如下:

 

代码中的设置颜色和设置三角形、正方形的位置不要改动哈,不然出来的效果很奇怪。睡觉觉了

Android OpenGL ES(一)开发入门 早就听过大名鼎鼎的 OpenGL,却迟迟没有实践学习,有些惭愧。今天开始通过实践+博文方式学习掌握 OpenGL。此文对于 OpenGL 的学习分为以下部分: OpenGL 基础概念 OpenGL 坐标系理解 OpenGL 渲染管线 OpenGL 着色语言 OpenGL 基础概念 OpenGL OpenGL 即 Open Graphics Library,是一个功能强大、调用方便的底层图形库... 阅读详情

相关推荐

Android Studio + OpenGL ES 学习记录

Android Studio + OpenGL ES 学习记录 OpenGL是一种应用程序编程接口,它是一种可以对图形硬件设备特性进行访问的软件库,而OpenGL ES是OpenGL的子集,针对手机、PDA和游戏主机嵌入式设备而设计。OpenGL ES 是从 OpenGL 裁剪定制而来的,去除了 glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性,剩下最核心有用的部分。 简介 OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台的应用

huhfairy的博客 3015

Android OpenGL基础(二、坐标系统)

一、引言   在Android OpenGL基础(一、绘制三角形四边形)中,我们简单实现了绘制三角形的功能。大家可能会发现,我们声明的是一个标准设备坐标系下的等边三角形: class Triangle { // 三角形三个点的坐标值 private var triangleCoords = floatArrayOf( 0.0f, 0.5f, 0.0f, // top -0.5f, -0.5f, 0.0f, // bottom left

BC工坊 3876

OPENGL es版本和OGL 及android关系

OpenGL ES 1.0 and 1.1 - This API specification is supported by Android 1.0 and higher. OpenGL ES 2.0 - This API specification is supported by Android 2.2 (API level 8) and higher. OpenGL ES 3.0 - Th

自由理想的足迹 5254

OpenGL精简案例一

**//缓冲区 private final FloatBuffer vertexData;//上下文 private Context context;//float buffer大小 private static final int BYTES_PER_FLOAT = 4;//程序 private int program;//颜色着色器引用 private int aColorLocation;

Android小码家 540

Android studio中使用opengl es绘图

首先是使用android studio生成空白的模板文件,包含一个MainActivity文件, 在onCreate方法中参照如下注释进行修改 package com.example.wang.androiddemo; import android.opengl.GLSurfaceView; import android.support.v7.app.AppCompatActivity; i

wangrl的博客 2467

人工智能AI在软件测试和质量效能中的实际应用

人工智能在软件测试中应用,介绍chatGPT在测试中的应用,还有多个AI驱动的测试工具。

lindafang72的博客 1万+

Android 平台 OpenGL 环境搭建的两种方法及示例

static float triangleCoords[] = { // 按逆时针方向顺序// 设置颜色// 初始化顶点字节缓冲区// (每个浮点数占用4个字节)均同上。

说码解字 2722

移远EC800M CAT1模块HTTP POST实战:从AT指令到OneNet平台数据上报(附STM32代码)

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报到OneNet平台的完整流程,包含STM32实战代码。内容涵盖PDP上下文激活、HTTP服务配置、JSON数据包构建等关键技术要点,并提供硬件连接、状态机设计和错误处理等实用方案,助力开发者快速实现物联网设备稳定数据传输。

weixin_42565652的博客 507

Android核心开发之——OpenGL

OpenGL是一个跨平台的图形编程接口,用于实现2D和3D图形的渲染和处理。它提供了一系列函数和状态机来操作图形硬件,使开发者能够创建各种复杂的图形效果和交互式应用程序。OpenGL仅仅提供了底层的图形操作接口,开发者需要具备一定的图形学知识和编程技巧,才能充分利用OpenGL的功能。《Android核心技术手册》

鸿蒙的技术博客 1076

Palantir解密:“本体”的建模逻辑及其扩展方向

上一篇重点从对现实世界建模的角度探讨了“本体”在数字化架构中的核心意义。这里借Palantir的“本体”概念、解析Palantir只是起点,目标旨在以他山之石攻玉——探索数字世界的底层架构逻辑,最终为构建自主体系提供思考。Palantir以“本体论”为核心的建模方案是否代表终极答案,不宜过早下结论,但其思路值得深入剖析。

SZSDQJC的博客 2635

2026爬虫反爬终极对抗:AST解混淆+算法还原+Python复现全流程实战

本文分享了破解JS加密参数的完整流程,重点介绍AST解混淆和算法还原方法。针对电商网站常见的混淆手段(变量名混淆、控制流平坦化、字符串加密等),作者提出一套高效解决方案:通过AST解析还原可读代码,结合Chrome断点调试定位加密函数,最后用Python精准复现加密逻辑。文章包含具体的代码实现,如字符串数组还原的AST操作示例,并详细说明了从样本采集到验证测试的全流程。该方法已成功应用于10多个网站,将破解时间从一周缩短至一天,为处理JS加密参数提供了可复用的技术方案。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1523

Android OpenGL入门示例:绘制三角形和正方形 (附完整源码)

Android上对OpenGl的支持是无缝的,所以才有众多3D效果如此逼真的游戏,在Camera的一些流程中也有用到GLSurfaceView的情况。本文记录OpenGL在Android上的入门级示例,绘制一个三角形和正方形。尽管功能简单,可以我捣腾了好几个晚上,大量网上文章上的代码都有点问题,不是绘制不出来就是挂了。第一个文件:MainActivity.javapackage com.examp

yanzi1225627的专栏 1万+

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

丨汀、的博客 5420

android opengl es bitmap,【翻译】安卓 opengl ES教程之六——纹理

在上一篇教程中,我们主要讨论了网格,以及如何在网格中添加颜色。实际上向网格添加颜色的更普遍的做法是使用纹理。向网格添加纹理是与添加颜色有些不同的,接下来,我将展示这些操作,并解释一些基本知识。载入Bitmap第一步,载入用于生成纹理的Bitmap。你可以通过下载,生成或者从resources中加载一张图片。我这里是用的最简单的方式——从resources中直接加载一张图片。Bitmapbitma...

weixin_39742392的博客 621

Cyclone DDS背景技术

DDSI标准与DDS 1.2和1.4标准密切相关,DDSI中的实体与DCPS中的实体之间有明确的对应关系。但是,这种对应关系不是一一对应的。 此处,仅仅对DDSI规范的概念进行描述,暂不涉及Eclipse Cyclone DDS实现的细节。DDSI规范的概念将帮助对互操作性interoperability感兴趣的技术人员了解规范的外延边界和Eclipse Cyclone DDS实现的开始。

pony12的专栏 948

C++设计模式之观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统,当一个对象(称为“主题”或“发布者”)改变状态时,所有注册的观察者都会收到通知。

每天进步一点点。 600

安卓进阶——OpenGL ES

本文系统介绍了OpenGL在2D和3D图形开发中的应用。2D部分重点阐述了OpenGL ES在Android平台的高性能优势、核心渲染管线(顶点处理、纹理映射、着色器编程)以及实现流程,包括GLSurfaceView配置和Renderer实现。3D部分深入讲解了坐标系转换、矩阵变换(MVP矩阵)、深度测试、光照模型等关键技术,并提供了3D场景渲染的实现框架。文章不仅覆盖了基础绘制方法,还介绍了纹理滤镜、粒子系统、帧缓冲等进阶技巧,为移动端图形开发提供了全面指导。通过系统学习这些内容,开发者可以实现...

Meteors.的博客 981

【Windows Server 2019】邮件服务器配置与管理——安装及配置Winmail服务器(上)

博文介绍了如何安装邮件服务器 Winmail,如何配置Winmail,包括运行服务器,Winmail管理工具介绍和域名配置。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 2万+

安卓OpenGL ES——透视投影

OpenGL ES 透视投影

Zach_z的博客 2289

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android opengl版本,Android OpenGL ES(一)开发入门

早就听过大名鼎鼎的 OpenGL,却迟迟没有实践学习,有些惭愧。今天开始通过实践+博文方式学习掌握 OpenGL。此文对于 OpenGL 的学习分为以下部分:OpenGL 基础概念OpenGL 坐标系理解OpenGL 渲染管线OpenGL 着色语言OpenGL 基础概念OpenGLOpenGL 即 Open Graphics Library,是一个功能强大、调用方便的底层图形库,它定义了跨编程语言...

weixin_36479263的博客 3860

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android NDK opengl ES

<br />Android NDK opengl ES<br />Android 2010-05-24 08:49:25 阅读272 评论0  字号:大中小 订阅作者: 刘鹏日期: 2010-02-08本文详细介绍了如何利用 Anroid NDK 开发 native OpenGL ES程序。NDK 简介<br />Android SDK 提供了一套 OpenGL ES 接口,该接口是基于 Java 的,速度非常慢,往往很难满足需要。<br />NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动

kevin373的专栏 1489

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 特效相机实现,安卓特效相机(三) OpenGL ES 特效渲染

系列文章:特效的实现原理接下来这篇文章我们讲下特效的具体实现原理。由于预览画面的渲染是将Surface传给CameraDevice由它去绘制的,而且我没有找到什么可以接管或者添加渲染效果的接口,所以并不能直接去处理摄像头的画面。于是这里我们只能用一种游戏中常用的手段去处理,这种手段的名字叫做RTT(render to texture),中文名叫做渲染到纹理。玩法是先将我们想要处理的画面,不直接绘制...

weixin_35182280的博客 958

android view 初始化,【翻译】安卓opengl ES教程之一——初始化view

我将会写一个系列的关于安卓opengl ES的教程。对于不同的设备,opengl的原理是相通的,所以你能够很容易的移植到其他平台。我不可能记清我具体从哪里获取的这些详细信息,所以有时候我可能不能给出足够正确的引用文献。如果你认为我引用了你的文章却没有加入到引用文献中,你可以给我发邮件通知我更正。在这个样例代码中,为每个章节,我有两个不同的链接,一个是链接到安卓官方开发文档,另一个是opengl E...

weixin_34079307的博客 465

Android和OpenGL es讲解

Android和OpenGL es讲解 文章目录Android和OpenGL es讲解前言 前言 为了学习AndroidGUI之Surfaceflinger做铺垫,由于GUI贯通了GUI系列的很多知识,由于GUI系统是基于OpenGL/EGL实现的,所以为了做到事半功倍,进而先学习它。 ...

Super627890115的博客 1022

Android OpenGL ES 简明开发教程小结- Android OpenGL ES 简明开发教程二:构造OpenGL ES View

http://www.guidebee.info/wordpress/archives/1508 在Andorid平台上构造一个OpenGL View非常简单,主要有两方面的工作: GLSurfaceView Android平台提供的OpenGL ES API主要定义在包android.opengl ,javax.microedition.khronos.egl ,javax.micr...

u010029439的博客 146
上一篇: 初探Symbian
下一篇: android opengl es 三角形、正方形自动旋转
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值